Name: series-workflow9zqhf Phase: Succeeded StartedAt: 2026-08-04 19:35:31 +0000 UTC FinishedAt: 2026-08-04 23:33:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[0] Phase: Succeeded StartedAt: 2026-08-04 19:35:31 +0000 UTC FinishedAt: 2026-08-04 19:44:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[0].run-triage Phase: Succeeded StartedAt: 2026-08-04 19:35:31 +0000 UTC FinishedAt: 2026-08-04 19:44:09 +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": "486855239e38a91d3eae26618ccb7845c1764625", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "USERFAULTFD" ], "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": "486855239e38a91d3eae26618ccb7845c1764625", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "USERFAULTFD" ], "series_id": "3c0821a2-e26d-49ef-bfe5-3d086429ffc1" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "madvise_collapse" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjM4PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+NG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O1VTRVJGQVVMVEZEJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bWFkdmlzZV9jb2xsYXBzZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgUFRFIGNoZWNraW5nIGxvZ2ljIGZvciBUSFAgY29sbGFwc2UgaW50byBhIG5ldyBoZWxwZXIgZnVuY3Rpb24gY29sbGFwc2VfY2hlY2tfcHRlKCkuIEl0IGFsc28gbW9kaWZpZXMgdGhlIGJlaGF2aW9yIHdoZW4gYSBub24tYW5vbnltb3VzIGZvbGlvIGlzIGVuY291bnRlcmVkIGluIGFuIGFub255bW91cyBWTUEsIGNoYW5naW5nIGEgVk1fQlVHX09OX0ZPTElPIHRvIGEgVk1fV0FSTl9PTl9GT0xJTyBhbmQgcmV0dXJuaW5nIGFuIGVycm9yLiBGdXp6aW5nIG1hZHZpc2UoTUFEVl9DT0xMQVBTRSkgYW5kIGtodWdlcGFnZWQgY2FuIGhlbHAgdmVyaWZ5IHRoYXQgdGhpcyByZWZhY3RvcmluZyBkb2VzbiYjMzk7dCBpbnRyb2R1Y2Ugc3VidGxlIHJlZ3Jlc3Npb25zIGluIFBURSBzY2FubmluZyBvciB1bmluaXRpYWxpemVkIHZhcmlhYmxlIHVzYWdlLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjM4PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgNTc4YTRkYTYwODNjNTU1MmMyNmYyYTcwZmVkOGFlOWI5YTM0OWY0MFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgQXVnIDQgMTk6Mzg6NTcgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XG5pbmRleCAxNmYzNzEzNWVkODBkLi5iMTg3ZDYxODQ1MmY0IDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XG4mIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3RcbkBAIC0yMjQsNyAmIzQzOzIyNCw3IEBAIGtodWdlcGFnZWQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgd2hlbiBhbnkgVEhQIHNpemUgaXMgZW5hYmxlZFxuIChlaXRoZXIgb2YgdGhlIHBlci1zaXplIGFub24gY29udHJvbCBvciB0aGUgdG9wLWxldmVsIGNvbnRyb2wgYXJlIHNldFxuIHRvIFwmIzM0O2Fsd2F5c1wmIzM0OyBvciBcJiMzNDttYWR2aXNlXCYjMzQ7KSwgYW5kIGl0JiMzOTtsbCBiZSBhdXRvbWF0aWNhbGx5IHNodXRkb3duIHdoZW5cbiBhbGwgVEhQIHNpemVzIGFyZSBkaXNhYmxlZCAod2hlbiBib3RoIHRoZSBwZXItc2l6ZSBhbm9uIGNvbnRyb2wgYW5kIHRoZVxuLXRvcC1sZXZlbCBjb250cm9sIGFyZSBcJiMzNDtuZXZlclwmIzM0OylcbiYjNDM7dG9wLWxldmVsIGNvbnRyb2wgYXJlIFwmIzM0O25ldmVyXCYjMzQ7KS5cbiBcbiBwcm9jZXNzIFRIUCBjb250cm9sc1xuIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG5AQCAtMzAxLDcgJiM0MzszMDEsOSBAQCBiZWluZyByZXBsYWNlZCBieSBhIFBNRCBtYXBwaW5nLCBvciAoMikgcGh5c2ljYWwgcGFnZXMgcmVwbGFjZWQgYnkgb25lXG4gaHVnZXBhZ2Ugb2YgdmFyaW91cyBzaXplcyAoUE1ELXNpemVkIG9yIG1USFApLiBFYWNoIG1heSBoYXBwZW4gaW5kZXBlbmRlbnRseSxcbiBvciB0b2dldGhlciwgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIG1lbW9yeSBhbmQgdGhlIGZhaWx1cmVzIHRoYXQgb2NjdXIuXG4gQXMgc3VjaCwgdGhpcyB2YWx1ZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgcm91Z2hseSBhcyBhIHNpZ24gb2YgcHJvZ3Jlc3MsXG4tYW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZyk6OlxuJiM0MzthbmQgY291bnRlcnMgaW4gL3Byb2Mvdm1zdGF0IGNvbnN1bHRlZCBmb3IgbW9yZSBhY2N1cmF0ZSBhY2NvdW50aW5nLlxuJiM0MztQZXItb3JkZXIgbVRIUCBjb2xsYXBzZSBzdGF0aXN0aWNzIGFyZSBhbHNvIGF2YWlsYWJsZSB1bmRlclxuJiM0Mzsvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9odWdlcGFnZXMtXHUwMDNjc2l6ZVx1MDAzZWtCL3N0YXRzLyk6OlxuIFxuIFx0L3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2Uva2h1Z2VwYWdlZC9wYWdlc19jb2xsYXBzZWRcbiBcbmRpZmYgLS1naXQgYS9tbS9raHVnZXBhZ2VkLmMgYi9tbS9raHVnZXBhZ2VkLmNcbmluZGV4IGIyMzdmNmU3NjYyYTUuLjMzMzhlOWRjMTFkZDAgMTAwNjQ0XG4tLS0gYS9tbS9raHVnZXBhZ2VkLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL2todWdlcGFnZWQuY1xuQEAgLTY1LDYgJiM0Mzs2NSwxMiBAQCBlbnVtIHNjYW5fcmVzdWx0IHtcbiBcdFNDQU5fUEFHRV9ESVJUWV9PUl9XUklURUJBQ0ssXG4gfTtcbiBcbiYjNDM7ZW51bSBwdGVfY2hlY2tfcmVzdWx0IHtcbiYjNDM7XHRQVEVfQ0hFQ0tfU1VDQ0VFRCxcbiYjNDM7XHRQVEVfQ0hFQ0tfRkFJTCxcbiYjNDM7XHRQVEVfQ0hFQ0tfQ09OVElOVUUsXG4mIzQzO307XG4mIzQzO1xuICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UU1xuICNpbmNsdWRlIFx1MDAzY3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oXHUwMDNlXG4gXG5AQCAtMTE5LDYgJiM0MzsxMjUsMjAgQEAgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wge1xuIFx0REVDTEFSRV9CSVRNQVAobXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpO1xuIH07XG4gXG4mIzQzO3N0cnVjdCBwdGVfY2hlY2tfY29udGV4dCB7XG4mIzQzO1x0c3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjO1xuJiM0MztcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hO1xuJiM0MztcdHVuc2lnbmVkIGludCBvcmRlcjtcbiYjNDM7XHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuJiM0MztcdGludCBub25lX29yX3plcm87XG4mIzQzO1x0aW50IHNoYXJlZDtcbiYjNDM7XHRpbnQgdW5tYXBwZWQ7XG4mIzQzO1x0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQ7XG4mIzQzO1x0dW5zaWduZWQgaW50IG1heF9wdGVzX25vbmU7XG4mIzQzO1x0dW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXA7XG4mIzQzO1x0dW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZDtcbiYjNDM7fTtcbiYjNDM7XG4gLyoqXG4gICogc3RydWN0IGtodWdlcGFnZWRfc2NhbiAtIGN1cnNvciBmb3Igc2Nhbm5pbmdcbiAgKiBAbW1faGVhZDogdGhlIGhlYWQgb2YgdGhlIG1tIGxpc3QgdG8gc2NhblxuQEAgLTYyMCw3ICYjNDM7NjQwLDcgQEAgdm9pZCBfX2todWdlcGFnZWRfZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiBcdFx0LypcbiBcdFx0ICogVGhpcyBpcyByZXF1aXJlZCB0byBzZXJpYWxpemUgYWdhaW5zdFxuIFx0XHQgKiBjb2xsYXBzZV90ZXN0X2V4aXQoKSAod2hpY2ggaXMgZ3VhcmFudGVlZCB0byBydW5cbi1cdFx0ICogdW5kZXIgbW1hcCBzZW0gcmVhZCBtb2RlKS4gU3RvcCBoZXJlIChhZnRlciB3ZSByZXR1cm4gYWxsXG4mIzQzO1x0XHQgKiB1bmRlciBtbWFwX2xvY2sgcmVhZCBtb2RlKS4gU3RvcCBoZXJlIChhZnRlciB3ZSByZXR1cm4gYWxsXG4gXHRcdCAqIHBhZ2V0YWJsZXMgd2lsbCBiZSBkZXN0cm95ZWQpIHVudGlsIGtodWdlcGFnZWQgaGFzIGZpbmlzaGVkXG4gXHRcdCAqIHdvcmtpbmcgb24gdGhlIHBhZ2V0YWJsZXMgdW5kZXIgdGhlIG1tYXBfbG9jay5cbiBcdFx0ICovXG5AQCAtNjI5LDYgJiM0Mzs2NDksMTMgQEAgdm9pZCBfX2todWdlcGFnZWRfZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiBcdH1cbiB9XG4gXG4mIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYylcbiYjNDM7e1xuJiM0MztcdG1lbXNldChjYy1cdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cdTAwM2Vub2RlX2xvYWQpKTtcbiYjNDM7XHRub2Rlc19jbGVhcihjYy1cdTAwM2VhbGxvY19ubWFzayk7XG4mIzQzO1x0Yml0bWFwX3plcm8oY2MtXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyB2b2lkIHJlbGVhc2VfcHRlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuIFx0bm9kZV9zdGF0X21vZF9mb2xpbyhmb2xpbyxcbkBAIC02NjUsNzYgJiM0Mzs2OTIsMTU2IEBAIHN0YXRpYyB2b2lkIHJlbGVhc2VfcHRlX3BhZ2VzKHB0ZV90ICpwdGUsIHB0ZV90ICpfcHRlLFxuIFx0fVxuIH1cbiBcbiYjNDM7LypcbiYjNDM7ICogcHRlX2lzX3JlZmVyZW5jZWQoKSAtIENoZWNrIGZvciBlbm91Z2ggcmVmZXJlbmNlZCBQVEVzIHRvIGp1c3RpZnkgY29sbGFwc2luZ1xuJiM0MzsgKlxuJiM0MzsgKiBJZiBjb2xsYXBzZSB3YXMgaW5pdGlhdGVkIGJ5IGtodWdlcGFnZWQsIGNoZWNrIHRoYXQgdGhlIHBhZ2UgaGFzIGJlZW5cbiYjNDM7ICogcmVjZW50bHkgYWNjZXNzZWQgKHlvdW5nIHB0ZSkgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IHRydWUgaWYgdGhlIHBhZ2UgaGFzIGJlZW4gcmVjZW50bHkgYWNjZXNzZWQuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgcHRlX2lzX3JlZmVyZW5jZWQoc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLCBwdGVfdCBwdGV2YWwsXG4mIzQzO1x0c3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcilcbiYjNDM7e1xuJiM0MztcdHJldHVybiBjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcbiYjNDM7XHRcdGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHxcbiYjNDM7XHRcdG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS1cdTAwM2V2bV9tbSwgYWRkcikpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjb3VudF9jb2xsYXBzZV9ldmVudCh1bnNpZ25lZCBpbnQgb3JkZXIsIGVudW0gdm1fZXZlbnRfaXRlbSB2bV9ldmVudCxcbiYjNDM7XHRcdGVudW0gbXRocF9zdGF0X2l0ZW0gbXRocF9ldmVudClcbiYjNDM7e1xuJiM0MztcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuJiM0MztcdFx0Y291bnRfdm1fZXZlbnQodm1fZXZlbnQpO1xuJiM0MztcdGNvdW50X210aHBfc3RhdChvcmRlciwgbXRocF9ldmVudCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIHB0ZV9jaGVja19mYWlsKCkgLSBBIHNpbXBsZSBoZWxwZXIgdG8gc2V0IHRoZSBwdGVfY2hlY2tfY29udGV4dCByZXN1bHQgYW5kXG4mIzQzOyAqIHJldHVybiBQVEVfQ0hFQ0tfRkFJTC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrX2ZhaWwoc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgsXG4mIzQzO1x0XHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdClcbiYjNDM7e1xuJiM0MztcdGN0eC1cdTAwM2VyZXN1bHQgPSByZXN1bHQ7XG4mIzQzO1x0cmV0dXJuIFBURV9DSEVDS19GQUlMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBjb2xsYXBzZV9jaGVja19wdGUoKSAtIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZVxuJiM0MzsgKlxuJiM0MzsgKiBDaGVjayBpZiBhIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2UgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjcml0ZXJpYTpcbiYjNDM7ICogLSBtYXhfcHRlXyogdmFsdWVzIGFyZSBub3QgZXhjZWVkZWRcbiYjNDM7ICogLSB1ZmZkIGlzIG5vdCBhY3RpdmVcbiYjNDM7ICogLSBsYXp5ZnJlZSBwcm9wZXJ0aWVzIGFyZSBub3QgcHJlc2VudFxuJiM0MzsgKiAtIG9ubHkgYW5vbnltb3VzIHBhZ2VzIGFyZSBwcmVzZW50XG4mIzQzOyAqXG4mIzQzOyAqIGEgaGVscGVyIHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBpcyB1c2VkIHRvIHBhc3MgYW5kIHN0b3JlIHJlbGV2YW50XG4mIzQzOyAqIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIGNvbGxhcHNlX2NoZWNrX3B0ZSgpIGZ1bmN0aW9uIGFuZCB0aGUgY2FsbGVyLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IFBURV9DSEVDS19TVUNDRUVEIGlmIHRoZSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlLFxuJiM0MzsgKiAgICAgICAgIFBURV9DSEVDS19GQUlMIGlmIHRoZSBQVEUgaXMgbm90IHN1aXRhYmxlIGZvciBjb2xsYXBzZSxcbiYjNDM7ICogICAgICAgICBQVEVfQ0hFQ0tfQ09OVElOVUUgaWYgdGhlIHNjYW4gc2hvdWxkIGNvbnRpbnVlIHRvIGNoZWNrIHRoZSBuZXh0IFBURS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7XG4mIzQzO1x0XHRpZiAoJiM0MzsmIzQzO2N0eC1cdTAwM2Vub25lX29yX3plcm8gXHUwMDNlIGN0eC1cdTAwM2VtYXhfcHRlc19ub25lKSB7XG4mIzQzO1x0XHRcdGNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC1cdTAwM2VvcmRlciwgVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFLFxuJiM0MztcdFx0XHRcdFx0ICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xuJiM0MztcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9OT05FX1BURSk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcbiYjNDM7XHRcdGlmIChjdHgtXHUwMDNldW5tYXBwZWQgPT0gLTEpXG4mIzQzO1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX05PTl9QUkVTRU5UKTtcbiYjNDM7XHRcdGlmICgmIzQzOyYjNDM7Y3R4LVx1MDAzZXVubWFwcGVkIFx1MDAzZSBjdHgtXHUwMDNlbWF4X3B0ZXNfc3dhcCkge1xuJiM0MztcdFx0XHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTtcbiYjNDM7XHRcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfU1dBUF9QVEUpO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKHB0ZV9zd3BfdWZmZF9hbnkocHRldmFsKSlcbiYjNDM7XHRcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfVUZGRCk7XG4mIzQzO1x0XHRyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFO1xuJiM0MztcdH1cbiYjNDM7XHQvKlxuJiM0MztcdCAqIERvbiYjMzk7dCBjb2xsYXBzZSBpZiBhbnkgb2YgdGhlIHNtYWxsIFBURXMgYXJlIGFybWVkIHdpdGggdWZmZFxuJiM0MztcdCAqIHdyaXRlIHByb3RlY3Rpb24uIE1hcmtpbmcgdGhlIG5ldyBodWdlIHBtZCBhcyB3cml0ZSBwcm90ZWN0ZWRcbiYjNDM7XHQgKiBjb3VsZCBicmluZyB1c2VyZmF1bHQgbWVzc2FnZXMgdGhhdCBmYWxsIG91dHNpZGUgb2YgdGhlXG4mIzQzO1x0ICogcmVnaXN0ZXJlZCByYW5nZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAocHRlX3VmZmQocHRldmFsKSlcbiYjNDM7XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xuJiM0MztcbiYjNDM7XHRjdHgtXHUwMDNlZm9saW8gPSB2bV9ub3JtYWxfZm9saW8oY3R4LVx1MDAzZXZtYSwgYWRkciwgcHRldmFsKTtcbiYjNDM7XHRpZiAodW5saWtlbHkoIWN0eC1cdTAwM2Vmb2xpbykgfHwgdW5saWtlbHkoZm9saW9faXNfem9uZV9kZXZpY2UoY3R4LVx1MDAzZWZvbGlvKSkpXG4mIzQzO1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfTlVMTCk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogSWYgdGhlIHZtYSBoYXMgdGhlIFZNX0RST1BQQUJMRSBmbGFnLCB0aGUgY29sbGFwc2Ugd2lsbFxuJiM0MztcdCAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoY3R4LVx1MDAzZWNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2ICEoY3R4LVx1MDAzZXZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fRFJPUFBBQkxFKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShjdHgtXHUwMDNlZm9saW8pIFx1MDAyNlx1MDAyNiAhcHRlX2RpcnR5KHB0ZXZhbCkpXG4mIzQzO1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfTEFaWUZSRUUpO1xuJiM0MztcbiYjNDM7XHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihjdHgtXHUwMDNlZm9saW8pKSB7XG4mIzQzO1x0XHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oY3R4LVx1MDAzZWZvbGlvKSwgY3R4LVx1MDAzZWZvbGlvKTtcbiYjNDM7XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9BTk9OKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGN0eC1cdTAwM2Vmb2xpbykpIHtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBUT0RPOiBTdXBwb3J0IHNoYXJlZCBwYWdlcyB3aXRob3V0IGxlYWRpbmcgdG8gZnVydGhlclxuJiM0MztcdFx0ICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhXG4mIzQzO1x0XHQgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhXG4mIzQzO1x0XHQgKiByZXNjYW4gb2YgdGhlIHNhbWUgcmFuZ2UuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGlmICgmIzQzOyYjNDM7Y3R4LVx1MDAzZXNoYXJlZCBcdTAwM2UgY3R4LVx1MDAzZW1heF9wdGVzX3NoYXJlZCkge1xuJiM0MztcdFx0XHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFLFxuJiM0MztcdFx0XHRcdFx0ICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7XG4mIzQzO1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIFBURV9DSEVDS19TVUNDRUVEO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgcHRlX3QgKnB0ZSwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLFxuIFx0XHR1bnNpZ25lZCBpbnQgb3JkZXIsIHN0cnVjdCBsaXN0X2hlYWQgKmNvbXBvdW5kX3BhZ2VsaXN0KVxuIHtcbi1cdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBvcmRlcik7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBvcmRlcik7XG4gXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbi1cdHN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDtcbiBcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMO1xuIFx0dW5zaWduZWQgbG9uZyBhZGRyID0gc3RhcnRfYWRkcjtcbi1cdHB0ZV90ICpfcHRlO1xuLVx0aW50IG5vbmVfb3JfemVybyA9IDAsIHNoYXJlZCA9IDAsIHJlZmVyZW5jZWQgPSAwO1xuJiM0MztcdHB0ZV90ICpfcHRlLCBwdGV2YWw7XG4mIzQzO1x0aW50IHJlZmVyZW5jZWQgPSAwO1xuIFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7XG4mIzQzO1x0ZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVjaztcbiYjNDM7XHRzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0ge1xuJiM0MztcdFx0LmNjID0gY2MsXG4mIzQzO1x0XHQudm1hID0gdm1hLFxuJiM0MztcdFx0Lm9yZGVyID0gb3JkZXIsXG4mIzQzO1x0XHQudW5tYXBwZWQgPSAtMSwgLyogZG9uJiMzOTt0IGNoZWNrIHN3YXAgUFRFcyAqL1xuJiM0MztcdFx0Lm1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKSxcbiYjNDM7XHRcdC5tYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIG9yZGVyKSxcbiYjNDM7XHR9O1xuIFxuIFx0Zm9yIChfcHRlID0gcHRlOyBfcHRlIFx1MDAzYyBwdGUgJiM0MzsgbnJfcGFnZXM7XG4gXHQgICAgIF9wdGUmIzQzOyYjNDM7LCBhZGRyICYjNDM7PSBQQUdFX1NJWkUpIHtcbi1cdFx0cHRlX3QgcHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7XG4tXHRcdGlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHtcbi1cdFx0XHRpZiAoJiM0MzsmIzQzO25vbmVfb3JfemVybyBcdTAwM2UgbWF4X3B0ZXNfbm9uZSkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfTk9ORV9QVEU7XG4tXHRcdFx0XHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcbi1cdFx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTtcbi1cdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdH1cbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9OT05fUFJFU0VOVDtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVx0XHRpZiAocHRlX3VmZmQocHRldmFsKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0cGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRldmFsKTtcbi1cdFx0aWYgKHVubGlrZWx5KCFwYWdlKSB8fCB1bmxpa2VseShpc196b25lX2RldmljZV9wYWdlKHBhZ2UpKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbi1cdFx0Vk1fQlVHX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcbi1cdFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxuLVx0XHQgKi9cbi1cdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2ICEodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9EUk9QUEFCTEUpIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgXHUwMDI2XHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTtcbiYjNDM7XHRcdHB0ZXZhbCA9IHB0ZXBfZ2V0KF9wdGUpO1xuJiM0MztcdFx0cHRlX2NoZWNrID0gY29sbGFwc2VfY2hlY2tfcHRlKHB0ZXZhbCwgYWRkciwgXHUwMDI2Y3R4KTtcbiYjNDM7XHRcdGZvbGlvID0gY3R4LmZvbGlvO1xuJiM0MztcdFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkge1xuJiM0MztcdFx0XHRyZXN1bHQgPSBjdHgucmVzdWx0O1xuIFx0XHRcdGdvdG8gb3V0O1xuIFx0XHR9XG4mIzQzO1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4gXG4tXHRcdC8qIFNlZSBjb2xsYXBzZV9zY2FuX3BtZCgpLiAqL1xuLVx0XHRpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChmb2xpbykpIHtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFRPRE86IFN1cHBvcnQgc2hhcmVkIHBhZ2VzIHdpdGhvdXQgbGVhZGluZyB0byBmdXJ0aGVyXG4tXHRcdFx0ICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhXG4tXHRcdFx0ICogc2hhcmVkIG1heSBjYXVzZSBhIGZ1dHVyZSBoaWdoZXIgb3JkZXIgY29sbGFwc2Ugb24gYVxuLVx0XHRcdCAqIHJlc2NhbiBvZiB0aGUgc2FtZSByYW5nZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAoJiM0MzsmIzQzO3NoYXJlZCBcdTAwM2UgbWF4X3B0ZXNfc2hhcmVkKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFO1xuLVx0XHRcdFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xuLVx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0fVxuLVx0XHR9XG4gXHRcdC8qXG4gXHRcdCAqIFRPRE86IEluIHNvbWUgY2FzZXMgb2YgcGFydGlhbGx5LW1hcHBlZCBmb2xpb3MsIHdlJiMzOTtkIGFjdHVhbGx5XG4gXHRcdCAqIHdhbnQgdG8gY29sbGFwc2UuXG5AQCAtNzU5LDggJiM0Mzs4NjYsOCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFxuIFx0XHQvKlxuIFx0XHQgKiBXZSBjYW4gZG8gaXQgYmVmb3JlIGZvbGlvX2lzb2xhdGVfbHJ1IGJlY2F1c2UgdGhlXG4tXHRcdCAqIGZvbGlvIGNhbiYjMzk7dCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBQR19sb2NrXG4tXHRcdCAqIGlzIG5lZWRlZCB0byBzZXJpYWxpemUgYWdhaW5zdCBzcGxpdF9odWdlX3BhZ2VcbiYjNDM7XHRcdCAqIGZvbGlvIGNhbiYjMzk7dCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBmb2xpbyBsb2NrXG4mIzQzO1x0XHQgKiBpcyBuZWVkZWQgdG8gc2VyaWFsaXplIGFnYWluc3Qgc3BsaXRfaHVnZV9wYWdlKClcbiBcdFx0ICogd2hlbiBpbnZva2VkIGZyb20gdGhlIFZNLlxuIFx0XHQgKi9cbiBcdFx0aWYgKCFmb2xpb190cnlsb2NrKGZvbGlvKSkge1xuQEAgLTc4Niw3ICYjNDM7ODkzLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0fVxuIFxuIFx0XHQvKlxuLVx0XHQgKiBJc29sYXRlIHRoZSBwYWdlIHRvIGF2b2lkIGNvbGxhcHNpbmcgYW4gaHVnZXBhZ2VcbiYjNDM7XHRcdCAqIElzb2xhdGUgdGhlIGZvbGlvIHRvIGF2b2lkIGNvbGxhcHNpbmcgYSBodWdlcGFnZVxuIFx0XHQgKiBjdXJyZW50bHkgaW4gdXNlIGJ5IHRoZSBWTS5cbiBcdFx0ICovXG4gXHRcdGlmICghZm9saW9faXNvbGF0ZV9scnUoZm9saW8pKSB7XG5AQCAtODAzLDE0ICYjNDM7OTEwLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuIFx0XHRcdGxpc3RfYWRkX3RhaWwoXHUwMDI2Zm9saW8tXHUwMDNlbHJ1LCBjb21wb3VuZF9wYWdlbGlzdCk7XG4gbmV4dDpcbi1cdFx0Lypcbi1cdFx0ICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZXJlIGlzXG4tXHRcdCAqIGVub3VnaCB5b3VuZyBwdGUgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlXG4tXHRcdCAqL1xuLVx0XHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fFxuLVx0XHQgICAgIGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHxcbi1cdFx0ICAgICBtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtXHUwMDNldm1fbW0sIGFkZHIpKSlcbiYjNDM7XHRcdGlmIChwdGVfaXNfcmVmZXJlbmNlZChjYywgcHRldmFsLCBmb2xpbywgdm1hLCBhZGRyKSlcbiBcdFx0XHRyZWZlcmVuY2VkJiM0MzsmIzQzOztcbiBcdH1cbiBcbkBAIC04MTgsMTMgJiM0Mzs5MTgsMTMgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0cmVzdWx0ID0gU0NBTl9MQUNLX1JFRkVSRU5DRURfUEFHRTtcbiBcdH0gZWxzZSB7XG4gXHRcdHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcbi1cdFx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIG5vbmVfb3JfemVybyxcbiYjNDM7XHRcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxuIFx0XHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbiBcdFx0cmV0dXJuIHJlc3VsdDtcbiBcdH1cbiBvdXQ6XG4gXHRyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcbi1cdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sXG4mIzQzO1x0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIGN0eC5ub25lX29yX3plcm8sXG4gXHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbiBcdHJldHVybiByZXN1bHQ7XG4gfVxuQEAgLTkwNCw3ICYjNDM7MTAwNCw3IEBAIHN0YXRpYyB2b2lkIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfZmFpbGVkKHB0ZV90ICpwdGUsXG4gXHQgKiBSZS1lc3RhYmxpc2ggdGhlIFBNRCB0byBwb2ludCB0byB0aGUgb3JpZ2luYWwgcGFnZSB0YWJsZVxuIFx0ICogZW50cnkuIFJlc3RvcmluZyBQTUQgbmVlZHMgdG8gYmUgZG9uZSBwcmlvciB0byByZWxlYXNpbmdcbiBcdCAqIHBhZ2VzLiBTaW5jZSBwYWdlcyBhcmUgc3RpbGwgaXNvbGF0ZWQgYW5kIGxvY2tlZCBoZXJlLFxuLVx0ICogYWNxdWlyaW5nIGFub25fdm1hX2xvY2tfd3JpdGUgaXMgdW5uZWNlc3NhcnkuXG4mIzQzO1x0ICogYWNxdWlyaW5nIGFub25fdm1hX2xvY2tfd3JpdGUoKSBpcyB1bm5lY2Vzc2FyeS5cbiBcdCAqL1xuIFx0cG1kX3B0bCA9IHBtZF9sb2NrKHZtYS1cdTAwM2V2bV9tbSwgcG1kKTtcbiBcdHBtZF9wb3B1bGF0ZSh2bWEtXHUwMDNldm1fbW0sIHBtZCwgcG1kX3BndGFibGUob3JpZ19wbWQpKTtcbkBAIC0xMDc4LDkgJiM0MzsxMTc4LDkgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxcbiBcdFx0cmV0dXJuIFNDQU5fVk1BX0NIRUNLO1xuIFx0LypcbiBcdCAqIEFub24gVk1BIGV4cGVjdGVkLCB0aGUgYWRkcmVzcyBtYXkgYmUgdW5tYXBwZWQgdGhlblxuLVx0ICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYXF1aXJlZCB0aGUgbW1hcF9sb2NrLlxuJiM0MztcdCAqIHJlbWFwcGVkIHRvIGZpbGUgYWZ0ZXIga2h1Z2VwYWdlZCByZWFjcXVpcmVkIHRoZSBtbWFwX2xvY2suXG4gXHQgKlxuLVx0ICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzIG1heSByZXR1cm4gdHJ1ZSBmb3IgcXVhbGlmaWVkIGZpbGVcbiYjNDM7XHQgKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoKSBtYXkgcmV0dXJuIHRydWUgZm9yIHF1YWxpZmllZCBmaWxlXG4gXHQgKiB2bWFzLlxuIFx0ICovXG4gXHRpZiAoZXhwZWN0X2Fub24gXHUwMDI2XHUwMDI2ICghKCp2bWFwKS1cdTAwM2Vhbm9uX3ZtYSB8fCAhdm1hX2lzX2Fub255bW91cygqdm1hcCkpKVxuQEAgLTExMzYsNyAmIzQzOzEyMzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjaGVja19wbWRfc3RpbGxfdmFsaWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXG4gLypcbiAgKiBCcmluZyBtaXNzaW5nIHBhZ2VzIGluIGZyb20gc3dhcCwgdG8gY29tcGxldGUgVEhQIGNvbGxhcHNlLlxuLSAqIE9ubHkgZG9uZSBpZiBraHVnZXBhZ2VkX3NjYW5fcG1kIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXG4mIzQzOyAqIE9ubHkgZG9uZSBpZiBjb2xsYXBzZV9zY2FuX3BtZCgpIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXG4gICpcbiAgKiBGb3IgbVRIUCBvcmRlcnMgdGhlIGZ1bmN0aW9uIGJhaWxzIG9uIHRoZSBmaXJzdCBzd2FwIGVudHJ5LCBiZWNhdXNlXG4gICogZmF1bHRpbmcgcGFnZXMgYmFjayBpbiBkdXJpbmcgY29sbGFwc2UgY291bGQgcmUtcG9wdWxhdGUgUFRFcyB0aGF0XG5AQCAtMTIwNCw3ICYjNDM7MTMwNCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0cHRlID0gTlVMTDtcbiBcbiBcdFx0Lypcbi1cdFx0ICogZG9fc3dhcF9wYWdlIHJldHVybnMgVk1fRkFVTFRfUkVUUlkgd2l0aCByZWxlYXNlZCBtbWFwX2xvY2suXG4mIzQzO1x0XHQgKiBkb19zd2FwX3BhZ2UoKSByZXR1cm5zIFZNX0ZBVUxUX1JFVFJZIHdpdGggcmVsZWFzZWQgbW1hcF9sb2NrLlxuIFx0XHQgKiBOb3RlIHdlIHRyZWF0IFZNX0ZBVUxUX1JFVFJZIGFzIFZNX0ZBVUxUX0VSUk9SIGhlcmUgYmVjYXVzZVxuIFx0XHQgKiB3ZSBkbyBub3QgcmV0cnkgaGVyZSBhbmQgc3dhcCBlbnRyeSB3aWxsIHJlbWFpbiBpbiBwYWdldGFibGVcbiBcdFx0ICogcmVzdWx0aW5nIGluIGxhdGVyIGZhaWx1cmUuXG5AQCAtMTI0NywxNSAmIzQzOzEzNDcsMTIgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnVcbiBcdGZvbGlvID0gX19mb2xpb19hbGxvYyhnZnAsIG9yZGVyLCBub2RlLCBcdTAwMjZjYy1cdTAwM2VhbGxvY19ubWFzayk7XG4gXHRpZiAoIWZvbGlvKSB7XG4gXHRcdCpmb2xpb3AgPSBOVUxMO1xuLVx0XHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcbi1cdFx0XHRjb3VudF92bV9ldmVudChUSFBfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTtcbi1cdFx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTtcbiYjNDM7XHRcdGNvdW50X2NvbGxhcHNlX2V2ZW50KG9yZGVyLCBUSFBfQ09MTEFQU0VfQUxMT0NfRkFJTEVELFxuJiM0MztcdFx0XHRcdCAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7XG4gXHRcdHJldHVybiBTQ0FOX0FMTE9DX0hVR0VfUEFHRV9GQUlMO1xuIFx0fVxuIFxuLVx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQyk7XG4tXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQyk7XG4mIzQzO1x0Y291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQywgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTtcbiBcbiBcdGlmICh1bmxpa2VseShtZW1fY2dyb3VwX2NoYXJnZShmb2xpbywgbW0sIGdmcCkpKSB7XG4gXHRcdGZvbGlvX3B1dChmb2xpbyk7XG5AQCAtMTI3MSw3ICYjNDM7MTM2OCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGFsbG9jX2NoYXJnZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKipmb2xpb3AsIHN0cnVjdCBtbV9zdHJ1XG4gfVxuIFxuIC8qXG4tICogY29sbGFwc2VfaHVnZV9wYWdlIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kXG4mIzQzOyAqIGNvbGxhcHNlX2h1Z2VfcGFnZSgpIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kXG4gICogd2lsbCBhbHdheXMgcmV0dXJuIHdpdGggdGhlIGxvY2sgdW5sb2NrZWQsIHRvIGF2b2lkIGhvbGRpbmcgdGhlIG1tYXBfbG9ja1xuICAqIHdoaWxlIGFsbG9jYXRpbmcgYSBUSFAsIGFzIHRoYXQgY291bGQgdHJpZ2dlciBkaXJlY3QgcmVjbGFpbS9jb21wYWN0aW9uLlxuICAqIE5vdGUgdGhhdCB0aGUgVk1BIG11c3QgYmUgcmVjaGVja2VkIGFmdGVyIGdyYWJiaW5nIHRoZSBtbWFwX2xvY2sgYWdhaW4uXG5AQCAtMTMxOCw3ICYjNDM7MTQxNSw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXG4gXHRpZiAodW5tYXBwZWQpIHtcbiBcdFx0Lypcbi1cdFx0ICogX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluIHdpbGwgcmV0dXJuIHdpdGggbW1hcF9sb2NrXG4mIzQzO1x0XHQgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4oKSB3aWxsIHJldHVybiB3aXRoIG1tYXBfbG9ja1xuIFx0XHQgKiByZWxlYXNlZCB3aGVuIGl0IGZhaWxzLiBTbyB3ZSBqdW1wIG91dF9ub2xvY2sgZGlyZWN0bHkgaW5cbiBcdFx0ICogdGhhdCBjYXNlLiAgQ29udGludWluZyB0byBjb2xsYXBzZSBjYXVzZXMgaW5jb25zaXN0ZW5jeS5cbiBcdFx0ICovXG5AQCAtMTMzMSw4ICYjNDM7MTQyOCw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcbiBcdC8qXG4gXHQgKiBQcmV2ZW50IGFsbCBhY2Nlc3MgdG8gcGFnZXRhYmxlcyB3aXRoIHRoZSBleGNlcHRpb24gb2Zcbi1cdCAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHB0ZXBfY2xlYXJfZmx1c2ggYW5kIHRoZSBWTVxuLVx0ICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayAmIzQzOyBQR19sb2NrLlxuJiM0MztcdCAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHBtZHBfY29sbGFwc2VfZmx1c2goKSBhbmQgdGhlIFZNXG4mIzQzO1x0ICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayAmIzQzOyBmb2xpbyBsb2NrLlxuIFx0ICpcbiBcdCAqIFVGRkRJT19NT1ZFIGlzIHByZXZlbnRlZCB0byByYWNlIGFzIHdlbGwgdGhhbmtzIHRvIHRoZVxuIFx0ICogbW1hcF9sb2NrLlxuQEAgLTEzODksOSAmIzQzOzE0ODYsOSBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFx0XHRzcGluX2xvY2socG1kX3B0bCk7XG4gXHRcdFZNX1dBUk5fT05fT05DRSghcG1kX25vbmUoKnBtZCkpO1xuIFx0XHQvKlxuLVx0XHQgKiBXZSBjYW4gb25seSB1c2Ugc2V0X3BtZF9hdCB3aGVuIGVzdGFibGlzaGluZ1xuJiM0MztcdFx0ICogV2UgY2FuIG9ubHkgdXNlIHNldF9wbWRfYXQoKSB3aGVuIGVzdGFibGlzaGluZ1xuIFx0XHQgKiBodWdlcG1kcyBhbmQgbmV2ZXIgZm9yIGVzdGFibGlzaGluZyByZWd1bGFyIHBtZHMgdGhhdFxuLVx0XHQgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlIGZvciB0aGF0XG4mIzQzO1x0XHQgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlKCkgZm9yIHRoYXRcbiBcdFx0ICovXG4gXHRcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwbWRfcGd0YWJsZShfcG1kKSk7XG4gXHRcdHNwaW5fdW5sb2NrKHBtZF9wdGwpO1xuQEAgLTE0MzksNyAmIzQzOzE1MzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFx0XHRcdHNwaW5fbG9ja19uZXN0ZWQocHRlX3B0bCwgU0lOR0xFX0RFUFRIX05FU1RJTkcpO1xuIFx0XHRwbWRfcG9wdWxhdGUobW0sIHBtZCwgcG1kX3BndGFibGUoX3BtZCkpO1xuIFx0XHRtYXBfYW5vbl9mb2xpb19wdGVfbm9wZihmb2xpbywgcHRlLCB2bWEsIHN0YXJ0X2FkZHIsXG4tXHRcdFx0XHRcdCAgLyp1ZmZkX3dwPSovIGZhbHNlKTtcbiYjNDM7XHRcdFx0XHRcdCAgLyp1ZmZkPSovIGZhbHNlKTtcbiBcdFx0aWYgKHB0ZV9wdGwgIT0gcG1kX3B0bClcbiBcdFx0XHRzcGluX3VubG9jayhwdGVfcHRsKTtcbiBcdH1cbkBAIC0xNDQ5LDEwICYjNDM7MTU0NiwxMCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFxuIFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xuIG91dF91cF93cml0ZTpcbi1cdGlmIChhbm9uX3ZtYV9sb2NrZWQpXG4tXHRcdGFub25fdm1hX3VubG9ja193cml0ZSh2bWEtXHUwMDNlYW5vbl92bWEpO1xuIFx0aWYgKHB0ZSlcbiBcdFx0cHRlX3VubWFwKHB0ZSk7XG4mIzQzO1x0aWYgKGFub25fdm1hX2xvY2tlZClcbiYjNDM7XHRcdGFub25fdm1hX3VubG9ja193cml0ZSh2bWEtXHUwMDNlYW5vbl92bWEpO1xuIFx0bW1hcF93cml0ZV91bmxvY2sobW0pO1xuIG91dF9ub2xvY2s6XG4gXHRpZiAoZm9saW8pXG5AQCAtMTU5Myw0MiAmIzQzOzE2OTAsNDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsXG4gXHRcdGJvb2wgKmxvY2tfZHJvcHBlZCwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKVxuIHtcbi1cdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIEhQQUdFX1BNRF9PUkRFUik7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc3dhcCA9IGNvbGxhcHNlX21heF9wdGVzX3N3YXAoY2MsIEhQQUdFX1BNRF9PUkRFUik7XG4tXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKTtcbiBcdGVudW0gdHZhX3R5cGUgdHZhX2ZsYWdzID0gY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCA/IFRWQV9LSFVHRVBBR0VEIDogVFZBX0ZPUkNFRF9DT0xMQVBTRTtcbiBcdHBtZF90ICpwbWQ7XG4gXHRwdGVfdCAqcHRlLCAqX3B0ZSwgcHRldmFsO1xuIFx0aW50IGk7XG4tXHRpbnQgbm9uZV9vcl96ZXJvID0gMCwgc2hhcmVkID0gMCwgcmVmZXJlbmNlZCA9IDA7XG4tXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcbi1cdHN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDtcbiBcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMO1xuJiM0MztcdGludCByZWZlcmVuY2VkID0gMDtcbiYjNDM7XHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcbiBcdHVuc2lnbmVkIGxvbmcgYWRkcjtcbiBcdHVuc2lnbmVkIGxvbmcgZW5hYmxlZF9vcmRlcnM7XG4gXHRzcGlubG9ja190ICpwdGw7XG4tXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERSwgdW5tYXBwZWQgPSAwO1xuJiM0MztcdGludCBub2RlID0gTlVNQV9OT19OT0RFO1xuJiM0MztcdGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2s7XG4gXG4gXHRWTV9CVUdfT04oc3RhcnRfYWRkciBcdTAwMjYgfkhQQUdFX1BNRF9NQVNLKTtcbiBcbiYjNDM7XHRzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0ge1xuJiM0MztcdFx0LmNjID0gY2MsXG4mIzQzO1x0XHQudm1hID0gdm1hLFxuJiM0MztcdFx0Lm9yZGVyID0gSFBBR0VfUE1EX09SREVSLFxuJiM0MztcdFx0Lm1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIEhQQUdFX1BNRF9PUkRFUiksXG4mIzQzO1x0XHQubWF4X3B0ZXNfc3dhcCA9IGNvbGxhcHNlX21heF9wdGVzX3N3YXAoY2MsIEhQQUdFX1BNRF9PUkRFUiksXG4mIzQzO1x0XHQubWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBIUEFHRV9QTURfT1JERVIpLFxuJiM0MztcdH07XG4mIzQzO1xuIFx0cmVzdWx0ID0gZmluZF9wbWRfb3JfdGhwX29yX25vbmUobW0sIHN0YXJ0X2FkZHIsIFx1MDAyNnBtZCk7XG4gXHRpZiAocmVzdWx0ICE9IFNDQU5fU1VDQ0VFRCkge1xuIFx0XHRjYy1cdTAwM2Vwcm9ncmVzcyYjNDM7JiM0Mzs7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuLVx0Yml0bWFwX3plcm8oY2MtXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpO1xuLVx0bWVtc2V0KGNjLVx1MDAzZW5vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLVx1MDAzZW5vZGVfbG9hZCkpO1xuLVx0bm9kZXNfY2xlYXIoY2MtXHUwMDNlYWxsb2Nfbm1hc2spO1xuJiM0MztcdGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTtcbiBcbiBcdGVuYWJsZWRfb3JkZXJzID0gY29sbGFwc2VfcG9zc2libGVfb3JkZXJzKHZtYSwgdm1hLVx1MDAzZXZtX2ZsYWdzLCB0dmFfZmxhZ3MpO1xuIFxuIFx0LypcbiBcdCAqIElmIFBNRCBpcyB0aGUgb25seSBlbmFibGVkIG9yZGVyLCBlbmZvcmNlIG1heF9wdGVzX25vbmUsIG90aGVyd2lzZVxuLVx0ICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS5cbiYjNDM7XHQgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLiBUaGUgYml0bWFwXG4mIzQzO1x0ICogaXMgdGhlbiBjaGVja2VkIGFnYWluIGluIG10aHBfY29sbGFwc2UoKSBmb3IgZWFjaCBhdHRlbXB0ZWQgb3JkZXIuXG4gXHQgKi9cbiBcdGlmIChlbmFibGVkX29yZGVycyAhPSBCSVQoSFBBR0VfUE1EX09SREVSKSlcbi1cdFx0bWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7XG4mIzQzO1x0XHRjdHgubWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7XG4gXG4gXHRwdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIHN0YXJ0X2FkZHIsIFx1MDAyNnB0bCk7XG4gXHRpZiAoIXB0ZSkge1xuQEAgLTE2NDQsODQgJiM0MzsxNzQ2LDE0IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIFx0XHRjYy1cdTAwM2Vwcm9ncmVzcyYjNDM7JiM0Mzs7XG4gXG4tXHRcdGlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHtcbi1cdFx0XHRpZiAoJiM0MzsmIzQzO25vbmVfb3JfemVybyBcdTAwM2UgbWF4X3B0ZXNfbm9uZSkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfTk9ORV9QVEU7XG4tXHRcdFx0XHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUpO1xuLVx0XHRcdFx0Y291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUixcbi1cdFx0XHRcdFx0XHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdGlmICghcHRlX3ByZXNlbnQocHRldmFsKSkge1xuLVx0XHRcdGlmICgmIzQzOyYjNDM7dW5tYXBwZWQgXHUwMDNlIG1heF9wdGVzX3N3YXApIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX1NXQVBfUFRFO1xuLVx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NXQVBfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsXG4tXHRcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTtcbi1cdFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHRcdH1cbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEFsd2F5cyBiZSBzdHJpY3Qgd2l0aCB1ZmZkLXdwXG4tXHRcdFx0ICogZW5hYmxlZCBzd2FwIGVudHJpZXMuICBQbGVhc2Ugc2VlXG4tXHRcdFx0ICogY29tbWVudCBiZWxvdyBmb3IgcHRlX3VmZmQoKS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAocHRlX3N3cF91ZmZkX2FueShwdGV2YWwpKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9VRkZEO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdGlmIChwdGVfdWZmZChwdGV2YWwpKSB7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBEb24mIzM5O3QgY29sbGFwc2UgdGhlIHBhZ2UgaWYgYW55IG9mIHRoZSBzbWFsbFxuLVx0XHRcdCAqIFBURXMgYXJlIGFybWVkIHdpdGggdWZmZCB3cml0ZSBwcm90ZWN0aW9uLlxuLVx0XHRcdCAqIEhlcmUgd2UgY2FuIGFsc28gbWFyayB0aGUgbmV3IGh1Z2UgcG1kIGFzXG4tXHRcdFx0ICogd3JpdGUgcHJvdGVjdGVkIGlmIGFueSBvZiB0aGUgc21hbGwgb25lcyBpc1xuLVx0XHRcdCAqIG1hcmtlZCBidXQgdGhhdCBjb3VsZCBicmluZyB1bmtub3duXG4tXHRcdFx0ICogdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbHMgb3V0c2lkZSBvZlxuLVx0XHRcdCAqIHRoZSByZWdpc3RlcmVkIHJhbmdlLiAgU28sIGp1c3QgYmUgc2ltcGxlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XG4tXHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdH1cbi1cbi1cdFx0cGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRldmFsKTtcbi1cdFx0aWYgKHVubGlrZWx5KCFwYWdlKSB8fCB1bmxpa2VseShpc196b25lX2RldmljZV9wYWdlKHBhZ2UpKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMO1xuLVx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHR9XG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICogSWYgdGhlIHZtYSBoYXMgdGhlIFZNX0RST1BQQUJMRSBmbGFnLCB0aGUgY29sbGFwc2Ugd2lsbFxuLVx0XHQgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuXG4tXHRcdCAqL1xuLVx0XHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjYgISh2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpb190ZXN0X2xhenlmcmVlKGZvbGlvKSBcdTAwMjZcdTAwMjYgIXB0ZV9kaXJ0eShwdGV2YWwpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX0xBWllGUkVFO1xuJiM0MztcdFx0cHRlX2NoZWNrID0gY29sbGFwc2VfY2hlY2tfcHRlKHB0ZXZhbCwgYWRkciwgXHUwMDI2Y3R4KTtcbiYjNDM7XHRcdGZvbGlvID0gY3R4LmZvbGlvO1xuJiM0MztcdFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkge1xuJiM0MztcdFx0XHRyZXN1bHQgPSBjdHgucmVzdWx0O1xuIFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuIFx0XHR9XG4tXG4tXHRcdGlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9BTk9OO1xuLVx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHR9XG4tXG4tXHRcdC8qXG4tXHRcdCAqIFdlIHRyZWF0IGEgc2luZ2xlIHBhZ2UgYXMgc2hhcmVkIGlmIGFueSBwYXJ0IG9mIHRoZSBUSFBcbi1cdFx0ICogaXMgc2hhcmVkLlxuLVx0XHQgKi9cbi1cdFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7XG4tXHRcdFx0aWYgKCYjNDM7JiM0MztzaGFyZWQgXHUwMDNlIG1heF9wdGVzX3NoYXJlZCkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfU0hBUkVEX1BURTtcbi1cdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsXG4tXHRcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHR9XG4mIzQzO1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4gXG4gXHRcdC8qIFNldCBiaXQgZm9yIG9jY3VwaWVkIHBhZ2VzICovXG4gXHRcdF9fc2V0X2JpdChpLCBjYy1cdTAwM2VtdGhwX3ByZXNlbnRfcHRlcyk7XG5AQCAtMTc0OSwzMSAmIzQzOzE3ODEsMjEgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdC8qXG4gXHRcdCAqIENoZWNrIGlmIHRoZSBwYWdlIGhhcyBhbnkgR1VQIChvciBvdGhlciBleHRlcm5hbCkgcGlucy5cbiBcdFx0ICpcbi1cdFx0ICogSGVyZSB0aGUgY2hlY2sgbWF5IGJlIHJhY3k6XG4tXHRcdCAqIGl0IG1heSBzZWUgZm9saW9fbWFwY291bnQoKSBcdTAwM2UgZm9saW9fcmVmX2NvdW50KCkuXG4tXHRcdCAqIEJ1dCBzdWNoIGNhc2UgaXMgZXBoZW1lcmFsIHdlIGNvdWxkIGFsd2F5cyByZXRyeSBjb2xsYXBzZVxuLVx0XHQgKiBsYXRlci4gIEhvd2V2ZXIgaXQgbWF5IHJlcG9ydCBmYWxzZSBwb3NpdGl2ZSBpZiB0aGUgcGFnZVxuLVx0XHQgKiBoYXMgZXhjZXNzaXZlIEdVUCBwaW5zIChpLmUuIDUxMikuICBBbnl3YXkgdGhlIHNhbWUgY2hlY2tcbi1cdFx0ICogd2lsbCBiZSBkb25lIGFnYWluIGxhdGVyIHRoZSByaXNrIHNlZW1zIGxvdy5cbiYjNDM7XHRcdCAqIEhlcmUgdGhlIGNoZWNrIGlzIHJhY3ksIGJ1dCBzdWNoIGNhc2UgaXMgZXBoZW1lcmFsIGFuZFxuJiM0MztcdFx0ICogd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlIGxhdGVyLiBBbnl3YXkgdGhlIHNhbWVcbiYjNDM7XHRcdCAqIGNoZWNrIHdpbGwgYmUgZG9uZSBhZ2FpbiBsYXRlciB0aGUgcmlzayBzZWVtcyBsb3cuXG4gXHRcdCAqL1xuIFx0XHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pKSB7XG4gXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX0NPVU5UO1xuIFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuIFx0XHR9XG4gXG4tXHRcdC8qXG4tXHRcdCAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpc1xuLVx0XHQgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZVxuLVx0XHQgKi9cbi1cdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcbi1cdFx0ICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XG4tXHRcdCAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVx1MDAzZXZtX21tLCBhZGRyKSkpXG4mIzQzO1x0XHRpZiAocHRlX2lzX3JlZmVyZW5jZWQoY2MsIHB0ZXZhbCwgZm9saW8sIHZtYSwgYWRkcikpXG4gXHRcdFx0cmVmZXJlbmNlZCYjNDM7JiM0Mzs7XG4gXHR9XG4gXHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjZcbiBcdFx0ICAgKCFyZWZlcmVuY2VkIHx8XG4tXHRcdCAgICAodW5tYXBwZWQgXHUwMDI2XHUwMDI2IHJlZmVyZW5jZWQgXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xuJiM0MztcdFx0ICAgIChjdHgudW5tYXBwZWQgXHUwMDI2XHUwMDI2IHJlZmVyZW5jZWQgXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xuIFx0XHRyZXN1bHQgPSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFO1xuIFx0fSBlbHNlIHtcbiBcdFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xuQEAgLTE3ODEsMTYgJiM0MzsxODAzLDE2IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIG91dF91bm1hcDpcbiBcdHB0ZV91bm1hcF91bmxvY2socHRlLCBwdGwpO1xuIFx0aWYgKHJlc3VsdCA9PSBTQ0FOX1NVQ0NFRUQpIHtcbi1cdFx0LyogY29sbGFwc2VfaHVnZV9wYWdlIGV4cGVjdHMgdGhlIGxvY2sgdG8gYmUgZHJvcHBlZCBiZWZvcmUgY2FsbGluZyAqL1xuJiM0MztcdFx0LyogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovXG4gXHRcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xuIFx0XHRyZXN1bHQgPSBtdGhwX2NvbGxhcHNlKG1tLCBzdGFydF9hZGRyLCByZWZlcmVuY2VkLFxuLVx0XHRcdFx0ICAgICAgIHVubWFwcGVkLCBjYywgZW5hYmxlZF9vcmRlcnMpO1xuJiM0MztcdFx0XHRcdCAgICAgICBjdHgudW5tYXBwZWQsIGNjLCBlbmFibGVkX29yZGVycyk7XG4gXHRcdC8qIG1tYXBfbG9jayB3YXMgcmVsZWFzZWQgYWJvdmUsIHNldCBsb2NrX2Ryb3BwZWQgKi9cbiBcdFx0KmxvY2tfZHJvcHBlZCA9IHRydWU7XG4gXHR9XG4gb3V0OlxuIFx0dHJhY2VfbW1fa2h1Z2VwYWdlZF9zY2FuX3BtZChtbSwgZm9saW8sIHJlZmVyZW5jZWQsXG4tXHRcdFx0XHQgICAgIG5vbmVfb3JfemVybywgcmVzdWx0LCB1bm1hcHBlZCk7XG4mIzQzO1x0XHRcdFx0ICAgICBjdHgubm9uZV9vcl96ZXJvLCByZXN1bHQsIGN0eC51bm1hcHBlZCk7XG4gXHRyZXR1cm4gcmVzdWx0O1xuIH1cbiBcbkBAIC0yNjkxLDggJiM0MzsyNzEzLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIFx0cHJlc2VudCA9IDA7XG4gXHRzd2FwID0gMDtcbi1cdG1lbXNldChjYy1cdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cdTAwM2Vub2RlX2xvYWQpKTtcbi1cdG5vZGVzX2NsZWFyKGNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbiYjNDM7XHRjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7XG4gXHRyY3VfcmVhZF9sb2NrKCk7XG4gXHR4YXNfZm9yX2VhY2goXHUwMDI2eGFzLCBmb2xpbywgc3RhcnQgJiM0MzsgSFBBR0VfUE1EX05SIC0gMSkge1xuIFx0XHRpZiAoeGFzX3JldHJ5KFx1MDAyNnhhcywgZm9saW8pKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjM5PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjRtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtVU0VSRkFVTFRGRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O21hZHZpc2VfY29sbGFwc2UmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIFBURSBjaGVja2luZyBsb2dpYyBmb3IgVEhQIGNvbGxhcHNlIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGNvbGxhcHNlX2NoZWNrX3B0ZSgpLiBJdCBhbHNvIG1vZGlmaWVzIHRoZSBiZWhhdmlvciB3aGVuIGEgbm9uLWFub255bW91cyBmb2xpbyBpcyBlbmNvdW50ZXJlZCBpbiBhbiBhbm9ueW1vdXMgVk1BLCBjaGFuZ2luZyBhIFZNX0JVR19PTl9GT0xJTyB0byBhIFZNX1dBUk5fT05fRk9MSU8gYW5kIHJldHVybmluZyBhbiBlcnJvci4gRnV6emluZyBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpIGFuZCBraHVnZXBhZ2VkIGNhbiBoZWxwIHZlcmlmeSB0aGF0IHRoaXMgcmVmYWN0b3JpbmcgZG9lc24mIzM5O3QgaW50cm9kdWNlIHN1YnRsZSByZWdyZXNzaW9ucyBpbiBQVEUgc2Nhbm5pbmcgb3IgdW5pbml0aWFsaXplZCB2YXJpYWJsZSB1c2FnZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDU3OGE0ZGE2MDgzYzU1NTJjMjZmMmE3MGZlZDhhZTliOWEzNDlmNDAKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVHVlIEF1ZyA0IDE5OjM4OjU3IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0CmluZGV4IDE2ZjM3MTM1ZWQ4MGQuLmIxODdkNjE4NDUyZjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdAomIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3QKQEAgLTIyNCw3ICYjNDM7MjI0LDcgQEAga2h1Z2VwYWdlZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB3aGVuIGFueSBUSFAgc2l6ZSBpcyBlbmFibGVkCiAoZWl0aGVyIG9mIHRoZSBwZXItc2l6ZSBhbm9uIGNvbnRyb2wgb3IgdGhlIHRvcC1sZXZlbCBjb250cm9sIGFyZSBzZXQKIHRvICYjMzQ7YWx3YXlzJiMzNDsgb3IgJiMzNDttYWR2aXNlJiMzNDspLCBhbmQgaXQmIzM5O2xsIGJlIGF1dG9tYXRpY2FsbHkgc2h1dGRvd24gd2hlbgogYWxsIFRIUCBzaXplcyBhcmUgZGlzYWJsZWQgKHdoZW4gYm90aCB0aGUgcGVyLXNpemUgYW5vbiBjb250cm9sIGFuZCB0aGUKLXRvcC1sZXZlbCBjb250cm9sIGFyZSAmIzM0O25ldmVyJiMzNDspCiYjNDM7dG9wLWxldmVsIGNvbnRyb2wgYXJlICYjMzQ7bmV2ZXImIzM0OykuCiAKIHByb2Nlc3MgVEhQIGNvbnRyb2xzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzAxLDcgJiM0MzszMDEsOSBAQCBiZWluZyByZXBsYWNlZCBieSBhIFBNRCBtYXBwaW5nLCBvciAoMikgcGh5c2ljYWwgcGFnZXMgcmVwbGFjZWQgYnkgb25lCiBodWdlcGFnZSBvZiB2YXJpb3VzIHNpemVzIChQTUQtc2l6ZWQgb3IgbVRIUCkuIEVhY2ggbWF5IGhhcHBlbiBpbmRlcGVuZGVudGx5LAogb3IgdG9nZXRoZXIsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBtZW1vcnkgYW5kIHRoZSBmYWlsdXJlcyB0aGF0IG9jY3VyLgogQXMgc3VjaCwgdGhpcyB2YWx1ZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgcm91Z2hseSBhcyBhIHNpZ24gb2YgcHJvZ3Jlc3MsCi1hbmQgY291bnRlcnMgaW4gL3Byb2Mvdm1zdGF0IGNvbnN1bHRlZCBmb3IgbW9yZSBhY2N1cmF0ZSBhY2NvdW50aW5nKTo6CiYjNDM7YW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZy4KJiM0MztQZXItb3JkZXIgbVRIUCBjb2xsYXBzZSBzdGF0aXN0aWNzIGFyZSBhbHNvIGF2YWlsYWJsZSB1bmRlcgomIzQzOy9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2h1Z2VwYWdlcy0mbHQ7c2l6ZSZndDtrQi9zdGF0cy8pOjoKIAogCS9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2todWdlcGFnZWQvcGFnZXNfY29sbGFwc2VkCiAKZGlmZiAtLWdpdCBhL21tL2todWdlcGFnZWQuYyBiL21tL2todWdlcGFnZWQuYwppbmRleCBiMjM3ZjZlNzY2MmE1Li4zMzM4ZTlkYzExZGQwIDEwMDY0NAotLS0gYS9tbS9raHVnZXBhZ2VkLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0va2h1Z2VwYWdlZC5jCkBAIC02NSw2ICYjNDM7NjUsMTIgQEAgZW51bSBzY2FuX3Jlc3VsdCB7CiAJU0NBTl9QQUdFX0RJUlRZX09SX1dSSVRFQkFDSywKIH07CiAKJiM0MztlbnVtIHB0ZV9jaGVja19yZXN1bHQgewomIzQzOwlQVEVfQ0hFQ0tfU1VDQ0VFRCwKJiM0MzsJUFRFX0NIRUNLX0ZBSUwsCiYjNDM7CVBURV9DSEVDS19DT05USU5VRSwKJiM0Mzt9OwomIzQzOwogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSAmbHQ7dHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgmZ3Q7CiAKQEAgLTExOSw2ICYjNDM7MTI1LDIwIEBAIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sIHsKIAlERUNMQVJFX0JJVE1BUChtdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7CiB9OwogCiYjNDM7c3RydWN0IHB0ZV9jaGVja19jb250ZXh0IHsKJiM0MzsJc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjOwomIzQzOwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKJiM0MzsJdW5zaWduZWQgaW50IG9yZGVyOwomIzQzOwlzdHJ1Y3QgZm9saW8gKmZvbGlvOwomIzQzOwlpbnQgbm9uZV9vcl96ZXJvOwomIzQzOwlpbnQgc2hhcmVkOwomIzQzOwlpbnQgdW5tYXBwZWQ7CiYjNDM7CWVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0OwomIzQzOwl1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZTsKJiM0MzsJdW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXA7CiYjNDM7CXVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQ7CiYjNDM7fTsKJiM0MzsKIC8qKgogICogc3RydWN0IGtodWdlcGFnZWRfc2NhbiAtIGN1cnNvciBmb3Igc2Nhbm5pbmcKICAqIEBtbV9oZWFkOiB0aGUgaGVhZCBvZiB0aGUgbW0gbGlzdCB0byBzY2FuCkBAIC02MjAsNyAmIzQzOzY0MCw3IEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiAJCS8qCiAJCSAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gc2VyaWFsaXplIGFnYWluc3QKIAkJICogY29sbGFwc2VfdGVzdF9leGl0KCkgKHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gcnVuCi0JCSAqIHVuZGVyIG1tYXAgc2VtIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbAomIzQzOwkJICogdW5kZXIgbW1hcF9sb2NrIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbAogCQkgKiBwYWdldGFibGVzIHdpbGwgYmUgZGVzdHJveWVkKSB1bnRpbCBraHVnZXBhZ2VkIGhhcyBmaW5pc2hlZAogCQkgKiB3b3JraW5nIG9uIHRoZSBwYWdldGFibGVzIHVuZGVyIHRoZSBtbWFwX2xvY2suCiAJCSAqLwpAQCAtNjI5LDYgJiM0Mzs2NDksMTMgQEAgdm9pZCBfX2todWdlcGFnZWRfZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIAl9CiB9CiAKJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpCiYjNDM7ewomIzQzOwltZW1zZXQoY2MtJmd0O25vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLSZndDtub2RlX2xvYWQpKTsKJiM0MzsJbm9kZXNfY2xlYXIoY2MtJmd0O2FsbG9jX25tYXNrKTsKJiM0MzsJYml0bWFwX3plcm8oY2MtJmd0O210aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKQogewogCW5vZGVfc3RhdF9tb2RfZm9saW8oZm9saW8sCkBAIC02NjUsNzYgJiM0Mzs2OTIsMTU2IEBAIHN0YXRpYyB2b2lkIHJlbGVhc2VfcHRlX3BhZ2VzKHB0ZV90ICpwdGUsIHB0ZV90ICpfcHRlLAogCX0KIH0KIAomIzQzOy8qCiYjNDM7ICogcHRlX2lzX3JlZmVyZW5jZWQoKSAtIENoZWNrIGZvciBlbm91Z2ggcmVmZXJlbmNlZCBQVEVzIHRvIGp1c3RpZnkgY29sbGFwc2luZwomIzQzOyAqCiYjNDM7ICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZSBwYWdlIGhhcyBiZWVuCiYjNDM7ICogcmVjZW50bHkgYWNjZXNzZWQgKHlvdW5nIHB0ZSkgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB0cnVlIGlmIHRoZSBwYWdlIGhhcyBiZWVuIHJlY2VudGx5IGFjY2Vzc2VkLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBwdGVfaXNfcmVmZXJlbmNlZChzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsIHB0ZV90IHB0ZXZhbCwKJiM0MzsJc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcikKJiM0Mzt7CiYjNDM7CXJldHVybiBjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7CiYjNDM7CSAgICAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHwKJiM0MzsJCWZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHwKJiM0MzsJCW1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS0mZ3Q7dm1fbW0sIGFkZHIpKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY291bnRfY29sbGFwc2VfZXZlbnQodW5zaWduZWQgaW50IG9yZGVyLCBlbnVtIHZtX2V2ZW50X2l0ZW0gdm1fZXZlbnQsCiYjNDM7CQllbnVtIG10aHBfc3RhdF9pdGVtIG10aHBfZXZlbnQpCiYjNDM7ewomIzQzOwlpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSkKJiM0MzsJCWNvdW50X3ZtX2V2ZW50KHZtX2V2ZW50KTsKJiM0MzsJY291bnRfbXRocF9zdGF0KG9yZGVyLCBtdGhwX2V2ZW50KTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBwdGVfY2hlY2tfZmFpbCgpIC0gQSBzaW1wbGUgaGVscGVyIHRvIHNldCB0aGUgcHRlX2NoZWNrX2NvbnRleHQgcmVzdWx0IGFuZAomIzQzOyAqIHJldHVybiBQVEVfQ0hFQ0tfRkFJTC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVja19mYWlsKHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCAqY3R4LAomIzQzOwkJZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQpCiYjNDM7ewomIzQzOwljdHgtJmd0O3Jlc3VsdCA9IHJlc3VsdDsKJiM0MzsJcmV0dXJuIFBURV9DSEVDS19GQUlMOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIGNvbGxhcHNlX2NoZWNrX3B0ZSgpIC0gQ2hlY2sgaWYgYSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlCiYjNDM7ICoKJiM0MzsgKiBDaGVjayBpZiBhIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2UgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjcml0ZXJpYToKJiM0MzsgKiAtIG1heF9wdGVfKiB2YWx1ZXMgYXJlIG5vdCBleGNlZWRlZAomIzQzOyAqIC0gdWZmZCBpcyBub3QgYWN0aXZlCiYjNDM7ICogLSBsYXp5ZnJlZSBwcm9wZXJ0aWVzIGFyZSBub3QgcHJlc2VudAomIzQzOyAqIC0gb25seSBhbm9ueW1vdXMgcGFnZXMgYXJlIHByZXNlbnQKJiM0MzsgKgomIzQzOyAqIGEgaGVscGVyIHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBpcyB1c2VkIHRvIHBhc3MgYW5kIHN0b3JlIHJlbGV2YW50CiYjNDM7ICogaW5mb3JtYXRpb24gYmV0d2VlbiB0aGUgY29sbGFwc2VfY2hlY2tfcHRlKCkgZnVuY3Rpb24gYW5kIHRoZSBjYWxsZXIuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFBURV9DSEVDS19TVUNDRUVEIGlmIHRoZSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlLAomIzQzOyAqICAgICAgICAgUFRFX0NIRUNLX0ZBSUwgaWYgdGhlIFBURSBpcyBub3Qgc3VpdGFibGUgZm9yIGNvbGxhcHNlLAomIzQzOyAqICAgICAgICAgUFRFX0NIRUNLX0NPTlRJTlVFIGlmIHRoZSBzY2FuIHNob3VsZCBjb250aW51ZSB0byBjaGVjayB0aGUgbmV4dCBQVEUuCiYjNDM7ICovCiYjNDM7c3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBjb2xsYXBzZV9jaGVja19wdGUocHRlX3QgcHRldmFsLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eCkKJiM0Mzt7CiYjNDM7CWlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHsKJiM0MzsJCWlmICgmIzQzOyYjNDM7Y3R4LSZndDtub25lX29yX3plcm8gJmd0OyBjdHgtJmd0O21heF9wdGVzX25vbmUpIHsKJiM0MzsJCQljb3VudF9jb2xsYXBzZV9ldmVudChjdHgtJmd0O29yZGVyLCBUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUsCiYjNDM7CQkJCQkgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7CiYjNDM7CQkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfTk9ORV9QVEUpOwomIzQzOwkJfQomIzQzOwkJcmV0dXJuIFBURV9DSEVDS19DT05USU5VRTsKJiM0MzsJfQomIzQzOwlpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHsKJiM0MzsJCWlmIChjdHgtJmd0O3VubWFwcGVkID09IC0xKQomIzQzOwkJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX05PTl9QUkVTRU5UKTsKJiM0MzsJCWlmICgmIzQzOyYjNDM7Y3R4LSZndDt1bm1hcHBlZCAmZ3Q7IGN0eC0mZ3Q7bWF4X3B0ZXNfc3dhcCkgewomIzQzOwkJCWNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC0mZ3Q7b3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSwKJiM0MzsJCQkJCSAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTsKJiM0MzsJCQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9TV0FQX1BURSk7CiYjNDM7CQl9CiYjNDM7CQlpZiAocHRlX3N3cF91ZmZkX2FueShwdGV2YWwpKQomIzQzOwkJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpOwomIzQzOwkJcmV0dXJuIFBURV9DSEVDS19DT05USU5VRTsKJiM0MzsJfQomIzQzOwkvKgomIzQzOwkgKiBEb24mIzM5O3QgY29sbGFwc2UgaWYgYW55IG9mIHRoZSBzbWFsbCBQVEVzIGFyZSBhcm1lZCB3aXRoIHVmZmQKJiM0MzsJICogd3JpdGUgcHJvdGVjdGlvbi4gTWFya2luZyB0aGUgbmV3IGh1Z2UgcG1kIGFzIHdyaXRlIHByb3RlY3RlZAomIzQzOwkgKiBjb3VsZCBicmluZyB1c2VyZmF1bHQgbWVzc2FnZXMgdGhhdCBmYWxsIG91dHNpZGUgb2YgdGhlCiYjNDM7CSAqIHJlZ2lzdGVyZWQgcmFuZ2UuCiYjNDM7CSAqLwomIzQzOwlpZiAocHRlX3VmZmQocHRldmFsKSkKJiM0MzsJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpOwomIzQzOwomIzQzOwljdHgtJmd0O2ZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKGN0eC0mZ3Q7dm1hLCBhZGRyLCBwdGV2YWwpOwomIzQzOwlpZiAodW5saWtlbHkoIWN0eC0mZ3Q7Zm9saW8pIHx8IHVubGlrZWx5KGZvbGlvX2lzX3pvbmVfZGV2aWNlKGN0eC0mZ3Q7Zm9saW8pKSkKJiM0MzsJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9OVUxMKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogSWYgdGhlIHZtYSBoYXMgdGhlIFZNX0RST1BQQUJMRSBmbGFnLCB0aGUgY29sbGFwc2Ugd2lsbAomIzQzOwkgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuCiYjNDM7CSAqLwomIzQzOwlpZiAoY3R4LSZndDtjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7ICEoY3R4LSZndDt2bWEtJmd0O3ZtX2ZsYWdzICZhbXA7IFZNX0RST1BQQUJMRSkgJmFtcDsmYW1wOwomIzQzOwkgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShjdHgtJmd0O2ZvbGlvKSAmYW1wOyZhbXA7ICFwdGVfZGlydHkocHRldmFsKSkKJiM0MzsJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9MQVpZRlJFRSk7CiYjNDM7CiYjNDM7CWlmICghZm9saW9fdGVzdF9hbm9uKGN0eC0mZ3Q7Zm9saW8pKSB7CiYjNDM7CQlWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oY3R4LSZndDtmb2xpbyksIGN0eC0mZ3Q7Zm9saW8pOwomIzQzOwkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0FOT04pOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGN0eC0mZ3Q7Zm9saW8pKSB7CiYjNDM7CQkvKgomIzQzOwkJICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXIKJiM0MzsJCSAqIG1USFAgY29sbGFwc2VzLiBDdXJyZW50bHkgYnJpbmdpbmcgaW4gbmV3IHBhZ2VzIHZpYQomIzQzOwkJICogc2hhcmVkIG1heSBjYXVzZSBhIGZ1dHVyZSBoaWdoZXIgb3JkZXIgY29sbGFwc2Ugb24gYQomIzQzOwkJICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLgomIzQzOwkJICovCiYjNDM7CQlpZiAoJiM0MzsmIzQzO2N0eC0mZ3Q7c2hhcmVkICZndDsgY3R4LSZndDttYXhfcHRlc19zaGFyZWQpIHsKJiM0MzsJCQljb3VudF9jb2xsYXBzZV9ldmVudChjdHgtJmd0O29yZGVyLCBUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSwKJiM0MzsJCQkJCSAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpOwomIzQzOwkJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NIQVJFRF9QVEUpOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiBQVEVfQ0hFQ0tfU1VDQ0VFRDsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsIHB0ZV90ICpwdGUsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYywKIAkJdW5zaWduZWQgaW50IG9yZGVyLCBzdHJ1Y3QgbGlzdF9oZWFkICpjb21wb3VuZF9wYWdlbGlzdCkKIHsKLQljb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgb3JkZXIpOwotCWNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIG9yZGVyKTsKIAljb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMICZsdDsmbHQ7IG9yZGVyOwotCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAlzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSBzdGFydF9hZGRyOwotCXB0ZV90ICpfcHRlOwotCWludCBub25lX29yX3plcm8gPSAwLCBzaGFyZWQgPSAwLCByZWZlcmVuY2VkID0gMDsKJiM0MzsJcHRlX3QgKl9wdGUsIHB0ZXZhbDsKJiM0MzsJaW50IHJlZmVyZW5jZWQgPSAwOwogCWVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMOwomIzQzOwllbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrOwomIzQzOwlzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0gewomIzQzOwkJLmNjID0gY2MsCiYjNDM7CQkudm1hID0gdm1hLAomIzQzOwkJLm9yZGVyID0gb3JkZXIsCiYjNDM7CQkudW5tYXBwZWQgPSAtMSwgLyogZG9uJiMzOTt0IGNoZWNrIHN3YXAgUFRFcyAqLwomIzQzOwkJLm1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKSwKJiM0MzsJCS5tYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIG9yZGVyKSwKJiM0MzsJfTsKIAogCWZvciAoX3B0ZSA9IHB0ZTsgX3B0ZSAmbHQ7IHB0ZSAmIzQzOyBucl9wYWdlczsKIAkgICAgIF9wdGUmIzQzOyYjNDM7LCBhZGRyICYjNDM7PSBQQUdFX1NJWkUpIHsKLQkJcHRlX3QgcHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7Ci0JCWlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHsKLQkJCWlmICgmIzQzOyYjNDM7bm9uZV9vcl96ZXJvICZndDsgbWF4X3B0ZXNfbm9uZSkgewotCQkJCXJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFOwotCQkJCWlmIChpc19wbWRfb3JkZXIob3JkZXIpKQotCQkJCQljb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUpOwotCQkJCWNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghcHRlX3ByZXNlbnQocHRldmFsKSkgewotCQkJcmVzdWx0ID0gU0NBTl9QVEVfTk9OX1BSRVNFTlQ7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlpZiAocHRlX3VmZmQocHRldmFsKSkgewotCQkJcmVzdWx0ID0gU0NBTl9QVEVfVUZGRDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCXBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7Ci0JCWlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7Ci0JCVZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSwgZm9saW8pOwotCi0JCS8qCi0JCSAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGwKLQkJICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLgotCQkgKi8KLQkJaWYgKGNjLSZndDtpc19raHVnZXBhZ2VkICZhbXA7JmFtcDsgISh2bWEtJmd0O3ZtX2ZsYWdzICZhbXA7IFZNX0RST1BQQUJMRSkgJmFtcDsmYW1wOwotCQkgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgJmFtcDsmYW1wOyAhcHRlX2RpcnR5KHB0ZXZhbCkpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTsKJiM0MzsJCXB0ZXZhbCA9IHB0ZXBfZ2V0KF9wdGUpOwomIzQzOwkJcHRlX2NoZWNrID0gY29sbGFwc2VfY2hlY2tfcHRlKHB0ZXZhbCwgYWRkciwgJmFtcDtjdHgpOwomIzQzOwkJZm9saW8gPSBjdHguZm9saW87CiYjNDM7CQlpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19GQUlMKSB7CiYjNDM7CQkJcmVzdWx0ID0gY3R4LnJlc3VsdDsKIAkJCWdvdG8gb3V0OwogCQl9CiYjNDM7CQlpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSkKJiM0MzsJCQljb250aW51ZTsKIAotCQkvKiBTZWUgY29sbGFwc2Vfc2Nhbl9wbWQoKS4gKi8KLQkJaWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7Ci0JCQkvKgotCQkJICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXIKLQkJCSAqIG1USFAgY29sbGFwc2VzLiBDdXJyZW50bHkgYnJpbmdpbmcgaW4gbmV3IHBhZ2VzIHZpYQotCQkJICogc2hhcmVkIG1heSBjYXVzZSBhIGZ1dHVyZSBoaWdoZXIgb3JkZXIgY29sbGFwc2Ugb24gYQotCQkJICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLgotCQkJICovCi0JCQlpZiAoJiM0MzsmIzQzO3NoYXJlZCAmZ3Q7IG1heF9wdGVzX3NoYXJlZCkgewotCQkJCXJlc3VsdCA9IFNDQU5fRVhDRUVEX1NIQVJFRF9QVEU7Ci0JCQkJaWYgKGlzX3BtZF9vcmRlcihvcmRlcikpCi0JCQkJCWNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTsKLQkJCQljb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfQogCQkvKgogCQkgKiBUT0RPOiBJbiBzb21lIGNhc2VzIG9mIHBhcnRpYWxseS1tYXBwZWQgZm9saW9zLCB3ZSYjMzk7ZCBhY3R1YWxseQogCQkgKiB3YW50IHRvIGNvbGxhcHNlLgpAQCAtNzU5LDggJiM0Mzs4NjYsOCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCiAJCS8qCiAJCSAqIFdlIGNhbiBkbyBpdCBiZWZvcmUgZm9saW9faXNvbGF0ZV9scnUgYmVjYXVzZSB0aGUKLQkJICogZm9saW8gY2FuJiMzOTt0IGJlIGZyZWVkIGZyb20gdW5kZXIgdXMuIE5PVEU6IFBHX2xvY2sKLQkJICogaXMgbmVlZGVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHNwbGl0X2h1Z2VfcGFnZQomIzQzOwkJICogZm9saW8gY2FuJiMzOTt0IGJlIGZyZWVkIGZyb20gdW5kZXIgdXMuIE5PVEU6IGZvbGlvIGxvY2sKJiM0MzsJCSAqIGlzIG5lZWRlZCB0byBzZXJpYWxpemUgYWdhaW5zdCBzcGxpdF9odWdlX3BhZ2UoKQogCQkgKiB3aGVuIGludm9rZWQgZnJvbSB0aGUgVk0uCiAJCSAqLwogCQlpZiAoIWZvbGlvX3RyeWxvY2soZm9saW8pKSB7CkBAIC03ODYsNyAmIzQzOzg5Myw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCX0KIAogCQkvKgotCQkgKiBJc29sYXRlIHRoZSBwYWdlIHRvIGF2b2lkIGNvbGxhcHNpbmcgYW4gaHVnZXBhZ2UKJiM0MzsJCSAqIElzb2xhdGUgdGhlIGZvbGlvIHRvIGF2b2lkIGNvbGxhcHNpbmcgYSBodWdlcGFnZQogCQkgKiBjdXJyZW50bHkgaW4gdXNlIGJ5IHRoZSBWTS4KIAkJICovCiAJCWlmICghZm9saW9faXNvbGF0ZV9scnUoZm9saW8pKSB7CkBAIC04MDMsMTQgJiM0Mzs5MTAsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQlpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpCiAJCQlsaXN0X2FkZF90YWlsKCZhbXA7Zm9saW8tJmd0O2xydSwgY29tcG91bmRfcGFnZWxpc3QpOwogbmV4dDoKLQkJLyoKLQkJICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZXJlIGlzCi0JCSAqIGVub3VnaCB5b3VuZyBwdGUgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlCi0JCSAqLwotCQlpZiAoY2MtJmd0O2lzX2todWdlcGFnZWQgJmFtcDsmYW1wOwotCQkgICAgKHB0ZV95b3VuZyhwdGV2YWwpIHx8IGZvbGlvX3Rlc3RfeW91bmcoZm9saW8pIHx8Ci0JCSAgICAgZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSB8fAotCQkgICAgIG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS0mZ3Q7dm1fbW0sIGFkZHIpKSkKJiM0MzsJCWlmIChwdGVfaXNfcmVmZXJlbmNlZChjYywgcHRldmFsLCBmb2xpbywgdm1hLCBhZGRyKSkKIAkJCXJlZmVyZW5jZWQmIzQzOyYjNDM7OwogCX0KIApAQCAtODE4LDEzICYjNDM7OTE4LDEzIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCXJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7CiAJfSBlbHNlIHsKIAkJcmVzdWx0ID0gU0NBTl9TVUNDRUVEOwotCQl0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgbm9uZV9vcl96ZXJvLAomIzQzOwkJdHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIGN0eC5ub25lX29yX3plcm8sCiAJCQkJCQkgICAgcmVmZXJlbmNlZCwgcmVzdWx0LCBvcmRlcik7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogb3V0OgogCXJlbGVhc2VfcHRlX3BhZ2VzKHB0ZSwgX3B0ZSwgY29tcG91bmRfcGFnZWxpc3QpOwotCXRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sCiYjNDM7CXRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLAogCQkJCQkgICAgcmVmZXJlbmNlZCwgcmVzdWx0LCBvcmRlcik7CiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTkwNCw3ICYjNDM7MTAwNCw3IEBAIHN0YXRpYyB2b2lkIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfZmFpbGVkKHB0ZV90ICpwdGUsCiAJICogUmUtZXN0YWJsaXNoIHRoZSBQTUQgdG8gcG9pbnQgdG8gdGhlIG9yaWdpbmFsIHBhZ2UgdGFibGUKIAkgKiBlbnRyeS4gUmVzdG9yaW5nIFBNRCBuZWVkcyB0byBiZSBkb25lIHByaW9yIHRvIHJlbGVhc2luZwogCSAqIHBhZ2VzLiBTaW5jZSBwYWdlcyBhcmUgc3RpbGwgaXNvbGF0ZWQgYW5kIGxvY2tlZCBoZXJlLAotCSAqIGFjcXVpcmluZyBhbm9uX3ZtYV9sb2NrX3dyaXRlIGlzIHVubmVjZXNzYXJ5LgomIzQzOwkgKiBhY3F1aXJpbmcgYW5vbl92bWFfbG9ja193cml0ZSgpIGlzIHVubmVjZXNzYXJ5LgogCSAqLwogCXBtZF9wdGwgPSBwbWRfbG9jayh2bWEtJmd0O3ZtX21tLCBwbWQpOwogCXBtZF9wb3B1bGF0ZSh2bWEtJmd0O3ZtX21tLCBwbWQsIHBtZF9wZ3RhYmxlKG9yaWdfcG1kKSk7CkBAIC0xMDc4LDkgJiM0MzsxMTc4LDkgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGwKIAkJcmV0dXJuIFNDQU5fVk1BX0NIRUNLOwogCS8qCiAJICogQW5vbiBWTUEgZXhwZWN0ZWQsIHRoZSBhZGRyZXNzIG1heSBiZSB1bm1hcHBlZCB0aGVuCi0JICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYXF1aXJlZCB0aGUgbW1hcF9sb2NrLgomIzQzOwkgKiByZW1hcHBlZCB0byBmaWxlIGFmdGVyIGtodWdlcGFnZWQgcmVhY3F1aXJlZCB0aGUgbW1hcF9sb2NrLgogCSAqCi0JICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzIG1heSByZXR1cm4gdHJ1ZSBmb3IgcXVhbGlmaWVkIGZpbGUKJiM0MzsJICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKCkgbWF5IHJldHVybiB0cnVlIGZvciBxdWFsaWZpZWQgZmlsZQogCSAqIHZtYXMuCiAJICovCiAJaWYgKGV4cGVjdF9hbm9uICZhbXA7JmFtcDsgKCEoKnZtYXApLSZndDthbm9uX3ZtYSB8fCAhdm1hX2lzX2Fub255bW91cygqdm1hcCkpKQpAQCAtMTEzNiw3ICYjNDM7MTIzNiw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNoZWNrX3BtZF9zdGlsbF92YWxpZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAogLyoKICAqIEJyaW5nIG1pc3NpbmcgcGFnZXMgaW4gZnJvbSBzd2FwLCB0byBjb21wbGV0ZSBUSFAgY29sbGFwc2UuCi0gKiBPbmx5IGRvbmUgaWYga2h1Z2VwYWdlZF9zY2FuX3BtZCBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLgomIzQzOyAqIE9ubHkgZG9uZSBpZiBjb2xsYXBzZV9zY2FuX3BtZCgpIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuCiAgKgogICogRm9yIG1USFAgb3JkZXJzIHRoZSBmdW5jdGlvbiBiYWlscyBvbiB0aGUgZmlyc3Qgc3dhcCBlbnRyeSwgYmVjYXVzZQogICogZmF1bHRpbmcgcGFnZXMgYmFjayBpbiBkdXJpbmcgY29sbGFwc2UgY291bGQgcmUtcG9wdWxhdGUgUFRFcyB0aGF0CkBAIC0xMjA0LDcgJiM0MzsxMzA0LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQlwdGUgPSBOVUxMOwogCiAJCS8qCi0JCSAqIGRvX3N3YXBfcGFnZSByZXR1cm5zIFZNX0ZBVUxUX1JFVFJZIHdpdGggcmVsZWFzZWQgbW1hcF9sb2NrLgomIzQzOwkJICogZG9fc3dhcF9wYWdlKCkgcmV0dXJucyBWTV9GQVVMVF9SRVRSWSB3aXRoIHJlbGVhc2VkIG1tYXBfbG9jay4KIAkJICogTm90ZSB3ZSB0cmVhdCBWTV9GQVVMVF9SRVRSWSBhcyBWTV9GQVVMVF9FUlJPUiBoZXJlIGJlY2F1c2UKIAkJICogd2UgZG8gbm90IHJldHJ5IGhlcmUgYW5kIHN3YXAgZW50cnkgd2lsbCByZW1haW4gaW4gcGFnZXRhYmxlCiAJCSAqIHJlc3VsdGluZyBpbiBsYXRlciBmYWlsdXJlLgpAQCAtMTI0NywxNSAmIzQzOzEzNDcsMTIgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnUKIAlmb2xpbyA9IF9fZm9saW9fYWxsb2MoZ2ZwLCBvcmRlciwgbm9kZSwgJmFtcDtjYy0mZ3Q7YWxsb2Nfbm1hc2spOwogCWlmICghZm9saW8pIHsKIAkJKmZvbGlvcCA9IE5VTEw7Ci0JCWlmIChpc19wbWRfb3JkZXIob3JkZXIpKQotCQkJY291bnRfdm1fZXZlbnQoVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7Ci0JCWNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7CiYjNDM7CQljb3VudF9jb2xsYXBzZV9ldmVudChvcmRlciwgVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCwKJiM0MzsJCQkJICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTsKIAkJcmV0dXJuIFNDQU5fQUxMT0NfSFVHRV9QQUdFX0ZBSUw7CiAJfQogCi0JaWYgKGlzX3BtZF9vcmRlcihvcmRlcikpCi0JCWNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQyk7Ci0JY291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0MpOwomIzQzOwljb3VudF9jb2xsYXBzZV9ldmVudChvcmRlciwgVEhQX0NPTExBUFNFX0FMTE9DLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0MpOwogCiAJaWYgKHVubGlrZWx5KG1lbV9jZ3JvdXBfY2hhcmdlKGZvbGlvLCBtbSwgZ2ZwKSkpIHsKIAkJZm9saW9fcHV0KGZvbGlvKTsKQEAgLTEyNzEsNyAmIzQzOzEzNjgsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydQogfQogCiAvKgotICogY29sbGFwc2VfaHVnZV9wYWdlIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kCiYjNDM7ICogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbW1hcF9sb2NrIHRvIGJlIHVubG9ja2VkIGJlZm9yZSBlbnRlcmluZyBhbmQKICAqIHdpbGwgYWx3YXlzIHJldHVybiB3aXRoIHRoZSBsb2NrIHVubG9ja2VkLCB0byBhdm9pZCBob2xkaW5nIHRoZSBtbWFwX2xvY2sKICAqIHdoaWxlIGFsbG9jYXRpbmcgYSBUSFAsIGFzIHRoYXQgY291bGQgdHJpZ2dlciBkaXJlY3QgcmVjbGFpbS9jb21wYWN0aW9uLgogICogTm90ZSB0aGF0IHRoZSBWTUEgbXVzdCBiZSByZWNoZWNrZWQgYWZ0ZXIgZ3JhYmJpbmcgdGhlIG1tYXBfbG9jayBhZ2Fpbi4KQEAgLTEzMTgsNyAmIzQzOzE0MTUsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcwogCiAJaWYgKHVubWFwcGVkKSB7CiAJCS8qCi0JCSAqIF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbiB3aWxsIHJldHVybiB3aXRoIG1tYXBfbG9jawomIzQzOwkJICogX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKCkgd2lsbCByZXR1cm4gd2l0aCBtbWFwX2xvY2sKIAkJICogcmVsZWFzZWQgd2hlbiBpdCBmYWlscy4gU28gd2UganVtcCBvdXRfbm9sb2NrIGRpcmVjdGx5IGluCiAJCSAqIHRoYXQgY2FzZS4gIENvbnRpbnVpbmcgdG8gY29sbGFwc2UgY2F1c2VzIGluY29uc2lzdGVuY3kuCiAJCSAqLwpAQCAtMTMzMSw4ICYjNDM7MTQyOCw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzCiAJbW1hcF9yZWFkX3VubG9jayhtbSk7CiAJLyoKIAkgKiBQcmV2ZW50IGFsbCBhY2Nlc3MgdG8gcGFnZXRhYmxlcyB3aXRoIHRoZSBleGNlcHRpb24gb2YKLQkgKiBndXBfZmFzdCBsYXRlciBoYW5kbGVkIGJ5IHRoZSBwdGVwX2NsZWFyX2ZsdXNoIGFuZCB0aGUgVk0KLQkgKiBoYW5kbGVkIGJ5IHRoZSBhbm9uX3ZtYSBsb2NrICYjNDM7IFBHX2xvY2suCiYjNDM7CSAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHBtZHBfY29sbGFwc2VfZmx1c2goKSBhbmQgdGhlIFZNCiYjNDM7CSAqIGhhbmRsZWQgYnkgdGhlIGFub25fdm1hIGxvY2sgJiM0MzsgZm9saW8gbG9jay4KIAkgKgogCSAqIFVGRkRJT19NT1ZFIGlzIHByZXZlbnRlZCB0byByYWNlIGFzIHdlbGwgdGhhbmtzIHRvIHRoZQogCSAqIG1tYXBfbG9jay4KQEAgLTEzODksOSAmIzQzOzE0ODYsOSBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcwogCQlzcGluX2xvY2socG1kX3B0bCk7CiAJCVZNX1dBUk5fT05fT05DRSghcG1kX25vbmUoKnBtZCkpOwogCQkvKgotCQkgKiBXZSBjYW4gb25seSB1c2Ugc2V0X3BtZF9hdCB3aGVuIGVzdGFibGlzaGluZwomIzQzOwkJICogV2UgY2FuIG9ubHkgdXNlIHNldF9wbWRfYXQoKSB3aGVuIGVzdGFibGlzaGluZwogCQkgKiBodWdlcG1kcyBhbmQgbmV2ZXIgZm9yIGVzdGFibGlzaGluZyByZWd1bGFyIHBtZHMgdGhhdAotCQkgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlIGZvciB0aGF0CiYjNDM7CQkgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlKCkgZm9yIHRoYXQKIAkJICovCiAJCXBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwbWRfcGd0YWJsZShfcG1kKSk7CiAJCXNwaW5fdW5sb2NrKHBtZF9wdGwpOwpAQCAtMTQzOSw3ICYjNDM7MTUzNiw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzCiAJCQlzcGluX2xvY2tfbmVzdGVkKHB0ZV9wdGwsIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKIAkJcG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBtZF9wZ3RhYmxlKF9wbWQpKTsKIAkJbWFwX2Fub25fZm9saW9fcHRlX25vcGYoZm9saW8sIHB0ZSwgdm1hLCBzdGFydF9hZGRyLAotCQkJCQkgIC8qdWZmZF93cD0qLyBmYWxzZSk7CiYjNDM7CQkJCQkgIC8qdWZmZD0qLyBmYWxzZSk7CiAJCWlmIChwdGVfcHRsICE9IHBtZF9wdGwpCiAJCQlzcGluX3VubG9jayhwdGVfcHRsKTsKIAl9CkBAIC0xNDQ5LDEwICYjNDM7MTU0NiwxMCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcwogCiAJcmVzdWx0ID0gU0NBTl9TVUNDRUVEOwogb3V0X3VwX3dyaXRlOgotCWlmIChhbm9uX3ZtYV9sb2NrZWQpCi0JCWFub25fdm1hX3VubG9ja193cml0ZSh2bWEtJmd0O2Fub25fdm1hKTsKIAlpZiAocHRlKQogCQlwdGVfdW5tYXAocHRlKTsKJiM0MzsJaWYgKGFub25fdm1hX2xvY2tlZCkKJiM0MzsJCWFub25fdm1hX3VubG9ja193cml0ZSh2bWEtJmd0O2Fub25fdm1hKTsKIAltbWFwX3dyaXRlX3VubG9jayhtbSk7CiBvdXRfbm9sb2NrOgogCWlmIChmb2xpbykKQEAgLTE1OTMsNDIgJiM0MzsxNjkwLDQ3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLAogCQlib29sICpsb2NrX2Ryb3BwZWQsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYykKIHsKLQljb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBIUEFHRV9QTURfT1JERVIpOwotCWNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwID0gY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChjYywgSFBBR0VfUE1EX09SREVSKTsKLQl1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKTsKIAllbnVtIHR2YV90eXBlIHR2YV9mbGFncyA9IGNjLSZndDtpc19raHVnZXBhZ2VkID8gVFZBX0tIVUdFUEFHRUQgOiBUVkFfRk9SQ0VEX0NPTExBUFNFOwogCXBtZF90ICpwbWQ7CiAJcHRlX3QgKnB0ZSwgKl9wdGUsIHB0ZXZhbDsKIAlpbnQgaTsKLQlpbnQgbm9uZV9vcl96ZXJvID0gMCwgc2hhcmVkID0gMCwgcmVmZXJlbmNlZCA9IDA7Ci0JZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwogCXN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMOwomIzQzOwlpbnQgcmVmZXJlbmNlZCA9IDA7CiYjNDM7CWVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAl1bnNpZ25lZCBsb25nIGVuYWJsZWRfb3JkZXJzOwogCXNwaW5sb2NrX3QgKnB0bDsKLQlpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERSwgdW5tYXBwZWQgPSAwOwomIzQzOwlpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERTsKJiM0MzsJZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVjazsKIAogCVZNX0JVR19PTihzdGFydF9hZGRyICZhbXA7IH5IUEFHRV9QTURfTUFTSyk7CiAKJiM0MzsJc3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGN0eCA9IHsKJiM0MzsJCS5jYyA9IGNjLAomIzQzOwkJLnZtYSA9IHZtYSwKJiM0MzsJCS5vcmRlciA9IEhQQUdFX1BNRF9PUkRFUiwKJiM0MzsJCS5tYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBIUEFHRV9QTURfT1JERVIpLAomIzQzOwkJLm1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpLAomIzQzOwkJLm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgSFBBR0VfUE1EX09SREVSKSwKJiM0MzsJfTsKJiM0MzsKIAlyZXN1bHQgPSBmaW5kX3BtZF9vcl90aHBfb3Jfbm9uZShtbSwgc3RhcnRfYWRkciwgJmFtcDtwbWQpOwogCWlmIChyZXN1bHQgIT0gU0NBTl9TVUNDRUVEKSB7CiAJCWNjLSZndDtwcm9ncmVzcyYjNDM7JiM0Mzs7CiAJCWdvdG8gb3V0OwogCX0KIAotCWJpdG1hcF96ZXJvKGNjLSZndDttdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7Ci0JbWVtc2V0KGNjLSZndDtub2RlX2xvYWQsIDAsIHNpemVvZihjYy0mZ3Q7bm9kZV9sb2FkKSk7Ci0Jbm9kZXNfY2xlYXIoY2MtJmd0O2FsbG9jX25tYXNrKTsKJiM0MzsJY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oY2MpOwogCiAJZW5hYmxlZF9vcmRlcnMgPSBjb2xsYXBzZV9wb3NzaWJsZV9vcmRlcnModm1hLCB2bWEtJmd0O3ZtX2ZsYWdzLCB0dmFfZmxhZ3MpOwogCiAJLyoKIAkgKiBJZiBQTUQgaXMgdGhlIG9ubHkgZW5hYmxlZCBvcmRlciwgZW5mb3JjZSBtYXhfcHRlc19ub25lLCBvdGhlcndpc2UKLQkgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLgomIzQzOwkgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLiBUaGUgYml0bWFwCiYjNDM7CSAqIGlzIHRoZW4gY2hlY2tlZCBhZ2FpbiBpbiBtdGhwX2NvbGxhcHNlKCkgZm9yIGVhY2ggYXR0ZW1wdGVkIG9yZGVyLgogCSAqLwogCWlmIChlbmFibGVkX29yZGVycyAhPSBCSVQoSFBBR0VfUE1EX09SREVSKSkKLQkJbWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7CiYjNDM7CQljdHgubWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7CiAKIAlwdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIHN0YXJ0X2FkZHIsICZhbXA7cHRsKTsKIAlpZiAoIXB0ZSkgewpAQCAtMTY0NCw4NCAmIzQzOzE3NDYsMTQgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAKIAkJY2MtJmd0O3Byb2dyZXNzJiM0MzsmIzQzOzsKIAotCQlpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7Ci0JCQlpZiAoJiM0MzsmIzQzO25vbmVfb3JfemVybyAmZ3Q7IG1heF9wdGVzX25vbmUpIHsKLQkJCQlyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9OT05FX1BURTsKLQkJCQljb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUpOwotCQkJCWNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsCi0JCQkJCQlNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpOwotCQkJCWdvdG8gb3V0X3VubWFwOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7Ci0JCQlpZiAoJiM0MzsmIzQzO3VubWFwcGVkICZndDsgbWF4X3B0ZXNfc3dhcCkgewotCQkJCXJlc3VsdCA9IFNDQU5fRVhDRUVEX1NXQVBfUFRFOwotCQkJCWNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSk7Ci0JCQkJY291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUiwKLQkJCQkJCU1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU1dBUCk7Ci0JCQkJZ290byBvdXRfdW5tYXA7Ci0JCQl9Ci0JCQkvKgotCQkJICogQWx3YXlzIGJlIHN0cmljdCB3aXRoIHVmZmQtd3AKLQkJCSAqIGVuYWJsZWQgc3dhcCBlbnRyaWVzLiAgUGxlYXNlIHNlZQotCQkJICogY29tbWVudCBiZWxvdyBmb3IgcHRlX3VmZmQoKS4KLQkJCSAqLwotCQkJaWYgKHB0ZV9zd3BfdWZmZF9hbnkocHRldmFsKSkgewotCQkJCXJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7Ci0JCQkJZ290byBvdXRfdW5tYXA7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAocHRlX3VmZmQocHRldmFsKSkgewotCQkJLyoKLQkJCSAqIERvbiYjMzk7dCBjb2xsYXBzZSB0aGUgcGFnZSBpZiBhbnkgb2YgdGhlIHNtYWxsCi0JCQkgKiBQVEVzIGFyZSBhcm1lZCB3aXRoIHVmZmQgd3JpdGUgcHJvdGVjdGlvbi4KLQkJCSAqIEhlcmUgd2UgY2FuIGFsc28gbWFyayB0aGUgbmV3IGh1Z2UgcG1kIGFzCi0JCQkgKiB3cml0ZSBwcm90ZWN0ZWQgaWYgYW55IG9mIHRoZSBzbWFsbCBvbmVzIGlzCi0JCQkgKiBtYXJrZWQgYnV0IHRoYXQgY291bGQgYnJpbmcgdW5rbm93bgotCQkJICogdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbHMgb3V0c2lkZSBvZgotCQkJICogdGhlIHJlZ2lzdGVyZWQgcmFuZ2UuICBTbywganVzdCBiZSBzaW1wbGUuCi0JCQkgKi8KLQkJCXJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7Ci0JCQlnb3RvIG91dF91bm1hcDsKLQkJfQotCi0JCXBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7Ci0JCWlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMOwotCQkJZ290byBvdXRfdW5tYXA7Ci0JCX0KLQkJZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpOwotCi0JCS8qCi0JCSAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGwKLQkJICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLgotCQkgKi8KLQkJaWYgKGNjLSZndDtpc19raHVnZXBhZ2VkICZhbXA7JmFtcDsgISh2bWEtJmd0O3ZtX2ZsYWdzICZhbXA7IFZNX0RST1BQQUJMRSkgJmFtcDsmYW1wOwotCQkgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgJmFtcDsmYW1wOyAhcHRlX2RpcnR5KHB0ZXZhbCkpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTsKJiM0MzsJCXB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsICZhbXA7Y3R4KTsKJiM0MzsJCWZvbGlvID0gY3R4LmZvbGlvOwomIzQzOwkJaWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkgewomIzQzOwkJCXJlc3VsdCA9IGN0eC5yZXN1bHQ7CiAJCQlnb3RvIG91dF91bm1hcDsKIAkJfQotCi0JCWlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkgewotCQkJcmVzdWx0ID0gU0NBTl9QQUdFX0FOT047Ci0JCQlnb3RvIG91dF91bm1hcDsKLQkJfQotCi0JCS8qCi0JCSAqIFdlIHRyZWF0IGEgc2luZ2xlIHBhZ2UgYXMgc2hhcmVkIGlmIGFueSBwYXJ0IG9mIHRoZSBUSFAKLQkJICogaXMgc2hhcmVkLgotCQkgKi8KLQkJaWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7Ci0JCQlpZiAoJiM0MzsmIzQzO3NoYXJlZCAmZ3Q7IG1heF9wdGVzX3NoYXJlZCkgewotCQkJCXJlc3VsdCA9IFNDQU5fRVhDRUVEX1NIQVJFRF9QVEU7Ci0JCQkJY291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUpOwotCQkJCWNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsCi0JCQkJCQlNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7Ci0JCQkJZ290byBvdXRfdW5tYXA7Ci0JCQl9Ci0JCX0KJiM0MzsJCWlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0NPTlRJTlVFKQomIzQzOwkJCWNvbnRpbnVlOwogCiAJCS8qIFNldCBiaXQgZm9yIG9jY3VwaWVkIHBhZ2VzICovCiAJCV9fc2V0X2JpdChpLCBjYy0mZ3Q7bXRocF9wcmVzZW50X3B0ZXMpOwpAQCAtMTc0OSwzMSAmIzQzOzE3ODEsMjEgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCS8qCiAJCSAqIENoZWNrIGlmIHRoZSBwYWdlIGhhcyBhbnkgR1VQIChvciBvdGhlciBleHRlcm5hbCkgcGlucy4KIAkJICoKLQkJICogSGVyZSB0aGUgY2hlY2sgbWF5IGJlIHJhY3k6Ci0JCSAqIGl0IG1heSBzZWUgZm9saW9fbWFwY291bnQoKSAmZ3Q7IGZvbGlvX3JlZl9jb3VudCgpLgotCQkgKiBCdXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCB3ZSBjb3VsZCBhbHdheXMgcmV0cnkgY29sbGFwc2UKLQkJICogbGF0ZXIuICBIb3dldmVyIGl0IG1heSByZXBvcnQgZmFsc2UgcG9zaXRpdmUgaWYgdGhlIHBhZ2UKLQkJICogaGFzIGV4Y2Vzc2l2ZSBHVVAgcGlucyAoaS5lLiA1MTIpLiAgQW55d2F5IHRoZSBzYW1lIGNoZWNrCi0JCSAqIHdpbGwgYmUgZG9uZSBhZ2FpbiBsYXRlciB0aGUgcmlzayBzZWVtcyBsb3cuCiYjNDM7CQkgKiBIZXJlIHRoZSBjaGVjayBpcyByYWN5LCBidXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCBhbmQKJiM0MzsJCSAqIHdlIGNvdWxkIGFsd2F5cyByZXRyeSBjb2xsYXBzZSBsYXRlci4gQW55d2F5IHRoZSBzYW1lCiYjNDM7CQkgKiBjaGVjayB3aWxsIGJlIGRvbmUgYWdhaW4gbGF0ZXIgdGhlIHJpc2sgc2VlbXMgbG93LgogCQkgKi8KIAkJaWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSkgewogCQkJcmVzdWx0ID0gU0NBTl9QQUdFX0NPVU5UOwogCQkJZ290byBvdXRfdW5tYXA7CiAJCX0KIAotCQkvKgotCQkgKiBJZiBjb2xsYXBzZSB3YXMgaW5pdGlhdGVkIGJ5IGtodWdlcGFnZWQsIGNoZWNrIHRoYXQgdGhlcmUgaXMKLQkJICogZW5vdWdoIHlvdW5nIHB0ZSB0byBqdXN0aWZ5IGNvbGxhcHNpbmcgdGhlIHBhZ2UKLQkJICovCi0JCWlmIChjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7Ci0JCSAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHwKLQkJICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8Ci0JCSAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLSZndDt2bV9tbSwgYWRkcikpKQomIzQzOwkJaWYgKHB0ZV9pc19yZWZlcmVuY2VkKGNjLCBwdGV2YWwsIGZvbGlvLCB2bWEsIGFkZHIpKQogCQkJcmVmZXJlbmNlZCYjNDM7JiM0Mzs7CiAJfQogCWlmIChjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7CiAJCSAgICghcmVmZXJlbmNlZCB8fAotCQkgICAgKHVubWFwcGVkICZhbXA7JmFtcDsgcmVmZXJlbmNlZCAmbHQ7IEhQQUdFX1BNRF9OUiAvIDIpKSkgewomIzQzOwkJICAgIChjdHgudW5tYXBwZWQgJmFtcDsmYW1wOyByZWZlcmVuY2VkICZsdDsgSFBBR0VfUE1EX05SIC8gMikpKSB7CiAJCXJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7CiAJfSBlbHNlIHsKIAkJcmVzdWx0ID0gU0NBTl9TVUNDRUVEOwpAQCAtMTc4MSwxNiAmIzQzOzE4MDMsMTYgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiBvdXRfdW5tYXA6CiAJcHRlX3VubWFwX3VubG9jayhwdGUsIHB0bCk7CiAJaWYgKHJlc3VsdCA9PSBTQ0FOX1NVQ0NFRUQpIHsKLQkJLyogY29sbGFwc2VfaHVnZV9wYWdlIGV4cGVjdHMgdGhlIGxvY2sgdG8gYmUgZHJvcHBlZCBiZWZvcmUgY2FsbGluZyAqLwomIzQzOwkJLyogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovCiAJCW1tYXBfcmVhZF91bmxvY2sobW0pOwogCQlyZXN1bHQgPSBtdGhwX2NvbGxhcHNlKG1tLCBzdGFydF9hZGRyLCByZWZlcmVuY2VkLAotCQkJCSAgICAgICB1bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTsKJiM0MzsJCQkJICAgICAgIGN0eC51bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTsKIAkJLyogbW1hcF9sb2NrIHdhcyByZWxlYXNlZCBhYm92ZSwgc2V0IGxvY2tfZHJvcHBlZCAqLwogCQkqbG9ja19kcm9wcGVkID0gdHJ1ZTsKIAl9CiBvdXQ6CiAJdHJhY2VfbW1fa2h1Z2VwYWdlZF9zY2FuX3BtZChtbSwgZm9saW8sIHJlZmVyZW5jZWQsCi0JCQkJICAgICBub25lX29yX3plcm8sIHJlc3VsdCwgdW5tYXBwZWQpOwomIzQzOwkJCQkgICAgIGN0eC5ub25lX29yX3plcm8sIHJlc3VsdCwgY3R4LnVubWFwcGVkKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0yNjkxLDggJiM0MzsyNzEzLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCiAJcHJlc2VudCA9IDA7CiAJc3dhcCA9IDA7Ci0JbWVtc2V0KGNjLSZndDtub2RlX2xvYWQsIDAsIHNpemVvZihjYy0mZ3Q7bm9kZV9sb2FkKSk7Ci0Jbm9kZXNfY2xlYXIoY2MtJmd0O2FsbG9jX25tYXNrKTsKJiM0MzsJY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oY2MpOwogCXJjdV9yZWFkX2xvY2soKTsKIAl4YXNfZm9yX2VhY2goJmFtcDt4YXMsIGZvbGlvLCBzdGFydCAmIzQzOyBIUEFHRV9QTURfTlIgLSAxKSB7CiAJCWlmICh4YXNfcmV0cnkoJmFtcDt4YXMsIGZvbGlvKSkKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6Mzk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTEyMzYKCQkJCQkJCW91dHB1dDogMjAKCQkJCQkJCXRob3VnaHRzOiAyODIyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgS2h1Z2VwYWdlZCBDb2xsYXBzZSBMb2dpYyBSZWZhY3RvcioqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCB0aGF0IHNlZW1zIHRvIGJlIGEgcmVmYWN0b3Jpbmcgb2YgdGhlIGtodWdlcGFnZWQgY29sbGFwc2UgbG9naWMsIHNwZWNpZmljYWxseSB0aGUgUFRFIHNjYW5uaW5nIHBhcnQsIG1vZGlmeWluZyBgbW0va2h1Z2VwYWdlZC5jYCBhbmQgYERvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdGAuIFRoZSBtYWluIGNoYW5nZXMgYXBwZWFyIHRvIGJlIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYSBuZXcgYHB0ZV9jaGVja19jb250ZXh0YCBzdHJ1Y3QgYW5kIGEgbmV3IGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgdG8gY2VudHJhbGl6ZSBQVEUgY2hlY2tpbmcuIFNldmVyYWwgb3RoZXIgcmVsYXRlZCBmdW5jdGlvbnMgbGlrZSBgcHRlX2lzX3JlZmVyZW5jZWQoKWAsIGBjb3VudF9jb2xsYXBzZV9ldmVudCgpYCwgYW5kIGBjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbigpYCBhcmUgYWRkZWQgb3IgbW9kaWZpZWQgYXMgd2VsbC4gTXkgaW5pdGlhbCBpbXByZXNzaW9uIGlzIHRoYXQgdGhpcyBpcyBhIGNsZWFuLXVwLCBidXQgSSBuZWVkIHRvIGJlIHN1cmUuCgpMb29raW5nIGNsb3NlbHkgYXQgdGhlIGRpZmYgaW4gYGNvbGxhcHNlX3NjYW5fcG1kKClgLCBJIHNlZSB0aGF0IGEgc2VyaWVzIG9mIGNoZWNrcyBoYXZlIGJlZW4gbW92ZWQgaW50byB0aGUgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBmdW5jdGlvbi4gTXkgZmlyc3QgdGhvdWdodCBpcyAmIzM0O29rLCB0aGlzIHNlZW1zIGxpa2UganVzdCBhIGxvZ2ljYWwgZ3JvdXBpbmcgYW5kIHNpbXBsaWZpY2F0aW9uLiYjMzQ7IFRoZSBvcmlnaW5hbCBjb2RlIGRpZCBpbmxpbmUgY2hlY2tzIHdpdGggYHB0ZV9ub25lX29yX3plcm8oKWAsIGBwdGVfcHJlc2VudCgpYCwgYW5kIHNvbWUgZm9saW8gdGVzdHMuIE5vdywgdGhlc2UgYXJlIGFsbCBkb25lIHdpdGhpbiBgY29sbGFwc2VfY2hlY2tfcHRlKClgLgoKSG93ZXZlciwgYXMgSSBkaXZlIGRlZXBlciwgSSBub3RpY2Ugc3VidGxlIGRldGFpbHMuIEluIGBjb2xsYXBzZV9jaGVja19wdGUoKWAsIHRoZSBjb250ZXh0IHN0cnVjdCBpcyBpbml0aWFsaXplZC4gQ29tcGFyaW5nIHRoaXMgdG8gdGhlIG9sZGVyIHZlcnNpb24sIEkgd2FudCB0byB2ZXJpZnkgaWYgdGhlcmUgaXMgYW55IGZ1bmN0aW9uYWwgY2hhbmdlLiBMb29raW5nIGNsb3NlciwgdGhlcmUgaXMgYSBgY3R4LSZndDt1bm1hcHBlZGAgd2hpY2ggaXMgaW5pdGlhbGl6ZWQgdG8gYC0xYCBpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYC4gVGhpcyBpcyBpbXBvcnRhbnQsIGFzIGl0IGhhbmRsZXMgYSBkaWZmZXJlbnQgY2FzZSB0aGFuIGluIGBjb2xsYXBzZV9zY2FuX3BtZCgpYC4gSW4gYGNvbGxhcHNlX3NjYW5fcG1kKClgLCB0aGUgaW5pdGlhbGl6YXRpb24gaXMgaW1wbGljaXQsIGJ1dCBJIG5lZWQgdG8gdmVyaWZ5IHRoYXQgYWxsIHRoZSBvbGQgYW5kIG5ldyBjb250ZXh0cyBhcmUgY29tcGFyYWJsZS4gVGhlIG9sZCBjb2RlIGhhZCBgaW50IHVubWFwcGVkID0gMDtgIGFuZCBzbyBvbiwgc28gbm93IEkgbmVlZCB0byBjaGVjayB0aGUgZGVmYXVsdCB2YWx1ZXMuIFNvIHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgYWxzbyAwLiBgbm9uZV9vcl96ZXJvYCBhbmQgYHNoYXJlZGAgYXJlIGFsc28gMC4gU28gbm8gZnVuY3Rpb25hbCBjaGFuZ2UgaGVyZS4KClRoZW4sIHRoZXJlIGlzIHRoZSBmdW5jdGlvbmFsIGVxdWl2YWxlbmNlIG9mIGB2bV9ub3JtYWxfZm9saW8oKWAgdnMgdGhlIG9sZCBgdm1fbm9ybWFsX3BhZ2UoKWAgJiM0MzsgYHBhZ2VfZm9saW8oKWAgY29tYmluYXRpb24uIEFsdGhvdWdoIHRoZXkgYXJlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IGZvciBtb3N0IGNhc2VzLCBgdm1fbm9ybWFsX2ZvbGlvKClgIG1pZ2h0IGJlIHNsaWdodGx5IGRpZmZlcmVudC4gU28gdGhpcyBwYXJ0IGlzIGFsc28gcmVmYWN0b3JpbmcuIFRoZSBzYW1lIGdvZXMgZm9yIHRoZSBhZGRpdGlvbiBvZiBgY291bnRfY29sbGFwc2VfZXZlbnQoKWAsIGl0IGlzIGEgc2ltcGxlIHJlZmFjdG9yaW5nLgoKV2FpdCwgbG9va2luZyBhdCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCwgSSBvYnNlcnZlIGEgY3JpdGljYWwgY2hhbmdlOiBgVk1fQlVHX09OX0ZPTElPYCBpcyBiZWluZyByZXBsYWNlZCBieSBgVk1fV0FSTl9PTl9GT0xJT2AuIFRoaXMgY2hhbmdlIGlzIGFsc28gYWRkZWQgaW4gYGNvbGxhcHNlX3NjYW5fcG1kKClgISBUaGlzIGlzIHBvdGVudGlhbGx5IHNpZ25pZmljYW50ISBJbiB0aGUgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAgY2FsbCBzaXRlLCB0aGUgb2xkIGNvZGUgaGFkIGEgYFZNX0JVR19PTl9GT0xJT2AgY2hlY2ssIGJ1dCBpdCBpcyByZXBsYWNlZCB3aXRoIGBWTV9XQVJOX09OX0ZPTElPYCBub3cuIEluIHRoZSBvdGhlciBjYWxsIHNpdGUsIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCwgaXQgdXNlZCB0byBzaW1wbHkgcmV0dXJuIGBTQ0FOX1BBR0VfQU5PTmAgd2hlbiBpdCBmb3VuZCBhIG5vbi1hbm9ueW1vdXMgcGFnZS4gTm93LCBpdCB3aWxsIHRyaWdnZXIgYSBgVk1fV0FSTl9PTl9GT0xJT2AgaWYgaXQmIzM5O3Mgbm90IGFub24hIFRoaXMgaXMgYSBkb3duZ3JhZGUgZm9yIG9uZSBjYWxsIHNpdGUsIGJ1dCBhbiBpbnRyb2R1Y3Rpb24gb2YgYSBuZXcgd2FybmluZyBmb3IgdGhlIG90aGVyLgoKU28gdGhlIHF1ZXN0aW9uIGJlY29tZXM6IGNhbiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgZXZlciBlbmNvdW50ZXIgYSBub24tYW5vbnltb3VzIGZvbGlvPyBJJiMzOTtsbCBuZWVkIHRvIHZlcmlmeSB0aGUgY2FsbCBwYXRocyBvZiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAsIHdoaWNoIGlzIGNhbGxlZCBmcm9tIGBraHVnZXBhZ2VkX3NjYW5fcG1kKClgLCB3aGljaCBpcyBjYWxsZWQgZnJvbSBga2h1Z2VwYWdlZF9zY2FuX21tX3Nsb3QoKWAuIEl0IHNjYW5zIGFub255bW91cyBWTUFzLCBtZWFuaW5nIHRoZSBub24tYW5vbiBmb2xpbyBtdXN0IGNvbWUgZnJvbSBhIHNvdXJjZSB0aGF0IGtodWdlcGFnZWQgaW50ZXJhY3RzIHdpdGguIEkmIzM5O20gdGhpbmtpbmcgdGhlIHplcm8gcGFnZSBpcyBoYW5kbGVkIGJ5IGBwdGVfbm9uZV9vcl96ZXJvKClgLiBJdCBsb29rcyBsaWtlIHRoaXMgbmV3IHdhcm5pbmcgY291bGQgYmUgdHJpZ2dlcmVkIGJ5IHNvbWV0aGluZyBsaWtlIGEgVk1BIGJlaW5nIGFub255bW91cywgYnV0IHRoZSB1bmRlcmx5aW5nIHBhZ2Ugbm90IGFjdHVhbGx5IGJlaW5nIGFub255bW91cy4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIGRvZXNuJiMzOTt0IGludHJvZHVjZSBhbnkgbmV3IGluc3RhYmlsaXR5IGR1ZSB0byBuZXcgd2FybmluZ3MuIEkmIzM5O2xsIG5lZWQgdG8gY2hlY2sgdGhlIFZNQSB0byB2ZXJpZnkgd2hldGhlciBga2h1Z2VwYWdlZGAgY2FuIGFjdHVhbGx5IGludGVyYWN0IHdpdGggdGhpcyBjYXNlIG9yIG5vdCwgYW5kIHdoZXRoZXIgdGhhdCBmb2xpbyBjYW4gYWN0dWFsbHkgYmUgbm9uLWFub24uCgpJJiMzOTttIG5vdyBnb2luZyB0byB1c2UgYGRlZmF1bHRfYXBpOmdyZXBwZXJgIHRvIHNlYXJjaCBmb3IgYGNvbGxhcHNlX3NjYW5fcG1kYCB0byB2ZXJpZnkgbXkgZmluZGluZ3MuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29sbGFwc2Vfc2Nhbl9wbWQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0va2h1Z2VwYWdlZC5jPTEyMjQ9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY2hlY2tfcG1kX3N0aWxsX3ZhbGlkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xMjM4LSAqIEJyaW5nIG1pc3NpbmcgcGFnZXMgaW4gZnJvbSBzd2FwLCB0byBjb21wbGV0ZSBUSFAgY29sbGFwc2UuXG5tbS9raHVnZXBhZ2VkLmM6MTIzOTogKiBPbmx5IGRvbmUgaWYgY29sbGFwc2Vfc2Nhbl9wbWQoKSBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLlxubW0va2h1Z2VwYWdlZC5jLTEyNDAtICpcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MTU2Mj1zdGF0aWMgdW5zaWduZWQgaW50IG1heF9vcmRlcl9mcm9tX29mZnNldCh1bnNpZ25lZCBpbnQgb2Zmc2V0KVxuLS1cbm1tL2todWdlcGFnZWQuYy0xNTcxLSAqIG10aHBfY29sbGFwc2UoKSBjb25zdW1lcyB0aGUgYml0bWFwIHRoYXQgaXMgZ2VuZXJhdGVkIGR1cmluZ1xubW0va2h1Z2VwYWdlZC5jOjE1NzI6ICogY29sbGFwc2Vfc2Nhbl9wbWQoKSB0byBkZXRlcm1pbmUgd2hhdCByZWdpb25zIGFuZCBtVEhQIG9yZGVycyBmaXQgYmVzdC5cbm1tL2todWdlcGFnZWQuYy0xNTczLSAqXG4tLVxubW0va2h1Z2VwYWdlZC5jPTE1ODc9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgbXRocF9jb2xsYXBzZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTY4OC1cbm1tL2todWdlcGFnZWQuYzoxNjg5OnN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxubW0va2h1Z2VwYWdlZC5jLTE2OTAtXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsXG4tLVxubW0va2h1Z2VwYWdlZC5jPTI4MTE9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2luZ2xlX3BtZCh1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTI4MjMtXHRpZiAodm1hX2lzX2Fub255bW91cyh2bWEpKSB7XG5tbS9raHVnZXBhZ2VkLmM6MjgyNDpcdFx0cmVzdWx0ID0gY29sbGFwc2Vfc2Nhbl9wbWQobW0sIHZtYSwgYWRkciwgbG9ja19kcm9wcGVkLCBjYyk7XG5tbS9raHVnZXBhZ2VkLmMtMjgyNS1cdFx0Z290byBlbmQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6Mzk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU1MjAKCQkJCQkJCW91dHB1dDogMjAKCQkJCQkJCXRob3VnaHRzOiA4MDgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEtlcm5lbCBCdWcgaW4gYGNvbGxhcHNlX3NjYW5fcG1kKClgKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgYW5kIGl0JiMzOTtzIGNhbGxlZCB3aGVuIHRoZSBWTUEgaXMgYW5vbnltb3VzLCBzcGVjaWZpY2FsbHkgd2hlbiBgdm1hX2lzX2Fub255bW91cyh2bWEpYCBpcyB0cnVlLiBNeSBmaXJzdCB0aG91Z2h0IGlzOiBjYW4gYW4gYW5vbnltb3VzIFZNQSAqYWN0dWFsbHkqIGNvbnRhaW4gYSBub24tYW5vbnltb3VzIGZvbGlvPyBJIGltbWVkaWF0ZWx5IGtub3cgdGhhdCBhIGBNQVBfUFJJVkFURWAgbWFwcGluZyBvZiBhIGZpbGUgd291bGQgcmV0dXJuIGZhbHNlIGZvciBgdm1hX2lzX2Fub255bW91cyh2bWEpYC4gQnV0IHdoYXQgYWJvdXQgYE1BUF9BTk9OWU1PVVMgfCBNQVBfU0hBUkVEYD8gVGhhdCYjMzk7cyBhIHNobWVtIFZNQSwgYWdhaW4sIGB2bWFfaXNfYW5vbnltb3VzKHZtYSlgIGlzIGZhbHNlLiAgQSBzdGFuZGFyZCBgbW1hcChNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUpYCBjcmVhdGVzIGFuICphbm9ueW1vdXMqIFZNQSwgYnV0IGNvdWxkIGl0IGhhdmUgYSBub24tYW5vbiBmb2xpbz8gIEkgY29uc2lkZXIgS1NNIHBhZ2VzLCBidXQgdGhleSYjMzk7cmUgYW5vbiwgc28gbm8gbHVjayB0aGVyZS4gVXByb2Jlcz8gU3RpbGwgYW5vbi4gUHRyYWNlIGluc2VydGVkIHBhZ2VzPyBTdGlsbCBhbm9uLgoKQWhhISBXaGF0IGlmIGEgZGV2aWNlIGRyaXZlciB1c2VzIGB2bV9pbnNlcnRfcGFnZSgpYCB0byBtYXAgcGFnZXMgaW50byBhbiBhbm9ueW1vdXMgVk1BPyBJZiBhIGRyaXZlciBkb2VzIGRvIGEgYHZtX2luc2VydF9wYWdlKClgIGludG8gYW4gYW5vbnltb3VzIFZNQSwgdGhhdCBwYWdlICptaWdodCogbm90IGJlIGFub255bW91cy4gR29vZC4gTGV0JiMzOTtzIHNlZS4uLiBgdm1fbm9ybWFsX2ZvbGlvKClgIHdpbGwgcmV0dXJuIHRoZSBmb2xpby4gSWYgaXQmIzM5O3Mgbm90IGFub24sIGBmb2xpb190ZXN0X2Fub24oKWAgd2lsbCByZXR1cm4gZmFsc2UuIEFuZCwgdGhlIGNydWNpYWwgcGFydCwgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCB3aWxsIHRyaWdnZXIgYSBgVk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGN0eC0mZ3Q7Zm9saW8pLCBjdHgtJmd0O2ZvbGlvKTtgLiBXYWl0LCBpcyB0aGlzIGEgYnVnIGluIHRoZSBwYXRjaD8gIEl0IGRpZG4mIzM5O3QgdXNlZCB0byBoYXZlIHRoYXQgd2FybmluZyEgTGV0IG1lIGNoZWNrIHRoZSBvcmlnaW5hbCBjb2RlLi4uCgpPa2F5LCBJIHNlZSBpdC4gVGhlIG9yaWdpbmFsIGNvZGUganVzdCByZXR1cm5lZCBgU0NBTl9QQUdFX0FOT05gLiBUaGUgbmV3IGNvZGUgbm93IGFkZHMgYSBgVk1fV0FSTl9PTl9GT0xJT2AsIHdoaWNoIG1lYW5zIHRoZSBjdXJyZW50IHBhdGNoIGludHJvZHVjZWQgYSBmdW5jdGlvbmFsIGNoYW5nZS4gVGhhdOKAmXMgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGZ1enplZCEKCkNhbiB3ZSBldmVuIHRyaWdnZXIgdGhpcyB3YXJuaW5nPyBIb3cgY291bGQgd2UgZ2V0IGEgbm9uLWFub24gcGFnZSBpbnRvIGFuIGFub24gVk1BPyBUaGUgYmVzdCB3YXkgSSB0aGluayB3b3VsZCBiZSBmb3Igc3l6a2FsbGVyIHRvIG1hcCBhIG5vbi1hbm9uIHBhZ2UgaW50byBhbiBhbm9ueW1vdXMgVk1BIGFuZCB0aGVuIHRyaWdnZXIga2h1Z2VwYWdlZCB0byBzY2FuIGl0LCB3aGljaCBzaG91bGQgdHJpZ2dlciB0aGUgd2FybmluZy4KCkkgc3RhcnQgcnVubmluZyB0aHJvdWdoIHBvc3NpYmxlIGF2ZW51ZXM6IGBtbWFwKE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSlgIHdvbiYjMzk7dCB3b3JrIHRvIG1hcCBhIG5vbi1hbm9uIHBhZ2UuIFdoYXQgYWJvdXQgYG1yZW1hcGA/IE5vLCBpdCBqdXN0IG1vdmVzIHRoZSB3aG9sZSBWTUEuIFdoYXQgYWJvdXQgYHZtc3BsaWNlYD8gV2hhdCBhYm91dCBgdXNlcmZhdWx0ZmRgPyBXaXRoIGBVRkZESU9fQ09QWWAsIGl0IGNvcGllcyBpbnRvIGFuIGFub24gcGFnZS4gQnV0IHdoYXQgYWJvdXQgYFVGRkRJT19DT05USU5VRWA/IFRoYXQmIzM5O3MgZm9yIHNobWVtL2h1Z2V0bGIuIGBtYWR2aXNlKE1BRFZfTUVSR0VBQkxFKWA/IEtTTSBwYWdlcyBhcmUgYW5vbiwgYWdhaW4uIGBPX0RJUkVDVGAgcmVhZCBpbnRvIGFuIGFub24gVk1BPyBQYWdlcyBhcmUgYW5vbi4gV2hhdCBhYm91dCBgZ2V0X3VzZXJfcGFnZXNgPwoKV2FpdCwgd2hhdCBpZiB3ZSB1c2UgYG1tYXBgIHRvIG1hcCBhIGZpbGUsIHRoZW4gYG1wcm90ZWN0YD8gTm8uIFdoYXQgYWJvdXQgYHJlbWFwX2ZpbGVfcGFnZXNgPyBJdCB3YXMgZGVwcmVjYXRlZC4KCk9rYXksIGxldCYjMzk7cyByZWNhcC4gSXQgaXMgcG9zc2libGUgdG8gdHJpZ2dlciB0aGlzIGNhc2UuIFRvIG1hcCBhIG5vbi1hbm9uIGZvbGlvIGludG8gYW5vbiBWTUEgd2Ugc2hvdWxkIHNlYXJjaCB0aHJvdWdoIHBvc3NpYmxlIHdheXMsIGZvciBleGFtcGxlOiBhIGRldmljZSBkcml2ZXIgdXNlcyBgdm1faW5zZXJ0X3BhZ2UoKWAgdG8gbWFwIHBhZ2VzIGludG8gYW4gYW5vbnltb3VzIFZNQS4gVGhpcyBpcyBkZWZpbml0ZWx5IGEgYnVnIGluIHRoZSBwYXRjaCEgTGV0JiMzOTtzIHNlYXJjaCBmb3IgYFNDQU5fUEFHRV9BTk9OYCBpbiB0aGUga2VybmVsIHNvdXJjZSB0byBzZWUgaWYgdGhpcyBpcyBhIGtub3duIGlzc3VlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjM5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O1NDQU5fUEFHRV9BTk9OJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgtMjYtXHRFTSggU0NBTl9QQUdFX0xPQ0ssXHRcdFwmIzM0O3BhZ2VfbG9ja2VkXCYjMzQ7KVx0XHRcdFxcXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oOjI3Olx0RU0oIFNDQU5fUEFHRV9BTk9OLFx0XHRcJiMzNDtwYWdlX25vdF9hbm9uXCYjMzQ7KVx0XHRcXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC0yOC1cdEVNKCBTQ0FOX1BBR0VfTEFaWUZSRUUsXHRcdFwmIzM0O3BhZ2VfbGF6eWZyZWVcJiMzNDspXHRcdFxcXG4tLVxubW0va2h1Z2VwYWdlZC5jPTMzPWVudW0gc2Nhbl9yZXN1bHQge1xuLS1cbm1tL2todWdlcGFnZWQuYy00OS1cdFNDQU5fUEFHRV9MT0NLLFxubW0va2h1Z2VwYWdlZC5jOjUwOlx0U0NBTl9QQUdFX0FOT04sXG5tbS9raHVnZXBhZ2VkLmMtNTEtXHRTQ0FOX1BBR0VfTEFaWUZSRUUsXG4tLVxubW0va2h1Z2VwYWdlZC5jPTc0Nz1zdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGVfdCBwdGV2YWwsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTc5Mi1cdFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGN0eC1cdTAwM2Vmb2xpbyksIGN0eC1cdTAwM2Vmb2xpbyk7XG5tbS9raHVnZXBhZ2VkLmM6NzkzOlx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfQU5PTik7XG5tbS9raHVnZXBhZ2VkLmMtNzk0LVx0fVxuLS1cbm1tL2todWdlcGFnZWQuYz0xMTUzPXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTExODYtXHRpZiAoZXhwZWN0X2Fub24gXHUwMDI2XHUwMDI2ICghKCp2bWFwKS1cdTAwM2Vhbm9uX3ZtYSB8fCAhdm1hX2lzX2Fub255bW91cygqdm1hcCkpKVxubW0va2h1Z2VwYWdlZC5jOjExODc6XHRcdHJldHVybiBTQ0FOX1BBR0VfQU5PTjtcbm1tL2todWdlcGFnZWQuYy0xMTg4LVx0cmV0dXJuIFNDQU5fU1VDQ0VFRDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzU5NQoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDY2NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEtodWdlcGFnZWQgQW5vbnltb3VzIFBhZ2UgQ29sbGFwc2UgTG9naWMqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoKWAgZnVuY3Rpb24gYW5kIEkgc2VlIGl0IHJldHVybnMgYFNDQU5fUEFHRV9BTk9OYCB3aGVuIGBleHBlY3RfYW5vbmAgaXMgdHJ1ZSwgYnV0IHRoZSBWTUEgaXNuJiMzOTt0IGFub255bW91cyBhbnltb3JlLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgJiMzNDtXaGVyZSBhcmUgd2UgY2hlY2tpbmcgdGhpcz8mIzM0OyBUaGVuIEkgcmVtZW1iZXIgdGhhdCBgY29sbGFwc2VfY2hlY2tfcHRlKClgIGlzIGNhbGxlZCB3aGVuIHNjYW5uaW5nIHRoZSBQVEVzLgoKTm93LCBoZXJlJiMzOTtzIHdoZXJlIGl0IGdldHMgaW50ZXJlc3RpbmcuIEkmIzM5O20gbG9va2luZyBhdCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBhbmQgcmVhbGl6ZSB0aGUgb2xkIGNvZGUgYWxyZWFkeSBoYWQgYFZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSwgZm9saW8pO2AuIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGFyZSBjb2xsYXBzaW5nIGFub24gcGFnZXMgYW5kIHRocm93cyBhIFZNIGJ1ZyBpZiBub3QuCgpUaGUgcGF0Y2ggcmVwbGFjZXMgdGhpcyB3aXRoIGBjb2xsYXBzZV9jaGVja19wdGUoKWAsIHdoaWNoIGhhcyBgVk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGN0eC0mZ3Q7Zm9saW8pLCBjdHgtJmd0O2ZvbGlvKTtgLiBTbywgdGhlIHBhdGNoIGFjdHVhbGx5ICpkb3duZ3JhZGVzKiBhIGBWTV9CVUdfT05fRk9MSU9gIHRvIGEgYFZNX1dBUk5fT05fRk9MSU9gIGluIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgISBBdCB0aGUgc2FtZSB0aW1lIGl0ICp1cGdyYWRlcyogYSBzaWxlbnQgcmV0dXJuIHRvIGBWTV9XQVJOX09OX0ZPTElPYCBpbiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAuCgpIb2xkIG9uLCBJIG5lZWQgdG8gdHJhY2UgdGhlIGNhbGwgZmxvdy4gYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAgaXMgY2FsbGVkIGZyb20gYGNvbGxhcHNlX2h1Z2VfcGFnZSgpYCwgd2hpY2ggaXMgY2FsbGVkICphZnRlciogYGNvbGxhcHNlX3NjYW5fcG1kKClgIGhhcyBzdWNjZWVkZWQuIFNvIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBzY2FucyB0aGUgUE1EIGFuZCBpZiBpdCBmaW5kcyBhIG5vbi1hbm9ueW1vdXMgZm9saW8sIGl0ICp1c2VkKiB0byBzaWxlbnRseSByZXR1cm4gYFNDQU5fUEFHRV9BTk9OYC4gSWYgaXQgKnN1Y2NlZWRlZCosIGFsbCB0aGUgZm9saW9zIHdlcmUgYW5vbnltb3VzLiBUaGVuLCBgY29sbGFwc2VfaHVnZV9wYWdlKClgIGlzIGNhbGxlZCwgd2hpY2ggY2FsbHMgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAuIEluIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgLCBpdCB1c2VkIHRvIGhhdmUgdGhlIGBWTV9CVUdfT05fRk9MSU9gLCBiZWNhdXNlIGl0ICphc3N1bWVkKiB0aGF0IHNpbmNlIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBhbHJlYWR5IGNoZWNrZWQsIGl0IG11c3QgYmUgYW5vbnltb3VzLgoKQnV0IHdhaXQgYSBtaW51dGXigKYgdGhlIGBtbWFwX2xvY2tgIGlzIGRyb3BwZWQgKmJldHdlZW4qIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBhbmQgYGNvbGxhcHNlX2h1Z2VfcGFnZSgpYCEgIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBkcm9wcyB0aGUgbG9jayBiZWZvcmUgY2FsbGluZyBgbXRocF9jb2xsYXBzZSgpYC4KCk5vdywgaXMgYG10aHBfY29sbGFwc2UoKWAgY2FsbGVkICppbnN0ZWFkKiBvZiBgY29sbGFwc2VfaHVnZV9wYWdlKClgPyAgTGV0JiMzOTtzIGNoZWNrIGBtdGhwX2NvbGxhcHNlKClgLi4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bXRocF9jb2xsYXBzZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9raHVnZXBhZ2VkLmM9MTU2Mj1zdGF0aWMgdW5zaWduZWQgaW50IG1heF9vcmRlcl9mcm9tX29mZnNldCh1bnNpZ25lZCBpbnQgb2Zmc2V0KVxuLS1cbm1tL2todWdlcGFnZWQuYy0xNTcwLS8qXG5tbS9raHVnZXBhZ2VkLmM6MTU3MTogKiBtdGhwX2NvbGxhcHNlKCkgY29uc3VtZXMgdGhlIGJpdG1hcCB0aGF0IGlzIGdlbmVyYXRlZCBkdXJpbmdcbm1tL2todWdlcGFnZWQuYy0xNTcyLSAqIGNvbGxhcHNlX3NjYW5fcG1kKCkgdG8gZGV0ZXJtaW5lIHdoYXQgcmVnaW9ucyBhbmQgbVRIUCBvcmRlcnMgZml0IGJlc3QuXG4tLVxubW0va2h1Z2VwYWdlZC5jLTE1ODYtICovXG5tbS9raHVnZXBhZ2VkLmM6MTU4NzpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBtdGhwX2NvbGxhcHNlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxubW0va2h1Z2VwYWdlZC5jLTE1ODgtXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50IHJlZmVyZW5jZWQsIGludCB1bm1hcHBlZCxcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MTY4OT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTcyOS1cdCAqIHNjYW4gYWxsIHBhZ2VzIHRvIHBvcHVsYXRlIHRoZSBiaXRtYXAgZm9yIG1USFAgY29sbGFwc2UuIFRoZSBiaXRtYXBcbm1tL2todWdlcGFnZWQuYzoxNzMwOlx0ICogaXMgdGhlbiBjaGVja2VkIGFnYWluIGluIG10aHBfY29sbGFwc2UoKSBmb3IgZWFjaCBhdHRlbXB0ZWQgb3JkZXIuXG5tbS9raHVnZXBhZ2VkLmMtMTczMS1cdCAqL1xuLS1cbm1tL2todWdlcGFnZWQuYy0xODA3LVx0XHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcbm1tL2todWdlcGFnZWQuYzoxODA4Olx0XHRyZXN1bHQgPSBtdGhwX2NvbGxhcHNlKG1tLCBzdGFydF9hZGRyLCByZWZlcmVuY2VkLFxubW0va2h1Z2VwYWdlZC5jLTE4MDktXHRcdFx0XHQgICAgICAgY3R4LnVubWFwcGVkLCBjYywgZW5hYmxlZF9vcmRlcnMpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5MjQ0CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKkFuYWx5emluZyB0aGUgRnVuY3Rpb24gQ2FsbDogYG10aHBfY29sbGFwc2UoKWAqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBUaGUgbWVudGFsIHRyaWdnZXIgaGVyZSBpcyBzZWVpbmcgdGhhdCBmdW5jdGlvbiBjYWxsOiBgbXRocF9jb2xsYXBzZSgpYC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGltbWVkaWF0ZWx5IHN0YXJ0IHBhcnNpbmcgd2hhdCB0aGF0ICptZWFucyouIEJhc2VkIG9uIHRoZSBuYW1pbmcgY29udmVudGlvbiAoYXNzdW1pbmcgdGhpcyBpcyBteSBvd24gY29kZWJhc2Ugb3Igb25lIEkmIzM5O20gdmVyeSBmYW1pbGlhciB3aXRoKSwgdGhlICYjMzQ7bXRocCYjMzQ7IHN0cm9uZ2x5IHN1Z2dlc3RzIHRoaXMgaXMgcmVsYXRlZCB0byBzb21ldGhpbmcgbGlrZSAmIzM0O011bHRpLXRocmVhZGVkIEhpZXJhcmNoaWNhbCBQcm9jZXNzaW5nLCYjMzQ7IG9yIG1heWJlIGEgc2ltaWxhciBzdHJ1Y3R1cmUgdGhhdCB1dGlsaXplcyBjb2xsYXBzZSBvcGVyYXRpb24gZm9yIHBhcmFsbGVsaXNtLiBUaGUgbmFtZSAmIzM0O2NvbGxhcHNlJiMzNDsgaXMgY3JpdGljYWwgaGVyZS4gSXQgaGludHMgYXQgc29tZSBraW5kIG9mIHJlZHVjdGlvbiBvciBhZ2dyZWdhdGlvbiBwcm9jZXNzIGFwcGxpZWQgdG8gYSBoaWVyYXJjaGljYWwgb3IgcGFyYWxsZWwgZGF0YSBzdHJ1Y3R1cmUuIEkmIzM5O20gYWxyZWFkeSBhbnRpY2lwYXRpbmcga2V5IGVsZW1lbnRzIG9mIGl0IG1pZ2h0IGJlIHJlbGF0ZWQgdG8gZWl0aGVyIGRhdGEgcmVkdWN0aW9uIChhICYjMzk7Y29sbGFwc2UmIzM5OyBpbnRvIGFnZ3JlZ2F0ZSBkYXRhKSBvciB0aHJlYWQgc3luY2hyb25pemF0aW9uIGFuZCB3YWl0aW5nLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgaGllcmFyY2hpY2FsIGFzcGVjdCBhbmQgdGhyZWFkaW5nIHJlbGF0aW9uc2hpcCBvZiB0aGF0IHNwZWNpZmljIGNvbnRleHQgdG8gdW5kZXJzdGFuZCB3aGF0IHR5cGUgb2YgaW5mb3JtYXRpb24gYW5kIGRhdGEgaXMgcGFzc2VkLiBUaGUgZ29hbCB3b3VsZCBsaWtlbHkgYmUgdG8gcmVkdWNlIHRoZSBjb21wbGV4aXR5IG9mIHRoZSBkYXRhIGJ5IG1lcmdpbmcgb3IgZ3JvdXBpbmcgZGF0YSBpbiBhbiBvcmRlcmx5IGZhc2hpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjQwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0va2h1Z2VwYWdlZC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTU4NywKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNTg3Olx0c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgbXRocF9jb2xsYXBzZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbjE1ODg6XHRcdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgcmVmZXJlbmNlZCwgaW50IHVubWFwcGVkLFxuMTU4OTpcdFx0XHRzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsIHVuc2lnbmVkIGxvbmcgZW5hYmxlZF9vcmRlcnMpXG4xNTkwOlx0e1xuMTU5MTpcdFx0dW5zaWduZWQgaW50IG5yX29jY3VwaWVkX3B0ZXMsIG5yX3B0ZXMsIG1heF9wdGVzX25vbmU7XG4xNTkyOlx0XHRlbnVtIHNjYW5fcmVzdWx0IGxhc3RfcmVzdWx0ID0gU0NBTl9GQUlMO1xuMTU5MzpcdFx0aW50IGNvbGxhcHNlZCA9IDA7XG4xNTk0Olx0XHRib29sIGFsbG9jX2ZhaWxlZCA9IGZhbHNlO1xuMTU5NTpcdFx0dW5zaWduZWQgbG9uZyBjb2xsYXBzZV9hZGRyZXNzO1xuMTU5NjpcdFx0dW5zaWduZWQgaW50IG9mZnNldCA9IDA7XG4xNTk3Olx0XHR1bnNpZ25lZCBpbnQgb3JkZXIgPSBIUEFHRV9QTURfT1JERVI7XG4xNTk4Olx0XG4xNTk5Olx0XHR3aGlsZSAob2Zmc2V0IFx1MDAzYyBIUEFHRV9QTURfTlIpIHtcbjE2MDA6XHRcdFx0bnJfcHRlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4xNjAxOlx0XG4xNjAyOlx0XHRcdGlmICghdGVzdF9iaXQob3JkZXIsIFx1MDAyNmVuYWJsZWRfb3JkZXJzKSlcbjE2MDM6XHRcdFx0XHRnb3RvIG5leHRfb3JkZXI7XG4xNjA0Olx0XG4xNjA1Olx0XHRcdG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCBOVUxMLCBvcmRlcik7XG4xNjA2Olx0XHRcdG5yX29jY3VwaWVkX3B0ZXMgPSBiaXRtYXBfd2VpZ2h0X2Zyb20oY2MtXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMsIG9mZnNldCxcbjE2MDc6XHRcdFx0XHRcdFx0XHQgICAgICBvZmZzZXQgJiM0MzsgbnJfcHRlcyk7XG4xNjA4Olx0XG4xNjA5Olx0XHRcdC8qXG4xNjEwOlx0XHRcdCAqIFN3YXAgUFRFcyBhY2NlcHRlZCBkdXJpbmcgdGhlIHNjYW4gYXJlIGNvdW50ZWQgaW4gQHVubWFwcGVkLFxuMTYxMTpcdFx0XHQgKiBub3QgaW4gdGhlIHByZXNlbnQtUFRFIGJpdG1hcC4gQWNjb3VudCB0aGVtIGZvciB0aGUgUE1ELW9yZGVyXG4xNjEyOlx0XHRcdCAqIGNhbmRpZGF0ZS5cbjE2MTM6XHRcdFx0ICovXG4xNjE0Olx0XHRcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuMTYxNTpcdFx0XHRcdG5yX29jY3VwaWVkX3B0ZXMgJiM0Mzs9IHVubWFwcGVkO1xuMTYxNjpcdFxuMTYxNzpcdFx0XHRpZiAobnJfb2NjdXBpZWRfcHRlcyBcdTAwM2U9IG5yX3B0ZXMgLSBtYXhfcHRlc19ub25lKSB7XG4xNjE4Olx0XHRcdFx0ZW51bSBzY2FuX3Jlc3VsdCByZXQ7XG4xNjE5Olx0XG4xNjIwOlx0XHRcdFx0Y29sbGFwc2VfYWRkcmVzcyA9IGFkZHJlc3MgJiM0Mzsgb2Zmc2V0ICogUEFHRV9TSVpFO1xuMTYyMTpcdFx0XHRcdHJldCA9IGNvbGxhcHNlX2h1Z2VfcGFnZShtbSwgY29sbGFwc2VfYWRkcmVzcywgcmVmZXJlbmNlZCxcbjE2MjI6XHRcdFx0XHRcdFx0XHQgdW5tYXBwZWQsIGNjLCBvcmRlcik7XG4xNjIzOlx0XG4xNjI0Olx0XHRcdFx0c3dpdGNoIChyZXQpIHtcbjE2MjU6XHRcdFx0XHQvKiBDYXNlcyB3aGVyZSB3ZSBjb250aW51ZSB0byBuZXh0IGNvbGxhcHNlIGNhbmRpZGF0ZSAqL1xuMTYyNjpcdFx0XHRcdGNhc2UgU0NBTl9TVUNDRUVEOlxuMTYyNzpcdFx0XHRcdFx0Y29sbGFwc2VkICYjNDM7PSBucl9wdGVzO1xuMTYyODpcdFx0XHRcdFx0ZmFsbHRocm91Z2g7XG4xNjI5Olx0XHRcdFx0Y2FzZSBTQ0FOX1BURV9NQVBQRURfSFVHRVBBR0U6XG4xNjMwOlx0XHRcdFx0XHRnb3RvIG5leHRfb2Zmc2V0O1xuMTYzMTpcdFx0XHRcdC8qIENhc2VzIHdoZXJlIGxvd2VyIG9yZGVycyBtaWdodCBzdGlsbCBzdWNjZWVkICovXG4xNjMyOlx0XHRcdFx0Y2FzZSBTQ0FOX0FMTE9DX0hVR0VfUEFHRV9GQUlMOlxuMTYzMzpcdFx0XHRcdFx0YWxsb2NfZmFpbGVkID0gdHJ1ZTtcbjE2MzQ6XHRcdFx0XHRcdGZhbGx0aHJvdWdoO1xuMTYzNTpcdFx0XHRcdGNhc2UgU0NBTl9MQUNLX1JFRkVSRU5DRURfUEFHRTpcbjE2MzY6XHRcdFx0XHRjYXNlIFNDQU5fRVhDRUVEX05PTkVfUFRFOlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDMzNQoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDI0ODkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHlzaXMgb2YgSHVnZSBQYWdlIENvbGxhcHNlIENvZGUgQ2hhbmdlcyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgcHJvY2VzcyBmb2N1c2VkIG9uIHRoZSBmbG93IG9mIGBtdGhwX2NvbGxhcHNlKClgIGNhbGxpbmcgYGNvbGxhcHNlX2h1Z2VfcGFnZSgpYC4gVGhlIGtleSBjb25jZXJuIHdhcyB0aGUgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gZHJvcHBpbmcgYW5kIHJlYWNxdWlyaW5nIHRoZSBtbWFwX2xvY2sgYW5kIHRoZSBtb2RpZmljYXRpb24gb2YgUFRFcy4gVGhlIHJldmFsaWRhdGlvbiB0aHJvdWdoIGBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZSgpYCBzZWVtZWQgbGlrZSBhIHBvdGVudGlhbCBzYWZlZ3VhcmQuCgpNeSBtaW5kIHRoZW4ganVtcGVkIHRvIHRoZSBjcml0aWNhbCBwb2ludDogdGhlIGhhbmRsaW5nIG9mIG5vbi1hbm9ueW1vdXMgcGFnZXMgd2l0aGluIGFuIGFub255bW91cyBWTUEuIFNwZWNpZmljYWxseSwgSSBjb25zaWRlcmVkIHNjZW5hcmlvcyBsaWtlIHplcm8gcGFnZXMsIEtTTSBwYWdlcywgYW5kIHBhZ2VzIGZyb20gZmlsZXMuIFRoZSBgdm1faW5zZXJ0X3BhZ2UoKWAgZnVuY3Rpb24mIzM5O3MgYWJpbGl0eSB0byBtYXAgbm9uLWFub24gcGFnZXMgaW50byBhbnkgVk1BIHJhaXNlZCBhIHJlZCBmbGFnLiBUaGlzIGJyb3VnaHQgdGhlIGBWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oY3R4LSZndDtmb2xpbyksIGN0eC0mZ3Q7Zm9saW8pO2AgY2hlY2ssIHdoaWNoIHJlcGxhY2VkIGEgYFZNX0JVR19PTl9GT0xJT2AgZnJvbSB0aGUgb2xkZXIgY29kZS4gU28gdGhlIGNoYW5nZSByZXN1bHRlZCBpbiBhIGRvd25ncmFkZSBmcm9tIGEgQlVHIHRvIGEgV0FSTi4gQW5kIGFsc28gdGhlIGNvZGUgbm93IFdBUk5TIGluIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCB3aGVyZSBpdCB1c2VkIHRvIGp1c3QgcmV0dXJuLgoKSSB3ZW50IGludG8gaW52ZXN0aWdhdGluZyB3aGF0IGhhcHBlbnMgaW5zaWRlIGBjb2xsYXBzZV9jaGVja19wdGUoKWAsIHdoZXJlIGl0JiMzOTtzIGNhbGxlZCBmcm9tIGJvdGggYGNvbGxhcHNlX3NjYW5fcG1kKClgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYC4gVGhlIGFkZGl0aW9uIG9mIHRoZSBXQVJOIGluIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSwgYXMgaXQgaW50cm9kdWNlcyBhIHdhcm5pbmcgd2hlcmUgcHJldmlvdXNseSwgdGhlcmUgd2FzIG5vbmUuIEkgd29uZGVyZWQgaWYgdGhpcyBhZGRzIGEgd2FybmluZy4KCkkgY2hlY2tlZCBgcHRlX2lzX3JlZmVyZW5jZWQoKWAsIGNvbXBhcmluZyB0aGUgb2xkIGFuZCBuZXcgaW5saW5lIGNvZGUuIEl0JiMzOTtzIHVuY2hhbmdlZCwgd2hpY2ggaXMgZ29vZC4gVGhlbiwgSSBsb29rZWQgYXQgdGhlIGhhbmRsaW5nIG9mIHNoYXJlZCBwYWdlcyBhbmQgdW5tYXBwZWQgcGFnZXMgd2l0aGluIGJvdGggYGNvbGxhcHNlX3NjYW5fcG1kKClgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCwgYW5kIHRoZXNlIHNlY3Rpb25zIGFyZSBhbHNvIHRoZSBzYW1lLiBUaGUgVUZGRCAodXNlcmZhdWx0ZmQpIGhhbmRsaW5nIGlzIGFsc28gY29uc2lzdGVudCBhY3Jvc3MgYm90aCBvbGQgYW5kIG5ldyBjb2RlLgoKRmluYWxseSwgdGhlIGNoYW5nZSB0byBgY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oKWAgYWRkcyBhIG5ldyBmdW5jdGlvbiB0aGF0IGluaXRpYWxpemVzIHRoZSBzY2FuLCBob3dldmVyIHRoZSBjb2RlIGFsc28gaGFzIGEgYGJpdG1hcF96ZXJvKClgIGNhbGwgdGhhdCB3YXMgKm5vdCogaW4gYGNvbGxhcHNlX3NjYW5fZmlsZSgpYCBiZWZvcmUuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgYW5kIGBjb2xsYXBzZV9zY2FuX2ZpbGUoKWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjQwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbGxhcHNlX3NjYW5fZmlsZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9raHVnZXBhZ2VkLmM9MjI2OT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTI3MDAtXG5tbS9raHVnZXBhZ2VkLmM6MjcwMTpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG5tbS9raHVnZXBhZ2VkLmMtMjcwMi1cdFx0dW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgcGdvZmZfdCBzdGFydCxcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MjgxMT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zaW5nbGVfcG1kKHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMjgzMy1yZXRyeTpcbm1tL2todWdlcGFnZWQuYzoyODM0Olx0cmVzdWx0ID0gY29sbGFwc2Vfc2Nhbl9maWxlKG1tLCBhZGRyLCBmaWxlLCBwZ29mZiwgY2MpO1xubW0va2h1Z2VwYWdlZC5jLTI4MzUtXG4tLVxubW0vbXJlbWFwLmM9MTk3PXN0YXRpYyBpbnQgbW92ZV9wdGVzKHN0cnVjdCBwYWdldGFibGVfbW92ZV9jb250cm9sICpwbWMsXG4tLVxubW0vbXJlbWFwLmMtMjQ2LVx0Lypcbm1tL21yZW1hcC5jOjI0NzpcdCAqIE5vdyBuZXdfcHRlIGlzIG5vbmUsIHNvIGNvbGxhcHNlX3NjYW5fZmlsZSgpIHBhdGggY2FuIG5vdCBmaW5kXG5tbS9tcmVtYXAuYy0yNDgtXHQgKiB0aGlzIGJ5IHRyYXZlcnNpbmcgZmlsZS1cdTAwM2VmX21hcHBpbmcsIHNvIHRoZXJlIGlzIG5vIGNvbmN1cnJlbmN5IHdpdGhcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjM2ODEKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAzMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIGhvdyBJJiMzOTtkIGFwcHJvYWNoIHRoaXMgdGFzaywgYXMgaWYgdGhlc2Ugd2VyZSBteSBpbnRlcm5hbCB0aG91Z2h0czoKCioqQW5hbHl6aW5nIGBjb2xsYXBzZV9zY2FuX2ZpbGUoKWAgZm9yIGBjYy0mZ3Q7bXRocF9wcmVzZW50X3B0ZXNgIFVzYWdlKioKClJpZ2h0LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYGNjLSZndDttdGhwX3ByZXNlbnRfcHRlc2AgaXMgYmVpbmcgdXNlZC4gVGhlIG1vc3QgbG9naWNhbCBwbGFjZSB0byBzdGFydCBpcyB3aXRoaW4gdGhlIGBjb2xsYXBzZV9zY2FuX2ZpbGUoKWAgZnVuY3Rpb24uIEkgd2FudCB0byBzZWUgaWYgdGhpcyBwYXJ0aWN1bGFyIG1lbWJlciBvZiB0aGUgYGNjYCAocHJlc3VtYWJseSBzb21lIGtpbmQgb2YgY29udHJvbCBjb250ZXh0IG9yIGNhY2hlIHN0cnVjdHVyZSkgaXMgYWN0dWFsbHkgYWNjZXNzZWQgYW5kIG1hbmlwdWxhdGVkIHdpdGhpbiB0aGF0IGZ1bmN0aW9uLiBJJiMzOTtsbCBuZWVkIHRvIGNhcmVmdWxseSBleGFtaW5lIHRoZSBjb2RlIHdpdGhpbiBgY29sbGFwc2Vfc2Nhbl9maWxlKClgIHRvIGNvbmZpcm0gaXRzIHVzYWdlLiBLbm93aW5nIHdoZXJlIHRoaXMgdmFyaWFibGUgaXMgdXNlZCBpcyBjcml0aWNhbCBmb3IgdW5kZXJzdGFuZGluZyBpdHMgcHVycG9zZSBhbmQgaW1wYWN0LiBJJiMzOTtsbCBuZWVkIHRvIGNoZWNrIHRoZSBmdW5jdGlvbiwgbGluZSBieSBsaW5lLCB0byBzZWUgaWYgdGhlIHZhcmlhYmxlIGlzIGRpcmVjdGx5IHVzZWQgb3IgaWYgYW5vdGhlciB2YXJpYWJsZSB3aGljaCB1c2VzIGl0IGlzIHVzZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjQwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0va2h1Z2VwYWdlZC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjcwMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyNzAxOlx0c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuMjcwMjpcdFx0XHR1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBmaWxlICpmaWxlLCBwZ29mZl90IHN0YXJ0LFxuMjcwMzpcdFx0XHRzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXG4yNzA0Olx0e1xuMjcwNTpcdFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCBOVUxMLCBIUEFHRV9QTURfT1JERVIpO1xuMjcwNjpcdFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpO1xuMjcwNzpcdFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IE5VTEw7XG4yNzA4Olx0XHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZpbGUtXHUwMDNlZl9tYXBwaW5nO1xuMjcwOTpcdFx0WEFfU1RBVEUoeGFzLCBcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIHN0YXJ0KTtcbjI3MTA6XHRcdGludCBwcmVzZW50LCBzd2FwO1xuMjcxMTpcdFx0aW50IG5vZGUgPSBOVU1BX05PX05PREU7XG4yNzEyOlx0XHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcbjI3MTM6XHRcbjI3MTQ6XHRcdHByZXNlbnQgPSAwO1xuMjcxNTpcdFx0c3dhcCA9IDA7XG4yNzE2Olx0XHRjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7XG4yNzE3Olx0XHRyY3VfcmVhZF9sb2NrKCk7XG4yNzE4Olx0XHR4YXNfZm9yX2VhY2goXHUwMDI2eGFzLCBmb2xpbywgc3RhcnQgJiM0MzsgSFBBR0VfUE1EX05SIC0gMSkge1xuMjcxOTpcdFx0XHRpZiAoeGFzX3JldHJ5KFx1MDAyNnhhcywgZm9saW8pKVxuMjcyMDpcdFx0XHRcdGNvbnRpbnVlO1xuMjcyMTpcdFxuMjcyMjpcdFx0XHRpZiAoeGFfaXNfdmFsdWUoZm9saW8pKSB7XG4yNzIzOlx0XHRcdFx0c3dhcCAmIzQzOz0gMSBcdTAwM2NcdTAwM2MgeGFzX2dldF9vcmRlcihcdTAwMjZ4YXMpO1xuMjcyNDpcdFx0XHRcdGlmIChzd2FwIFx1MDAzZSBtYXhfcHRlc19zd2FwKSB7XG4yNzI1Olx0XHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TV0FQX1BURTtcbjI3MjY6XHRcdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSk7XG4yNzI3Olx0XHRcdFx0XHRicmVhaztcbjI3Mjg6XHRcdFx0XHR9XG4yNzI5Olx0XHRcdFx0Y29udGludWU7XG4yNzMwOlx0XHRcdH1cbjI3MzE6XHRcbjI3MzI6XHRcdFx0aWYgKCFmb2xpb190cnlfZ2V0KGZvbGlvKSkge1xuMjczMzpcdFx0XHRcdHhhc19yZXNldChcdTAwMjZ4YXMpO1xuMjczNDpcdFx0XHRcdGNvbnRpbnVlO1xuMjczNTpcdFx0XHR9XG4yNzM2Olx0XG4yNzM3Olx0XHRcdGlmICh1bmxpa2VseShmb2xpbyAhPSB4YXNfcmVsb2FkKFx1MDAyNnhhcykpKSB7XG4yNzM4Olx0XHRcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbjI3Mzk6XHRcdFx0XHR4YXNfcmVzZXQoXHUwMDI2eGFzKTtcbjI3NDA6XHRcdFx0XHRjb250aW51ZTtcbjI3NDE6XHRcdFx0fVxuMjc0MjpcdFxuMjc0MzpcdFx0XHRpZiAoaXNfcG1kX29yZGVyKGZvbGlvX29yZGVyKGZvbGlvKSkpIHtcbjI3NDQ6XHRcdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9NQVBQRURfSFVHRVBBR0U7XG4yNzQ1Olx0XHRcdFx0LypcbjI3NDY6XHRcdFx0XHQgKiBQTUQtc2l6ZWQgVEhQIGltcGxpZXMgdGhhdCB3ZSBjYW4gb25seSB0cnlcbjI3NDc6XHRcdFx0XHQgKiByZXRyYWN0aW5nIHRoZSBQVEUgdGFibGUuXG4yNzQ4Olx0XHRcdFx0ICovXG4yNzQ5Olx0XHRcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbjI3NTA6XHRcdFx0XHRicmVhaztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjQ3MjAKCQkJCQkJCW91dHB1dDogMTkKCQkJCQkJCXRob3VnaHRzOiAyNjI3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIENvbGxhcHNlIENvZGUgQ2hhbmdlcyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgd2FzIGZvY3VzZWQgb24gY29uZmlybWluZyB0aGF0IGNlcnRhaW4gb3B0aW1pemF0aW9ucyBpbiBgY29sbGFwc2Vfc2Nhbl9maWxlKClgIHdvdWxkbiYjMzk7dCBpbmFkdmVydGVudGx5IGltcGFjdCB0aGUgb3ZlcmFsbCBjb2xsYXBzZSBsb2dpYy4gU3BlY2lmaWNhbGx5LCB0aGUgemVyb2luZyBvZiBgY2MtJmd0O210aHBfcHJlc2VudF9wdGVzYCBpbiB0aGF0IHNwZWNpZmljIGZ1bmN0aW9uIGFwcGVhcmVkIHNhZmUsIGFzIGl0JiMzOTtzIG5vdCBkaXJlY3RseSB1dGlsaXplZCB3aXRoaW4gdGhlIGZ1bmN0aW9uJiMzOTtzIHNjb3BlLiBIb3dldmVyLCB0aGlzIHRyaWdnZXJlZCBhIG5lZWQgdG8gbW9yZSByaWdvcm91c2x5IGludmVzdGlnYXRlIHRoZSBzdXJyb3VuZGluZyBjb2RlLgoKVGhlIGZpcnN0IGFyZWEgb2YgY29uY2VybiB3YXMgYXJvdW5kIHRoZSBsYXp5ZnJlZSBoYW5kbGluZywgc3BlY2lmaWNhbGx5IHdpdGhpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBhbmQgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYC4gSXQmIzM5O3MgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZDogd2Ugd2FudCB0byBwcmVzZXJ2ZSBsYXp5ZnJlZSBwYWdlcyBpZiB0aGUgVk1BIGhhcyB0aGUgYFZNX0RST1BQQUJMRWAgZmxhZyBzZXQsIGFuZCB0aGUgcGFnZSBpcyBhY3R1YWxseSBsYXp5ZnJlZSBhbmQgbm90IGRpcnR5LiBUaGUgY2hlY2sgaW4gdGhlIG5ldyBjb2RlIHVzaW5nIHRoZSBjb250ZXh0IHN0cnVjdHVyZSAoYGN0eGApIGFwcGVhcnMgZnVuY3Rpb25hbGx5IGlkZW50aWNhbCB0byB0aGUgb2xkZXIgaW1wbGVtZW50YXRpb24uIFdlIGFyZSBqdXN0IHVzaW5nIHRoZSBjb250ZXh0IHRvIHBhc3MgZGF0YSwgYXMgaXMgcHJvcGVyLgoKTmV4dCwgSSBsb29rZWQgYXQgdGhlICYjMzQ7eW91bmcmIzM0OyBwYWdlIGNoZWNrLCB3aGljaCBkZXRlcm1pbmVzIGlmIGEgUFRFIGlzICYjMzQ7eW91bmcmIzM0OyBlbm91Z2ggdG8ganVzdGlmeSBjb2xsYXBzaW5nLiBUaGUgbG9naWMgd2l0aGluIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgIGFuZCBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgYXBwZWFycyB0byBiZSBpZGVudGljYWwgYXMgd2VsbC4gVGhlIG9sZCBgcHRlX3lvdW5nKClgIGFuZCBmb2xpbyBjaGVja3MsIGFzIHdlbGwgYXMgdGhlIE1NVSBub3RpZmllciBjaGVjaywgaGF2ZSBiZWVuIGNvbnNvbGlkYXRlZCBpbnRvIGBwdGVfaXNfcmVmZXJlbmNlZCgpYCwgYnV0IHRoZSBiZWhhdmlvciBpcywgZnJvbSB3aGF0IEkgY2FuIHRlbGwsIGV4YWN0bHkgdGhlIHNhbWUuCgpUaGUgbG9naWMgaW4gYGNvbGxhcHNlX3NjYW5fcG1kKClgIHRoYXQgZGV0ZXJtaW5lcyBpZiBhIGNvbGxhcHNlIHNob3VsZCBiZSBza2lwcGVkIGR1ZSB0byBhIGxhY2sgb2YgcmVmZXJlbmNlZCBwYWdlcyBhbHNvIGFwcGVhcnMgdG8gYmUgaWRlbnRpY2FsLgoKVGhlIG1vc3QgaW50ZXJlc3RpbmcgYXJlYSB0byBsb29rIGF0IHdhcyByZWxhdGVkIHRvIHVubWFwcGVkIFBURXMuIEluIHRoZSBvbGRlciBjb2RlLCBhIHNpbXBsZSBpbnRlZ2VyIHZhcmlhYmxlIGB1bm1hcHBlZGAgd2FzIHVzZWQgdG8gdHJhY2sgdGhlIG51bWJlciBvZiB1bm1hcHBlZCBQVEVzLiBUaGUgbmV3IGNvZGUsIGhvd2V2ZXIsIGxldmVyYWdlcyBhIGNvbnRleHQgc3RydWN0dXJlIGBjdHhgLCBhbmQgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIG9sZCBgdW5tYXBwZWRgIHZhcmlhYmxlIGlzIG5vdyBgY3R4LnVubWFwcGVkYC4gSSBoYWQgdG8gY29uZmlybSB0aGF0IGBjdHgudW5tYXBwZWRgIHdhcyBpbml0aWFsaXplZCB0byB0aGUgY29ycmVjdCB2YWx1ZSwgYW5kIGFsc28gdGhlIGNvcnJlY3QgYmVoYXZpb3Igb2YgdGhlIGxvZ2ljIHRoYXQgdXNlcyB0aGUgYHVubWFwcGVkYCB2YWx1ZXMgYW5kIGNvdW50cywgYmFzZWQgb24gdGhlIGBtYXhfcHRlc19zd2FwYCBwYXJhbWV0ZXIuIEJhc2VkIG9uIEMmIzM5O3Mgc3RydWN0dXJlIGluaXRpYWxpemF0aW9uIHJ1bGVzLCBhcyBpdCBpcyAqbm90KiBleHBsaWNpdGx5IGluaXRpYWxpemVkIGluIHRoZSBzdHJ1Y3QsIGl0IHdvdWxkIGRlZmF1bHQgdG8gemVyby4gVGhlIGluY3JlbWVudCBsb2dpYyBpcyBjb25zaXN0ZW50IGFzIHdlbGwuIFNvIGl0IGJlaGF2ZXMgaWRlbnRpY2FsbHkuCgpUaGUgY2hlY2tzIGZvciBgY3R4Lm5vbmVfb3JfemVyb2AsIGBjdHguc2hhcmVkYCwgYW5kIHRoZSBhc3NpZ25tZW50IG9mIGBjdHguZm9saW9gIGFuZCBgY3R4LnJlc3VsdGAgd2VyZSB0aGVuIGNvbmZpcm1lZCB0byBiZSBoYW5kbGVkIGNvcnJlY3RseSwgY29uZmlybWluZyB0aGF0IHRoZSBjb250ZXh0IHN0cnVjdCBiZWhhdmVkIGxpa2UgdGhlIG9sZCB2YXJpYWJsZXMuCgpMYXN0bHksIHRoZSBgY291bnRfY29sbGFwc2VfZXZlbnQoKWAgZnVuY3Rpb24gd2FzIGNvbXBhcmVkLCB0byBlbnN1cmUgbm8gbG9naWMgY2hhbmdlIHdhcyBtYWRlIHRvIHRoZSBzdGF0cy4gVGhlIGxvZ2ljIGlzIGlkZW50aWNhbC4gVGhpcyBhcHBlYXJzIHRvIGJlIGNvcnJlY3QsIGFuZCB0aGF0IGBjb3VudF92bV9ldmVudCgpYCBpcyBjYWxsZWQgd2l0aCBgVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFYCBpcyBjb3JyZWN0LgoKQWZ0ZXIgcmV2aWV3aW5nIHRoZXNlIGFyZWFzLCB0aGUgY29uY2x1c2lvbiBpcyB0aGF0IHRoZXJlIGFyZSAqbm8gZnVuY3Rpb25hbCBjaGFuZ2VzKi4gVGhlIGNvZGUgdXNlcyBhIGNvbnRleHQgc3RydWN0IGFuZCBpbmxpbmVzIHNvbWUgZnVuY3Rpb25zLCBidXQgdGhlIGJlaGF2aW9yIGlzIHRoZSBzYW1lLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt2bV9ub3JtYWxfZm9saW8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvcHJvYy90YXNrX21tdS5jPTE2OTA9c3RhdGljIGlubGluZSBib29sIHB0ZV9pc19waW5uZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgcHRlKVxuLS1cbmZzL3Byb2MvdGFza19tbXUuYy0xNjk5LVx0XHRyZXR1cm4gZmFsc2U7XG5mcy9wcm9jL3Rhc2tfbW11LmM6MTcwMDpcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlKTtcbmZzL3Byb2MvdGFza19tbXUuYy0xNzAxLVx0aWYgKCFmb2xpbylcbi0tXG5mcy9wcm9jL3Rhc2tfbW11LmM9MTc3MD1zdGF0aWMgaW50IGNsZWFyX3JlZnNfcHRlX3JhbmdlKHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5mcy9wcm9jL3Rhc2tfbW11LmMtMTgxNS1cbmZzL3Byb2MvdGFza19tbXUuYzoxODE2Olx0XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIGFkZHIsIHB0ZW50KTtcbmZzL3Byb2MvdGFza19tbXUuYy0xODE3LVx0XHRpZiAoIWZvbGlvKVxuLS1cbmluY2x1ZGUvbGludXgvbW0uaD0zMTQzPWV4dGVybiB2b2lkIHVzZXJfc2htX3VubG9jayhzaXplX3QsIHN0cnVjdCB1Y291bnRzICopO1xuaW5jbHVkZS9saW51eC9tbS5oLTMxNDQtXG5pbmNsdWRlL2xpbnV4L21tLmg6MzE0NTpzdHJ1Y3QgZm9saW8gKnZtX25vcm1hbF9mb2xpbyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuaW5jbHVkZS9saW51eC9tbS5oLTMxNDYtXHRcdFx0ICAgICBwdGVfdCBwdGUpO1xuaW5jbHVkZS9saW51eC9tbS5oPTMxNDc9c3RydWN0IHBhZ2UgKnZtX25vcm1hbF9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG5pbmNsdWRlL2xpbnV4L21tLmgtMzE0OC1cdFx0XHQgICAgIHB0ZV90IHB0ZSk7XG5pbmNsdWRlL2xpbnV4L21tLmg6MzE0OTpzdHJ1Y3QgZm9saW8gKnZtX25vcm1hbF9mb2xpb19wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5pbmNsdWRlL2xpbnV4L21tLmgtMzE1MC1cdFx0XHRcdCAgdW5zaWduZWQgbG9uZyBhZGRyLCBwbWRfdCBwbWQpO1xuLS1cbm1tL2RhbW9uL3ZhZGRyLmM9Mzg5PXN0YXRpYyBpbnQgZGFtb25feW91bmdfcG1kX2VudHJ5KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9kYW1vbi92YWRkci5jLTQwNC1cdFx0XHRnb3RvIGh1Z2Vfb3V0O1xubW0vZGFtb24vdmFkZHIuYzo0MDU6XHRcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvX3BtZCh3YWxrLVx1MDAzZXZtYSwgYWRkciwgcG1kZSk7XG5tbS9kYW1vbi92YWRkci5jLTQwNi1cdFx0aWYgKCFmb2xpbylcbi0tXG5tbS9kYW1vbi92YWRkci5jLTQyMy1cdFx0Z290byBvdXQ7XG5tbS9kYW1vbi92YWRkci5jOjQyNDpcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHdhbGstXHUwMDNldm1hLCBhZGRyLCBwdGVudCk7XG5tbS9kYW1vbi92YWRkci5jLTQyNS1cdGlmICghZm9saW8pXG4tLVxubW0vZGFtb24vdmFkZHIuYz02MzU9c3RhdGljIGludCBkYW1vc192YV9taWdyYXRlX3BtZF9lbnRyeShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vZGFtb24vdmFkZHIuYy02NTMtXHRcdFx0Z290byBodWdlX291dDtcbm1tL2RhbW9uL3ZhZGRyLmM6NjU0Olx0XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpb19wbWQod2Fsay1cdTAwM2V2bWEsIGFkZHIsIHBtZGUpO1xubW0vZGFtb24vdmFkZHIuYy02NTUtXHRcdGlmICghZm9saW8pXG4tLVxubW0vZGFtb24vdmFkZHIuYy02NzYtXHRcdFx0Y29udGludWU7XG5tbS9kYW1vbi92YWRkci5jOjY3NzpcdFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8od2Fsay1cdTAwM2V2bWEsIGFkZHIsIHB0ZW50KTtcbm1tL2RhbW9uL3ZhZGRyLmMtNjc4LVx0XHRpZiAoIWZvbGlvKVxuLS1cbm1tL2RhbW9uL3ZhZGRyLmM9Nzk1PXN0YXRpYyBpbnQgZGFtb3NfdmFfc3RhdF9wbWRfZW50cnkocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbm1tL2RhbW9uL3ZhZGRyLmMtODE0LVxubW0vZGFtb24vdmFkZHIuYzo4MTU6XHRcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvX3BtZCh2bWEsIGFkZHIsIHBtZGUpO1xubW0vZGFtb24vdmFkZHIuYy04MTYtXG4tLVxubW0vZGFtb24vdmFkZHIuYy04MzktXG5tbS9kYW1vbi92YWRkci5jOjg0MDpcdFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGVudCk7XG5tbS9kYW1vbi92YWRkci5jLTg0MS1cbi0tXG5tbS9odWdlX21lbW9yeS5jPTIyNzg9dm1fZmF1bHRfdCBkb19odWdlX3BtZF9udW1hX3BhZ2Uoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0yMzA3LVxubW0vaHVnZV9tZW1vcnkuYzoyMzA4Olx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW9fcG1kKHZtYSwgaGFkZHIsIHBtZCk7XG5tbS9odWdlX21lbW9yeS5jLTIzMDktXHRpZiAoIWZvbGlvKVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9MjQ2Mj1zdGF0aWMgc3RydWN0IGZvbGlvICpub3JtYWxfb3Jfc29mdGxlYWZfZm9saW9fcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMjQ2NS1cdGlmIChpc19wcmVzZW50KVxubW0vaHVnZV9tZW1vcnkuYzoyNDY2Olx0XHRyZXR1cm4gdm1fbm9ybWFsX2ZvbGlvX3BtZCh2bWEsIGFkZHIsIHBtZHZhbCk7XG5tbS9odWdlX21lbW9yeS5jLTI0NjctXG4tLVxubW0va2h1Z2VwYWdlZC5jPTc0Nz1zdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGVfdCBwdGV2YWwsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTc3OC1cbm1tL2todWdlcGFnZWQuYzo3Nzk6XHRjdHgtXHUwMDNlZm9saW8gPSB2bV9ub3JtYWxfZm9saW8oY3R4LVx1MDAzZXZtYSwgYWRkciwgcHRldmFsKTtcbm1tL2todWdlcGFnZWQuYy03ODAtXHRpZiAodW5saWtlbHkoIWN0eC1cdTAwM2Vmb2xpbykgfHwgdW5saWtlbHkoZm9saW9faXNfem9uZV9kZXZpY2UoY3R4LVx1MDAzZWZvbGlvKSkpXG4tLVxubW0va3NtLmM9NjE2PXN0YXRpYyBpbnQgYnJlYWtfa3NtX3BtZF9lbnRyeShwbWRfdCAqcG1kcCwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCxcbi0tXG5tbS9rc20uYy02MzgtXHRcdGlmIChwdGVfcHJlc2VudChwdGUpKSB7XG5tbS9rc20uYzo2Mzk6XHRcdFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8od2Fsay1cdTAwM2V2bWEsIGFkZHIsIHB0ZSk7XG5tbS9rc20uYy02NDAtXHRcdH0gZWxzZSBpZiAoIXB0ZV9ub25lKHB0ZSkpIHtcbi0tXG5tbS9tYWR2aXNlLmM9MzUzPXN0YXRpYyBpbnQgbWFkdmlzZV9jb2xkX29yX3BhZ2VvdXRfcHRlX3JhbmdlKHBtZF90ICpwbWQsXG4tLVxubW0vbWFkdmlzZS5jLTQ3NS1cbm1tL21hZHZpc2UuYzo0NzY6XHRcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xubW0vbWFkdmlzZS5jLTQ3Ny1cdFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXG4tLVxubW0vbWFkdmlzZS5jPTY1Mj1zdGF0aWMgaW50IG1hZHZpc2VfZnJlZV9wdGVfcmFuZ2UocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbm1tL21hZHZpc2UuYy03MDQtXG5tbS9tYWR2aXNlLmM6NzA1Olx0XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIGFkZHIsIHB0ZW50KTtcbm1tL21hZHZpc2UuYy03MDYtXHRcdGlmICghZm9saW8gfHwgZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pKVxuLS1cbm1tL21lbW9yeS5jPTgxOT1zdHJ1Y3QgcGFnZSAqdm1fbm9ybWFsX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9tZW1vcnkuYy04MjgtLyoqXG5tbS9tZW1vcnkuYzo4Mjk6ICogdm1fbm9ybWFsX2ZvbGlvKCkgLSBHZXQgdGhlIFwmIzM0O3N0cnVjdCBmb2xpb1wmIzM0OyBhc3NvY2lhdGVkIHdpdGggYSBQVEVcbm1tL21lbW9yeS5jLTgzMC0gKiBAdm1hOiBUaGUgVk1BIG1hcHBpbmcgdGhlIEBwdGUuXG4tLVxubW0vbWVtb3J5LmMtODM5LSAqL1xubW0vbWVtb3J5LmM6ODQwOnN0cnVjdCBmb2xpbyAqdm1fbm9ybWFsX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG5tbS9tZW1vcnkuYy04NDEtXHRcdFx0ICAgIHB0ZV90IHB0ZSlcbi0tXG5tbS9tZW1vcnkuYz04NjM9c3RydWN0IHBhZ2UgKnZtX25vcm1hbF9wYWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbm1tL21lbW9yeS5jLTg3Mi0vKipcbm1tL21lbW9yeS5jOjg3MzogKiB2bV9ub3JtYWxfZm9saW9fcG1kKCkgLSBHZXQgdGhlIFwmIzM0O3N0cnVjdCBmb2xpb1wmIzM0OyBhc3NvY2lhdGVkIHdpdGggYSBQTURcbm1tL21lbW9yeS5jLTg3NC0gKiBAdm1hOiBUaGUgVk1BIG1hcHBpbmcgdGhlIEBwbWQuXG4tLVxubW0vbWVtb3J5LmMtODgzLSAqL1xubW0vbWVtb3J5LmM6ODg0OnN0cnVjdCBmb2xpbyAqdm1fbm9ybWFsX2ZvbGlvX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbm1tL21lbW9yeS5jLTg4NS1cdFx0XHRcdCAgdW5zaWduZWQgbG9uZyBhZGRyLCBwbWRfdCBwbWQpXG4tLVxubW0vbWVtb3J5LmM9NjI4ND1zdGF0aWMgdm1fZmF1bHRfdCBkb19udW1hX3BhZ2Uoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXG4tLVxubW0vbWVtb3J5LmMtNjMxOS1cbm1tL21lbW9yeS5jOjYzMjA6XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIHZtZi1cdTAwM2VhZGRyZXNzLCBwdGUpO1xubW0vbWVtb3J5LmMtNjMyMS1cdGlmICghZm9saW8gfHwgZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pKVxuLS1cbm1tL21lbXBvbGljeS5jPTY4Nz1zdGF0aWMgaW50IHF1ZXVlX2ZvbGlvc19wdGVfcmFuZ2UocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbm1tL21lbXBvbGljeS5jLTcyMy1cdFx0fVxubW0vbWVtcG9saWN5LmM6NzI0Olx0XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIGFkZHIsIHB0ZW50KTtcbm1tL21lbXBvbGljeS5jLTcyNS1cdFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXG4tLVxubW0vbWVtcG9saWN5LmMtNzI5LVx0XHQvKlxubW0vbWVtcG9saWN5LmM6NzMwOlx0XHQgKiB2bV9ub3JtYWxfZm9saW8oKSBmaWx0ZXJzIG91dCB6ZXJvIHBhZ2VzLCBidXQgdGhlcmUgbWlnaHRcbm1tL21lbXBvbGljeS5jLTczMS1cdFx0ICogc3RpbGwgYmUgcmVzZXJ2ZWQgZm9saW9zIHRvIHNraXAsIHBlcmhhcHMgaW4gYSBWRFNPLlxuLS1cbm1tL21sb2NrLmM9MzUwPXN0YXRpYyBpbnQgbWxvY2tfcHRlX3JhbmdlKHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9tbG9jay5jLTM4Ny1cdFx0XHRjb250aW51ZTtcbm1tL21sb2NrLmM6Mzg4Olx0XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIGFkZHIsIHB0ZW50KTtcbm1tL21sb2NrLmMtMzg5LVx0XHRpZiAoIWZvbGlvIHx8IGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcbi0tXG5tbS9tcmVtYXAuYz0xNzg9c3RhdGljIGludCBtcmVtYXBfZm9saW9fcHRlX2JhdGNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vbXJlbWFwLmMtMTg5LVxubW0vbXJlbWFwLmM6MTkwOlx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGUpO1xubW0vbXJlbWFwLmMtMTkxLVx0aWYgKCFmb2xpbyB8fCAhZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXG4tLVxubW0vdXNlcmZhdWx0ZmQuYz0xMjgwPXN0YXRpYyBzdHJ1Y3QgZm9saW8gKmNoZWNrX3B0ZXNfZm9yX2JhdGNoZWRfbW92ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnNyY192bWEsXG4tLVxubW0vdXNlcmZhdWx0ZmQuYy0xMjk0LVxubW0vdXNlcmZhdWx0ZmQuYzoxMjk1Olx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8oc3JjX3ZtYSwgc3JjX2FkZHIsIG9yaWdfc3JjX3B0ZSk7XG5tbS91c2VyZmF1bHRmZC5jLTEyOTYtXHRpZiAoIWZvbGlvIHx8ICFmb2xpb190cnlsb2NrKGZvbGlvKSlcbi0tXG5tbS91c2VyZmF1bHRmZC5jPTE1MDM9c3RhdGljIGxvbmcgbW92ZV9wYWdlc19wdGVzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqZHN0X3BtZCwgcG1kX3QgKnNyY19wbWQsXG4tLVxubW0vdXNlcmZhdWx0ZmQuYy0xNjE5LVxubW0vdXNlcmZhdWx0ZmQuYzoxNjIwOlx0XHRcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHNyY192bWEsIHNyY19hZGRyLCBvcmlnX3NyY19wdGUpO1xubW0vdXNlcmZhdWx0ZmQuYy0xNjIxLVx0XHRcdGlmICghZm9saW8gfHwgIVBhZ2VBbm9uRXhjbHVzaXZlKFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UpKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjQwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMwODkyCgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogNDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGZyb20gbXkgcGVyc3BlY3RpdmUgYXMgc29tZW9uZSB3ZWxsLXZlcnNlZCBpbiBtZW1vcnkgbWFuYWdlbWVudDoKCioqRGlnZ2luZyBpbnRvIGB2bV9ub3JtYWxfZm9saW8oKWAqKgoKUmlnaHQsIHNvIGB2bV9ub3JtYWxfZm9saW8oKWAgaXMgZXNzZW50aWFsbHkgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiwgYSB3cmFwcGVyLCBpc24mIzM5O3QgaXQ/IEl0IGFwcGVhcnMgdG8gYmUgbm90aGluZyBtb3JlIHRoYW4gYSBzaW1wbGlmaWVkIHdheSB0byBvYnRhaW4gYSBmb2xpbyBiYXNlZCBvbiBhIG5vcm1hbCBwYWdlLCBzcGVjaWZpY2FsbHkgYnkgY2FsbGluZyBgcGFnZV9mb2xpbyh2bV9ub3JtYWxfcGFnZSgpKWAuIFRoYXQmIzM5O3MgdGhlIGNvcmUgb2YgaXRzIGZ1bmN0aW9uYWxpdHkuCgpUaGUgaW1wbGljYXRpb24gaXMgdGhhdCBpdCBoZWxwcyB0byByZWR1Y2UgcmVwZXRpdGlvbi4gSWYgYSBsb3Qgb2YgY29kZSBuZWVkcyB0byBvcGVyYXRlIG9uIHRoZSBmb2xpbyBvZiBhIG5vcm1hbCBwYWdlLCB0aGlzIGZ1bmN0aW9uIGp1c3QgcHJvdmlkZXMgYSBzaG9ydGhhbmQgbWV0aG9kLiBUaGUgZGV0YWlscyBhcmUgYWJzdHJhY3RlZCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgY2FsbGVyIGRvZXMgbm90IG5lZWQgdG8gcmVwZWF0ZWRseSBjYWxsIGBwYWdlX2ZvbGlvKHZtX25vcm1hbF9wYWdlKCkpYC4KCkxldCYjMzk7cyBkZWx2ZSBkZWVwZXIgYW5kIGNvbmZpcm0gdGhhdCBieSBleGFtaW5pbmcgdGhlIGltcGxlbWVudGF0aW9uIG9mIGB2bV9ub3JtYWxfZm9saW8oKWAgaXRzZWxmLiBXZSBjYW4gY29uZmlybSB3aGV0aGVyIGl0IGlzIGFjdHVhbGx5IGp1c3QgYSBzaW1wbGUgd3JhcHBlciBmdW5jdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnkuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDgzOSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgODM5Olx0ICovXG4gODQwOlx0c3RydWN0IGZvbGlvICp2bV9ub3JtYWxfZm9saW8oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbiA4NDE6XHRcdFx0XHQgICAgcHRlX3QgcHRlKVxuIDg0MjpcdHtcbiA4NDM6XHRcdHN0cnVjdCBwYWdlICpwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGUpO1xuIDg0NDpcdFxuIDg0NTpcdFx0aWYgKHBhZ2UpXG4gODQ2Olx0XHRcdHJldHVybiBwYWdlX2ZvbGlvKHBhZ2UpO1xuIDg0NzpcdFx0cmV0dXJuIE5VTEw7XG4gODQ4Olx0fVxuIDg0OTpcdFxuIDg1MDpcdCNpZmRlZiBDT05GSUdfUEdUQUJMRV9IQVNfSFVHRV9MRUFWRVNcbiA4NTE6XHQvKipcbiA4NTI6XHQgKiB2bV9ub3JtYWxfcGFnZV9wbWQoKSAtIEdldCB0aGUgXCYjMzQ7c3RydWN0IHBhZ2VcJiMzNDsgYXNzb2NpYXRlZCB3aXRoIGEgUE1EXG4gODUzOlx0ICogQHZtYTogVGhlIFZNQSBtYXBwaW5nIHRoZSBAcG1kLlxuIDg1NDpcdCAqIEBhZGRyOiBUaGUgYWRkcmVzcyB3aGVyZSB0aGUgQHBtZCBpcyBtYXBwZWQuXG4gODU1Olx0ICogQHBtZDogVGhlIFBNRC5cbiA4NTY6XHQgKlxuIDg1NzpcdCAqIEdldCB0aGUgXCYjMzQ7c3RydWN0IHBhZ2VcJiMzNDsgYXNzb2NpYXRlZCB3aXRoIGEgUFRFLiBTZWUgX192bV9ub3JtYWxfcGFnZSgpXG4gODU4Olx0ICogZm9yIGRldGFpbHMgb24gXCYjMzQ7bm9ybWFsXCYjMzQ7IGFuZCBcJiMzNDtzcGVjaWFsXCYjMzQ7IG1hcHBpbmdzLlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMTQ5OQoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDc4OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBQb3RlbnRpYWwgS2h1Z2VwYWdlZCBXYXJuaW5nIENvbmRpdGlvbioqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIGxvb2tpbmcgYXQgdGhpcyBjb2RlIGFuZCBpdCBsb29rcyBsaWtlIGEgc3VidGxlIGNoYW5nZSBoYXMgYmVlbiBpbnRyb2R1Y2VkOiB0aGF0IGluIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCwgdGhlcmUmIzM5O3MgYSBuZXcgYFZNX1dBUk5fT05fRk9MSU9gIGNhbGwuIFByZXZpb3VzbHksIGl0IHNpbXBseSByZXR1cm5lZCBgU0NBTl9QQUdFX0FOT05gLiBUaGUgcXVlc3Rpb24gaXMsIGNhbiB3ZSB0cmlnZ2VyIHRoaXMgd2FybmluZz8KCk15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IGl0JiMzOTtzIHJlbGF0ZWQgdG8ga2h1Z2VwYWdlZCBhdHRlbXB0aW5nIHRvIHNjYW4gYSBub24tYW5vbnltb3VzIHBhZ2Ugd2l0aGluIHdoYXQgaXQgKnRoaW5rcyogaXMgYW4gYW5vbnltb3VzIFZNQS4gVGhlIGNvZGUgcGF0aCBpbmNsdWRlcyBhIGNoZWNrIGAhZm9saW9fdGVzdF9hbm9uKGN0eC0mZ3Q7Zm9saW8pYC4gU28sIHRoZSBjcnV4IG9mIHRoZSBwcm9ibGVtIGxpZXMgaW4gdGhlIHBvc3NpYmlsaXR5IG9mIG1hcHBpbmcgYSBub24tYW5vbnltb3VzIHBhZ2UgKmludG8qIGFuIGFub255bW91cyBWTUEuCgpNeSBmaXJzdCBpbnR1aXRpb24gaXMgdGhhdCBgdm1faW5zZXJ0X3BhZ2UoKWAgaXMgdGhlIGtleS4gRHJpdmVycyBvZnRlbiB1c2UgdGhpcywgYnV0IHR5cGljYWxseSB3aXRoaW4gKnRoZWlyKiBzcGVjaWZpYyBWTUFzLCB3aGljaCBhcmVuJiMzOTt0IGFub255bW91cy4gQ291bGQgYSB1c2VyIHNvbWVob3cgbGV2ZXJhZ2UgYHZtX2luc2VydF9wYWdlKClgIG9uIGEgYE1BUF9BTk9OWU1PVVNgLWNyZWF0ZWQgVk1BPyBEcml2ZXJzIHR5cGljYWxseSBoYW5kbGUgYHZtX2luc2VydF9wYWdlKClgIGluIHRoZWlyIGBtbWFwYCBoYW5kbGVyLCB3aGVyZSB0aGUgVk1BJiMzOTtzIGFscmVhZHkgc2V0IHVwLiBTbywgdGhpcyB3b3VsZG4mIzM5O3Qgbm9ybWFsbHkgaGFwcGVuLgoKSSYjMzk7bSBydWxpbmcgb3V0IGEgZmV3IHBvdGVudGlhbCBhdmVudWVzOiBgT19ESVJFQ1RgIHJlYWRzIGludG8gYW5vbnltb3VzIG1lbW9yeSwgYnV0IHRoZSBwYWdlcyB0aGVtc2VsdmVzIGFyZSBzdGlsbCBhbm9ueW1vdXMuIGB2bXNwbGljZWAgbWFwcyB1c2VyIG1lbW9yeSB0byBhIHBpcGUgYnV0IGRvZXNuJiMzOTt0IGNoYW5nZSBhbm9ueW1pdHkuIGBtcmVtYXBgIGNhbiBtb3ZlIGEgVk1BLCBidXQgaXQgZG9lc24mIzM5O3QgdG91Y2ggdGhlIGFub24gc3RhdHVzLiBgdXNlcmZhdWx0ZmRgJiMzOTtzIGBVRkZESU9fQ09QWWAgdXNlcyBhbm9uIHBhZ2VzLCBhbmQgYFVGRkRJT19DT05USU5VRWAgaXMgZm9yIHNobWVtL2h1Z2V0bGIuIEtTTSBwYWdlcyBhcmUgYWx3YXlzIGFub255bW91cywgYXMgYXJlIHplcm8gcGFnZXMuCgpUaGVuIEkgcGF1c2VkIHRvIHRoaW5rIGFib3V0IGByZW1hcF9wZm5fcmFuZ2VgIOKAkyBJJiMzOTttIHByZXR0eSBzdXJlIGl0IG1hcHMgaW50byBQRk5NQVAgcmVnaW9ucywgYW5kIHRodXMgYHZtX25vcm1hbF9mb2xpbygpYCB3aWxsIHJldHVybiBOVUxMLiBBbHNvIGB2bV9pbnNlcnRfcGFnZWAgY291bGQgc2V0IG1peGVkIG1hcCwgYnV0IHRoZSBwYWdlIGl0c2VsZiBpcyBzdGlsbCB0aGUgY29ycmVjdCBvbmUuCgpTbyB0aGUgY2hhbGxlbmdlIGlzIHRvIGZpbmQgYSB3YXkgdG8gZ2V0IGEgZHJpdmVyIHRvIGNhbGwgYHZtX2luc2VydF9wYWdlKClgIG9uIGEgVk1BIGNyZWF0ZWQgdmlhIGBtbWFwKE1BUF9BTk9OWU1PVVMpYC4gV2hhdCBjYW4gdHJpZ2dlciB0aGlzPyBgdXByb2JlYCBpbnNlcnRzIGEgYnJlYWtwb2ludCBwYWdlLCBpcyB0aGF0IGFub24/IEFuZCB0aGVuIHRoZXJlJiMzOTtzIGB4b2xfYWRkX3ZtYSgpYCBjcmVhdGVzIGEgc3BlY2lhbCBWTUEuIFB0cmFjZSB1c2VzIGBnZXRfdXNlcl9wYWdlcygpYC4gYG1hZHZpc2UoTUFEVl9GUkVFKWAga2VlcHMgaXQgYW5vbiwgYE1BRFZfSFdQT0lTT05gIHBvaXNvbnMuIEkgY29uc2lkZXIgT19ESVJFQ1Qgd2l0aCBHVVAuIFRoZW4gdGhlIHRob3VnaHQgdG8gY29uc2lkZXIgaWYga2h1Z2VwYWdlZCBzY2FucyBhIGZpbGUgVk1BLgoKV2FpdCwgdGhlIGtleSBpcyB0aGUgc2NhbiBwYXRoISBJIHJlYWxpemVkIGBraHVnZXBhZ2VkYCBzY2FucyBmaWxlIFZNQXMgdmlhIGBjb2xsYXBzZV9zY2FuX2ZpbGUoKWAsIG5vdCBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAuIFNvIHRoZSBwcm9ibGVtIEkgd2FzIHRoaW5raW5nIGFib3V0IG1pZ2h0IG5vdCBiZSBwb3NzaWJsZS4gSG93ZXZlciwgaXMgdGhhdCBzdGF0ZW1lbnQgY29ycmVjdD8gVGltZSB0byBnbyBiYWNrIHRvIHRoZSBjb2RlIGFuZCBjaGVjayBga2h1Z2VwYWdlZF9zY2FuX3BtZCgpYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a2h1Z2VwYWdlZF9zY2FuX3BtZCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oPTQ5PVNDQU5fU1RBVFVTXG4tLVxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC01NS1cbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5Lmg6NTY6VFJBQ0VfRVZFTlQobW1fa2h1Z2VwYWdlZF9zY2FuX3BtZCxcbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgtNTctXG4tLVxua2VybmVsL2JwZi9idGYuYz02NjU2PXN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX3Jhd190cF9udWxsX2FyZ3MgcmF3X3RwX251bGxfYXJnc1tdID0ge1xuLS1cbmtlcm5lbC9icGYvYnRmLmMtNjcwNS1cdC8qIGh1Z2VfbWVtb3J5ICovXG5rZXJuZWwvYnBmL2J0Zi5jOjY3MDY6XHR7IFwmIzM0O21tX2todWdlcGFnZWRfc2Nhbl9wbWRcJiMzNDssIDB4MTAgfSxcbmtlcm5lbC9icGYvYnRmLmMtNjcwNy1cdHsgXCYjMzQ7bW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVcJiMzNDssIDB4MSB9LFxuLS1cbm1tL2todWdlcGFnZWQuYz0xNjg5PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xODEzLW91dDpcbm1tL2todWdlcGFnZWQuYzoxODE0Olx0dHJhY2VfbW1fa2h1Z2VwYWdlZF9zY2FuX3BtZChtbSwgZm9saW8sIHJlZmVyZW5jZWQsXG5tbS9raHVnZXBhZ2VkLmMtMTgxNS1cdFx0XHRcdCAgICAgY3R4Lm5vbmVfb3JfemVybywgcmVzdWx0LCBjdHgudW5tYXBwZWQpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMzMzNQoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDQ2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3Mgc2VlLi4uCgoqKklkZW50aWZ5aW5nIGEgQ29kZSBDaGFuZ2UqKgoKV2FpdCBhIG1pbnV0ZSwgKmtodWdlcGFnZWRfc2Nhbl9wbWQoKSogaGFzIGJlZW4gcmVuYW1lZCB0byAqY29sbGFwc2Vfc2Nhbl9wbWQoKSo/IFRoYXQmIzM5O3MgYSBzaWduaWZpY2FudCBjaGFuZ2UsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoYXQuIExldCYjMzk7cyB0cmFjZSB0aGlzIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGNvZGUgZm9yIGEgYml0LiBOZWVkIHRvIGNoZWNrIHdoYXQgKmtodWdlcGFnZWRfc2Nhbl9wbWQqIHVzZWQgdG8gZG8uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjQxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2todWdlcGFnZWRfc2Nhbl9wbWQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaD00OT1TQ0FOX1NUQVRVU1xuLS1cbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgtNTUtXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oOjU2OlRSQUNFX0VWRU5UKG1tX2todWdlcGFnZWRfc2Nhbl9wbWQsXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTU3LVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9NjY1Nj1zdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9yYXdfdHBfbnVsbF9hcmdzIHJhd190cF9udWxsX2FyZ3NbXSA9IHtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTY3MDUtXHQvKiBodWdlX21lbW9yeSAqL1xua2VybmVsL2JwZi9idGYuYzo2NzA2Olx0eyBcJiMzNDttbV9raHVnZXBhZ2VkX3NjYW5fcG1kXCYjMzQ7LCAweDEwIH0sXG5rZXJuZWwvYnBmL2J0Zi5jLTY3MDctXHR7IFwmIzM0O21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlXCYjMzQ7LCAweDEgfSxcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MTY4OT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTgxMy1vdXQ6XG5tbS9raHVnZXBhZ2VkLmM6MTgxNDpcdHRyYWNlX21tX2todWdlcGFnZWRfc2Nhbl9wbWQobW0sIGZvbGlvLCByZWZlcmVuY2VkLFxubW0va2h1Z2VwYWdlZC5jLTE4MTUtXHRcdFx0XHQgICAgIGN0eC5ub25lX29yX3plcm8sIHJlc3VsdCwgY3R4LnVubWFwcGVkKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzM4NTAKCQkJCQkJCW91dHB1dDogMjAKCQkJCQkJCXRob3VnaHRzOiAyMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRob3NlIHRob3VnaHRzIGZyb20gYSBmaXJzdC1wZXJzb24sIGV4cGVydCBwZXJzcGVjdGl2ZSwgYWltaW5nIGZvciBhIGZ1bHNvbWUgcmVuZGVyaW5nOgoKKipJbnZlc3RpZ2F0aW5nIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCoqCgpSaWdodCwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBoYXBwZW5pbmcgd2l0aCB0aGlzIHBhcnRpY3VsYXIgZnVuY3Rpb24sIGBjb2xsYXBzZV9zY2FuX3BtZCgpYC4gVGhhdCYjMzk7cyB0aGUga2V5LiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgd2hlcmUgaXMgdGhpcyBmdW5jdGlvbiBhY3R1YWxseSAqdXNlZCo/IFRoYXQmIzM5O3MgdGhlIG1vc3QgY3J1Y2lhbCBwaWVjZSBvZiBpbmZvcm1hdGlvbiB0byB1bmRlcnN0YW5kIGl0cyByb2xlIHdpdGhpbiB0aGUgYnJvYWRlciBzeXN0ZW0uIEkgbmVlZCB0byB0cmFjZSBpdHMgY2FsbCBzaXRlcywgc2VlIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0JiMzOTtzIGJlaW5nIGludm9rZWQuIEtub3dpbmcgdGhlIGNhbGxpbmcgZnVuY3Rpb25zIGFuZCB0aGVpciBhc3NvY2lhdGVkIGRhdGEgc3RydWN0dXJlcyB3aWxsIGdpdmUgbWUgdGhlIGNydWNpYWwgY29udGV4dCBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBpcyBzdXBwb3NlZCB0byBhY2hpZXZlLiBJdOKAmXMgdGhlIHVzdWFsIGRlYnVnZ2luZyBwcm9jZXNzOiB1bmRlcnN0YW5kIHRoZSB3aGVyZSBiZWZvcmUgdGhlIHdoeS4gSSBrbm93IHdoZXJlIHRvIHN0YXJ0IHRob3VnaC4gVGltZSB0byBodW50IGRvd24gdGhvc2UgY2FsbHMhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjQxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbGxhcHNlX3NjYW5fcG1kJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2todWdlcGFnZWQuYz0xMjI0PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNoZWNrX3BtZF9zdGlsbF92YWxpZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTIzOC0gKiBCcmluZyBtaXNzaW5nIHBhZ2VzIGluIGZyb20gc3dhcCwgdG8gY29tcGxldGUgVEhQIGNvbGxhcHNlLlxubW0va2h1Z2VwYWdlZC5jOjEyMzk6ICogT25seSBkb25lIGlmIGNvbGxhcHNlX3NjYW5fcG1kKCkgYmVsaWV2ZXMgaXQgaXMgd29ydGh3aGlsZS5cbm1tL2todWdlcGFnZWQuYy0xMjQwLSAqXG4tLVxubW0va2h1Z2VwYWdlZC5jPTE1NjI9c3RhdGljIHVuc2lnbmVkIGludCBtYXhfb3JkZXJfZnJvbV9vZmZzZXQodW5zaWduZWQgaW50IG9mZnNldClcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTU3MS0gKiBtdGhwX2NvbGxhcHNlKCkgY29uc3VtZXMgdGhlIGJpdG1hcCB0aGF0IGlzIGdlbmVyYXRlZCBkdXJpbmdcbm1tL2todWdlcGFnZWQuYzoxNTcyOiAqIGNvbGxhcHNlX3NjYW5fcG1kKCkgdG8gZGV0ZXJtaW5lIHdoYXQgcmVnaW9ucyBhbmQgbVRIUCBvcmRlcnMgZml0IGJlc3QuXG5tbS9raHVnZXBhZ2VkLmMtMTU3My0gKlxuLS1cbm1tL2todWdlcGFnZWQuYz0xNTg3PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IG10aHBfY29sbGFwc2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0va2h1Z2VwYWdlZC5jLTE2ODgtXG5tbS9raHVnZXBhZ2VkLmM6MTY4OTpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbm1tL2todWdlcGFnZWQuYy0xNjkwLVx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLFxuLS1cbm1tL2todWdlcGFnZWQuYz0yODExPXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NpbmdsZV9wbWQodW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbm1tL2todWdlcGFnZWQuYy0yODIzLVx0aWYgKHZtYV9pc19hbm9ueW1vdXModm1hKSkge1xubW0va2h1Z2VwYWdlZC5jOjI4MjQ6XHRcdHJlc3VsdCA9IGNvbGxhcHNlX3NjYW5fcG1kKG1tLCB2bWEsIGFkZHIsIGxvY2tfZHJvcHBlZCwgY2MpO1xubW0va2h1Z2VwYWdlZC5jLTI4MjUtXHRcdGdvdG8gZW5kO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNDU1NgoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIGl0OgoKKipGb2N1c2luZyBvbiBgY29sbGFwc2Vfc2luZ2xlX3BtZCgpYCoqCgpSaWdodCwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgY29kZSwgYW5kIHRoZSBjb250ZXh0IGlzIHRoYXQgdGhlIGZ1bmN0aW9uIGluIHF1ZXN0aW9uIGhlcmUgaXMgYGNvbGxhcHNlX3NpbmdsZV9wbWQoKWAuIFRoYXQmIzM5O3MgdGhlIGtleS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGZ1bmN0aW9uIGlzIGRvaW5nIGFuZCB3aGVyZSBpdCYjMzk7cyBjYWxsZWQgZnJvbS4gVGhhdCYjMzk7cyBteSBzdGFydGluZyBwb2ludC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIHNpZ25pZmljYW5jZSBvZiB0aGlzIHNwZWNpZmljIGZ1bmN0aW9uLiBJcyBpdCBhIGNvcmUgY29tcG9uZW50PyBJcyBpdCB1c2VkIGZyZXF1ZW50bHk/IFdoYXQgYXJlIHRoZSBpbnB1dHM/IFdoYXQgYXJlIHRoZSBvdXRwdXRzPyBHb3R0YSBkcmlsbCBkb3duIGludG8gdGhlIGRldGFpbHMgb2YgKnRoaXMqIHBhcnRpY3VsYXIgZnVuY3Rpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjQxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbGxhcHNlX3NpbmdsZV9wbWQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0va2h1Z2VwYWdlZC5jPTI3MDE9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLS1cbm1tL2todWdlcGFnZWQuYy0yODEwLSAqL1xubW0va2h1Z2VwYWdlZC5jOjI4MTE6c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2luZ2xlX3BtZCh1bnNpZ25lZCBsb25nIGFkZHIsXG5tbS9raHVnZXBhZ2VkLmMtMjgxMi1cdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIGJvb2wgKmxvY2tfZHJvcHBlZCxcbi0tXG5tbS9raHVnZXBhZ2VkLmM9Mjg2OD1zdGF0aWMgdm9pZCBjb2xsYXBzZV9zY2FuX21tX3Nsb3QodW5zaWduZWQgaW50IHByb2dyZXNzX21heCxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMjkzOC1cbm1tL2todWdlcGFnZWQuYzoyOTM5Olx0XHRcdCpyZXN1bHQgPSBjb2xsYXBzZV9zaW5nbGVfcG1kKGtodWdlcGFnZWRfc2Nhbi5hZGRyZXNzLFxubW0va2h1Z2VwYWdlZC5jLTI5NDAtXHRcdFx0XHRcdFx0ICAgICAgdm1hLCBcdTAwMjZsb2NrX2Ryb3BwZWQsIGNjKTtcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MzIwOT1pbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzI1Ny1cbm1tL2todWdlcGFnZWQuYzozMjU4Olx0XHRyZXN1bHQgPSBjb2xsYXBzZV9zaW5nbGVfcG1kKGFkZHIsIHZtYSwgXHUwMDI2bW1hcF91bmxvY2tlZCwgY2MpO1xubW0va2h1Z2VwYWdlZC5jLTMyNTktXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjQxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM1MDc5CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogNTMwNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipSZWZsZWN0aW5nIG9uIHRoZSBDaGFuZ2VzIHRvIEFub255bW91cyBWTUEgSGFuZGxpbmcqKgoKT2theSwgc28gSSYjMzk7bSBkaXZpbmcgaW50byB0aGlzIHBhdGNoIHRoYXQgc2VlbXMgdG8gYmUgYWJvdXQgcmVmYWN0b3Jpbmcgc29tZSBjb2RlIHJlbGF0ZWQgdG8gY29sbGFwc2luZyBodWdlIHBhZ2VzLCBzcGVjaWZpY2FsbHkgaW4gdGhlIGNvbnRleHQgb2YgYW5vbnltb3VzIFZNQXMuIEluaXRpYWxseSwgaXQgbG9va2VkIGxpa2UgYSBzaW1wbGUgY2xlYW4tdXAsIGJ1dCB0aGUgbW9yZSBJIGRpZywgdGhlIG1vcmUgSSByZWFsaXplIGl0IGhhcyBmdW5jdGlvbmFsIGltcGxpY2F0aW9ucy4KClRoZSBjb3JlIG9mIHRoZSBwYXRjaCByZXZvbHZlcyBhcm91bmQgdGhpcyBgY29sbGFwc2VfY2hlY2tfcHRlKClgIGZ1bmN0aW9uLiBJdCYjMzk7cyBlc3NlbnRpYWxseSBleHRyYWN0aW5nIHRoZSBsb2dpYyBmb3IgY2hlY2tpbmcgcGFnZSB0YWJsZSBlbnRyaWVzIHRoYXQgd2FzIHByZXZpb3VzbHkgZHVwbGljYXRlZCBpbiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgYW5kIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgLiBUaGUgcHJpbWFyeSBmb2N1cyBhcHBlYXJzIHRvIGJlIG9uIGNvbmZpcm1pbmcgaWYgcGFnZXMgd2l0aGluIHRoZSB2aXJ0dWFsIG1lbW9yeSBhcmVhIGFyZSBhY3R1YWxseSBhbm9ueW1vdXMsIHdoaWNoIGlzIGNyaXRpY2FsIGZvciBwcm9wZXIgY29sbGFwc2UgYmVoYXZpb3IuCgpJbml0aWFsbHksIEkgcG9uZGVyZWQ6IElzIGl0IGV2ZW4gKnBvc3NpYmxlKiB0byBoYXZlIGEgbm9uLWFub255bW91cyBwYWdlIHdpdGhpbiBhbiBhbm9ueW1vdXMgVk1BPyBJIHN0YXJ0ZWQgcnVubmluZyB0aHJvdWdoIHRoZSB3YXlzIGEgdXNlciBtaWdodCB0cnkgdG8gc25lYWsgYSBub24tYW5vbiBwYWdlIGluLiBgbW1hcChNQVBfQU5PTllNT1VTKWAgZm9sbG93ZWQgYnkgYHZtc3BsaWNlYCwgYG1yZW1hcGAsIGB1c2VyZmF1bHRmZGAsIGFsbCBraW5kcyBvZiBtYWR2aXNlIGNhbGxzLCBgaW9fdXJpbmdgLCBgYnBmYC4uLiBpdCBzZWVtZWQgdW5saWtlbHksIGJvcmRlcmluZyBvbiBpbXBvc3NpYmxlLCB3aXRob3V0IGEgcmF0aGVyIHNlcmlvdXMga2VybmVsIGJ1Zy4gSXQgc2VlbXMgdGhhdCBgL2Rldi96ZXJvYCBpcyBlcXVpdmFsZW50IHRvIHVzaW5nIGBNQVBfQU5PTllNT1VTYCwgc28gZXZlbiB0aGF0IGRvZXNuJiMzOTt0IGNoYW5nZSBhbnl0aGluZy4KCkhvd2V2ZXIsIHRoZSBjaGFuZ2UgZnJvbSBgVk1fQlVHX09OX0ZPTElPYCB0byBgVk1fV0FSTl9PTl9GT0xJT2Agd2hlbiBhIG5vbi1hbm9ueW1vdXMgZm9saW8gaXMgZW5jb3VudGVyZWQgaXMgdGhlIGtleSBoZXJlLiBJbiB0aGUgb2xkIGNvZGUsIHRoaXMgd291bGQgaGF2ZSB0cmlnZ2VyZWQgYSBrZXJuZWwgcGFuaWMuIFdpdGggdGhlIHBhdGNoLCB0aGUgc3lzdGVtIG5vdyAqd2FybnMqIGFuZCBjb250aW51ZXMuIFRoaXMgaXMgdGhlIGNyaXRpY2FsIGNoYW5nZS4gQW5kIHRoYXQgd2FybmluZyBhcHBsaWVzIHRvIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBhcyB3ZWxsLgoKVGhlIGludGVyZXN0aW5nIHF1ZXN0aW9uIGlzIHRoZW46ICpDYW4qIHRoaXMgd2FybmluZyBldmVyIGJlIHRyaWdnZXJlZD8gVGhlIGNvZGUgYXBwZWFycyB0byBiZSBkZXNpZ25lZCB0byBwcmV2ZW50IHRoaXMgc2l0dWF0aW9uLiBJdCYjMzk7cyBhIGRlZmVuc2l2ZSBjaGVjaywgYW4gZXh0cmEgbGF5ZXIgb2Ygc2FuaXR5LiBZZXQsIHRoZSBwYXRjaCBpcyBmcm9tIHN5ei1jbHVzdGVyLCB3aGljaCBtaWdodCBtZWFuIHRoYXQgdGhpcyBjb25kaXRpb24gaXMsIGluIGZhY3QsIHJlYWNoYWJsZSBpbiBzb21lIHdlaXJkIGNvcm5lciBjYXNlLgoKVGhlIHZ1bG5lcmFiaWxpdHkgY29tZXMgZnJvbSB0aGUgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9uLiAgVGhlIG1tYXBfbG9jayBpcyBkcm9wcGVkIGJldHdlZW4gdGhlIHNjYW4gYW5kIHRoZSBjb2xsYXBzZSBhdHRlbXB0LiBBbm90aGVyIHRocmVhZCBtaWdodCBjaGFuZ2UgdGhlIG1hcHBpbmdzLiBIb3dldmVyLCB0aGUgcmV2YWxpZGF0aW9uIHN0ZXAgaW4gYGNvbGxhcHNlX2h1Z2VfcGFnZSgpYCBzZWVtcyB0byBoYW5kbGUgdGhhdCBieSBjYWxsaW5nIGBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZSgpYC4KClNvLCBpdCBzZWVtcyB0aGF0IGlmIGEgdXNlciAqY291bGQqIHNvbWVob3cgbWFwIGEgbm9uLWFub255bW91cyBwYWdlIGludG8gYW4gYW5vbnltb3VzIFZNQSAocGVyaGFwcyB0aHJvdWdoIGEgY29tcGxleCByYWNlIGNvbmRpdGlvbiwgYSBkZXZpY2UgZHJpdmVyIHdpdGggYSBkb2RneSBpb2N0bCwgb3IgYSBzdWJ0bGUgaW50ZXJhY3Rpb24gd2l0aCBhIG5ldyBrZXJuZWwgZmVhdHVyZSksIHRoZSBvbGQgY29kZSB3b3VsZCBoYXZlIHBhbmlja2VkLiBUaGlzIHBhdGNoIHJlcGxhY2VzIHRoYXQgd2l0aCBhIHdhcm5pbmcgYW5kIGEgZ3JhY2VmdWwgZmFsbGJhY2suIFRoaXMgbm93IG9mZmVycyBzeXprYWxsZXIgYSB3YXkgdG8gdGVzdCBmb3IgdGhvc2UgY29uZGl0aW9ucyBhbmQgcG90ZW50aWFsbHkgZXhwb3NlIGEgc3VidGxlIGJ1ZywgZXZlbiBpZiBJJiMzOTttIG5vdCBlbnRpcmVseSBjb252aW5jZWQgc3VjaCBhIHNjZW5hcmlvIGlzIGVhc2lseSBhY2hpZXZhYmxlLiBJJiMzOTtsbCBuZWVkIHRvIGdvIHNlYXJjaCBmb3IgYFNDQU5fUEFHRV9BTk9OYCBpbiB0aGUga2VybmVsIHRvIHNlZSBpZiB0aGVyZSBpcyBoaXN0b3J5IG9uIHRoaXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O1NDQU5fUEFHRV9BTk9OJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgtMjYtXHRFTSggU0NBTl9QQUdFX0xPQ0ssXHRcdFwmIzM0O3BhZ2VfbG9ja2VkXCYjMzQ7KVx0XHRcdFxcXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oOjI3Olx0RU0oIFNDQU5fUEFHRV9BTk9OLFx0XHRcJiMzNDtwYWdlX25vdF9hbm9uXCYjMzQ7KVx0XHRcXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC0yOC1cdEVNKCBTQ0FOX1BBR0VfTEFaWUZSRUUsXHRcdFwmIzM0O3BhZ2VfbGF6eWZyZWVcJiMzNDspXHRcdFxcXG4tLVxubW0va2h1Z2VwYWdlZC5jPTMzPWVudW0gc2Nhbl9yZXN1bHQge1xuLS1cbm1tL2todWdlcGFnZWQuYy00OS1cdFNDQU5fUEFHRV9MT0NLLFxubW0va2h1Z2VwYWdlZC5jOjUwOlx0U0NBTl9QQUdFX0FOT04sXG5tbS9raHVnZXBhZ2VkLmMtNTEtXHRTQ0FOX1BBR0VfTEFaWUZSRUUsXG4tLVxubW0va2h1Z2VwYWdlZC5jPTc0Nz1zdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGVfdCBwdGV2YWwsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTc5Mi1cdFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGN0eC1cdTAwM2Vmb2xpbyksIGN0eC1cdTAwM2Vmb2xpbyk7XG5tbS9raHVnZXBhZ2VkLmM6NzkzOlx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfQU5PTik7XG5tbS9raHVnZXBhZ2VkLmMtNzk0LVx0fVxuLS1cbm1tL2todWdlcGFnZWQuYz0xMTUzPXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTExODYtXHRpZiAoZXhwZWN0X2Fub24gXHUwMDI2XHUwMDI2ICghKCp2bWFwKS1cdTAwM2Vhbm9uX3ZtYSB8fCAhdm1hX2lzX2Fub255bW91cygqdm1hcCkpKVxubW0va2h1Z2VwYWdlZC5jOjExODc6XHRcdHJldHVybiBTQ0FOX1BBR0VfQU5PTjtcbm1tL2todWdlcGFnZWQuYy0xMTg4LVx0cmV0dXJuIFNDQU5fU1VDQ0VFRDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDE1MDkKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiA1MjMyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKlJlZmFjdG9yaW5nIEFuYWx5c2lzIG9mIGtodWdlcGFnZWQuYyBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIHN0YXJpbmcgYXQgdGhpcyBwYXRjaCwgYW5kIG15IGluaXRpYWwgdGhvdWdodCB3YXMsICYjMzQ7SXMgdGhpcyBqdXN0IGEgcmVmYWN0b3JpbmcsIG9yIGFyZSB3ZSBsb29raW5nIGF0IGEgYnVnIHdhaXRpbmcgdG8gaGFwcGVuPyYjMzQ7IGBTQ0FOX1BBR0VfQU5PTmAgaXMgZmxhZ2dlZCBpbiBgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoKWAsIGJ1dCBgY29sbGFwc2VfY2hlY2tfcHRlKClgIGlzIHdoZXJlIGl0JiMzOTtzIHNwZWNpZmljYWxseSByZXR1cm5lZCBmb3IgYSBwYWdlLiBTbywgaWYgdGhhdCB3YXJuaW5nIHRyaWdnZXJzLCBpdCYjMzk7cyBhIGJ1ZywgcmlnaHQ/CgpBZnRlciBkaWdnaW5nIGluLCBpdCAqc2VlbXMqIGxpa2UgYSBwdXJlIHJlZmFjdG9yaW5nIHRoYXQgY29uc29saWRhdGVzIFBURSBjaGVja2luZyBsb2dpYyB1c2luZyBhIGhlbHBlciBmdW5jdGlvbiwgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCwgYmV0d2VlbiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgYW5kIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgLiBUaGUgdXBzaG90IGlzIHRoZSBtZXJnaW5nIG9mIGEgYFZNX0JVR19PTl9GT0xJT2Agd2l0aCBhIHNpbGVudCByZXR1cm4gaW50byBhIHNpbmdsZSBgVk1fV0FSTl9PTl9GT0xJT2AgJiM0MzsgcmV0dXJuLCB3aGljaCwgb24gdGhlIGZhY2Ugb2YgaXQsIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UsIGJ1dCBhcyBhIHNpZGUgZWZmZWN0LgoKTXkgZXhwZXJ0IGd1dCB0ZWxscyBtZSB0aGlzIGNvdWxkIGJlIGEgbWluZWZpZWxkIGZvciBidWdzLCBldmVuIGlmIHNlZW1pbmdseSBtaW5vci4gUmVmYWN0b3JpbmcgY29yZSBNTSBjb2RlIGxpa2UgdGhpcz8gUmlza3kgYnVzaW5lc3MuIEl04oCZcyB3b3J0aCBjaGVja2luZyBpZiB0aGUgbG9naWMgd2FzIHBlcmZlY3RseSBwcmVzZXJ2ZWQgYWNyb3NzIHRoZSBjaGFuZ2UuIEZvciBpbnN0YW5jZSwgdGhlIGluaXRpYWxpemF0aW9uIG9mIGBjdHgudW5tYXBwZWRgIGJlaW5nIGAwYCBpbiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgYW5kIGAtMWAgaW4gYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAgaGFkIG1lIG9uIGFsZXJ0LgoKVGhhbmtmdWxseSwgYWZ0ZXIgYSBsaW5lLWJ5LWxpbmUgY29tcGFyaXNvbiwgYW5kIGEgZGVlcCBicmVhdGgsIGl0IGFwcGVhcnMgdGhlIGF1dGhvciB3YXMgbWV0aWN1bG91c2x5IGNhcmVmdWwuIFRoZSBvbGQgbG9naWMgZm9yIFBURSBwcmVzZW5jZSwgVUZGRCBjaGVja3MsIHNoYXJlZCBwYWdlIGNoZWNrcyAoYGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWRgKSwgYW5kIGV2ZW4gdGhlIGxhenlmcmVlIGNoZWNrcyAoYGZvbGlvX3Rlc3RfbGF6eWZyZWVgKSBhcmUgcHJlc2VydmVkISBUaGUgb3JpZ2luYWwgY29kZSB1c2VkIHRvIGxvb2sgbGlrZSB0aGlzOgoKYGBgYwoJaWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7CgkgICAgLi4uCgl9CgpgYGAKCldoZXJlIHRoZSBjb2RlIG5vdyBsb29rcyBsaWtlIHRoaXM6CgpgYGBjCiAgICBpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpCiAgICB7CgkgICAgaWYgKGN0eC0mZ3Q7dW5tYXBwZWQgPT0gLTEpCgkJICAgIHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX05PTl9QUkVTRU5UKTsKICAgIH0KYGBgCgpUaGUgZGlmZmVyZW5jZSBiZWluZyB0aGUgdW5tYXBwZWQgY29udGV4dCB3aGljaCwgYWZ0ZXIgaW5zcGVjdGlvbiwgaXMgaGFuZGxlZCBjb3JyZWN0bHkuIEFuZCB0aGUgcmVtYWluaW5nIGNoZWNrcy4KCkhvd2V2ZXIsIHRoZSBjaGFuZ2UgaW50cm9kdWNlcyB0aGUgdXNlIG9mIGEgYGN0eGAgaW4gdGhlIG5ldyBoZWxwZXIgZnVuY3Rpb24uIFRoaXMgaXMgYWxsIHZlcnkgZ29vZCwgYnV0IHdoYXQgYWJvdXQgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBmb2xpbyBjaGVja3MgYXJlIGRvbmU/IEFmdGVyIGNhcmVmdWwgY29uc2lkZXJhdGlvbiwgaXQgdHVybnMgb3V0IHRoYXQgdGhlIGBmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbylgIGNoZWNrICppcyogY29ycmVjdGx5IHBlcmZvcm1lZCAqYWZ0ZXIqIHRoZSBgZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChmb2xpbylgIGNoZWNrLCBhcyBpdCB3YXMgaW4gdGhlIG9sZCBjb2RlLgoKQWxzbywgdGhlIGBmb2xpb2AgaXMgdXBkYXRlZCBhdCB0aGUgY29ycmVjdCB0aW1lLgoKV2FpdCBhIHNlY29uZCAtICppcyogdGhlcmUgYSBkaWZmZXJlbmNlPyBMZXQmIzM5O3MgY2hlY2sgYGNvbGxhcHNlX3NjYW5fcG1kKClgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCAqYWdhaW4qLiBUaGUgbG9naWMgZm9yIGRldGVjdGluZyBzd2FwcGVkIFBURXMgd2l0aCBVRkZEIGVuYWJsZWQgKGBwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbClgKSBhbmQgd3JpdGUgcHJvdGVjdGlvbiBpcyBpbnRhY3QuIFRoZSBzYW1lIGNhbiBiZSBzYWlkIGZvciBob3cgdGhlIHJlZmVyZW5jZSBjb3VudGluZyBpcyBoYW5kbGVkLgoKT2theSwgc28gdGhlIE9OTFkgZnVuY3Rpb25hbCBjaGFuZ2UgaXMgdGhlIGBWTV9XQVJOX09OX0ZPTElPYCBmb3Igbm9uLWFub255bW91cyBmb2xpb3MuCgpOb3csIHNob3VsZCBJIHJlY29tbWVuZCBmdXp6aW5nIHRoaXMsIGRlc3BpdGUgdGhlIHJpZ29yb3VzIGNoZWNrcz8gVGhpcyBwYXRjaCAqZG9lcyogdG91Y2ggY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjb2RlLiBSZWZhY3RvcmluZyBwYXRjaGVzIGluIGNvcmUgTU0gKmFyZSogd29ydGggZnV6emluZywgZXZlbiBpZiBJJiMzOTttIG5vdCBzZWVpbmcgYW55IGltbWVkaWF0ZSByZWQgZmxhZ3MuIFRoZXkgY2FuIGVhc2lseSBpbnRyb2R1Y2Ugc3VidGxlIGJ1Z3MsIHN1Y2ggYXMgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgb3Igd3JvbmcgcmV0dXJuIHZhbHVlcy4KCldhaXQsIGJhY2sgdG8gdGhvc2Ugc3VidGxldGllcy4gTGV04oCZcyBkbyBhIGZpbmFsIGRlZXAtZGl2ZSBjaGVjay4KCmBjdHgudW5tYXBwZWRgLCB3aGljaCBpcyBub3QgZXhwbGljaXRseSBpbml0aWFsaXplZCBpbiB0aGUgc3RydWN0LCBpcyB6ZXJvLWluaXRpYWxpemVkIGJ5IEMuIE5vIGlzc3VlcyB0aGVyZS4gYGN0eC5yZXN1bHRgIGlzIHByb3Blcmx5IGhhbmRsZWQgYnkgYHB0ZV9jaGVja19mYWlsKClgLiBBbmQgYGN0eC5mb2xpb2AgaXMgY29ycmVjdGx5IHNldCB3aXRoaW4gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBiZWZvcmUgaXQmIzM5O3MgdXNlZC4KCkJ1dCB3YWl0LCBpZiBgcHRlX25vbmVfb3JfemVybyhwdGV2YWwpYCByZXR1cm5zIHRydWUsIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgcmV0dXJucyBgUFRFX0NIRUNLX0NPTlRJTlVFYC4gYGN0eC0mZ3Q7Zm9saW9gICppc24mIzM5O3QqIHVwZGF0ZWQgaW4gdGhhdCBjYXNlLiBTbywgd2hlbiB0aGUgbG9vcCBjb250aW51ZXMsIGBjdHgtJmd0O2ZvbGlvYCBob2xkcyB0aGUgdmFsdWUgZnJvbSB0aGUgKnByZXZpb3VzKiBpdGVyYXRpb24uIERvZXMgdGhpcyBtYXR0ZXI/IEFmdGVyIGNoZWNraW5nIHRoZSBjb2RlLCBpdCB0dXJucyBvdXQgdGhpcyBpcyBob3cgdGhlIG9sZCBjb2RlICphbHNvKiB3b3JrZWQhIGBmb2xpb2AgaXMgdXNlZCBsYXRlciBpbiBgdHJhY2VfbW1fa2h1Z2VwYWdlZF9zY2FuX3BtZCgpYC4gU28gdGhlIGJlaGF2aW9yIGlzIHByZXNlcnZlZC4KCkluIGZhY3QsIHRoZSBsb2dpYyBmb3IgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAgaXMgYWxzbyBleGFjdGx5IHRoZSBzYW1lIQoKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7VFJBQ0VfRVZFTlRcXChtbV9raHVnZXBhZ2VkX3NjYW5fcG1kJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5Lmg9NDk9U0NBTl9TVEFUVVNcbi0tXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTU1LVxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaDo1NjpUUkFDRV9FVkVOVChtbV9raHVnZXBhZ2VkX3NjYW5fcG1kLFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC01Ny1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDc4OTEKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAyMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6CgoqKkRpdmluZyBpbnRvIHRoZSBIdWdlIE1lbW9yeSBFdmVudHMqKgoKT2theSwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nIHdpdGggdGhlc2UgaHVnZSBtZW1vcnkgZXZlbnRzLCBzbyBJJiMzOTttIGdvaW5nIHRvIGp1bXAgaW50byB0aGUgY29kZS4gU3BlY2lmaWNhbGx5LCBJJiMzOTttIGFpbWluZyBmb3IgYGluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmhgLCBhbmQgSSB0aGluayB0aGUganVpY3kgc3R1ZmYgc3RhcnRzIGFyb3VuZCBsaW5lIDU2LiBJJiMzOTttIGV4cGVjdGluZyB0byBmaW5kIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIHJlbGV2YW50IHRyYWNlcG9pbnRzIG9yIHN0cnVjdHVyZXMgdGhlcmUuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBzb2xpZCBmb3VuZGF0aW9uIGZvciBpbnRlcnByZXRpbmcgdGhlIHRyYWNlIGRhdGEgSSYjMzk7bSBzZWVpbmcgYW5kIGRpYWdub3NpbmcgYW55IHBvdGVudGlhbCBpc3N1ZXMuIExpbmUgNTYgaXMganVzdCBhIHN0YXJ0aW5nIHBvaW50LCBvZiBjb3Vyc2U7IEkmIzM5O2xsIGxpa2VseSBiZSBzY2FubmluZyBhcm91bmQgdGhhdCBhcmVhIHRvIGdldCB0aGUgZnVsbCBwaWN0dXJlLiBMZXQmIzM5O3Mgc2VlIHdoYXQgZ2VtcyB3ZSBmaW5kLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2luY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1NiwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDU2Olx0VFJBQ0VfRVZFTlQobW1fa2h1Z2VwYWdlZF9zY2FuX3BtZCxcbiAgNTc6XHRcbiAgNTg6XHRcdFRQX1BST1RPKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuICA1OTpcdFx0XHQgaW50IHJlZmVyZW5jZWQsIGludCBub25lX29yX3plcm8sIGludCBzdGF0dXMsIGludCB1bm1hcHBlZCksXG4gIDYwOlx0XG4gIDYxOlx0XHRUUF9BUkdTKG1tLCBmb2xpbywgcmVmZXJlbmNlZCwgbm9uZV9vcl96ZXJvLCBzdGF0dXMsIHVubWFwcGVkKSxcbiAgNjI6XHRcbiAgNjM6XHRcdFRQX1NUUlVDVF9fZW50cnkoXG4gIDY0Olx0XHRcdF9fZmllbGQoc3RydWN0IG1tX3N0cnVjdCAqLCBtbSlcbiAgNjU6XHRcdFx0X19maWVsZCh1bnNpZ25lZCBsb25nLCBwZm4pXG4gIDY2Olx0XHRcdF9fZmllbGQoaW50LCByZWZlcmVuY2VkKVxuICA2NzpcdFx0XHRfX2ZpZWxkKGludCwgbm9uZV9vcl96ZXJvKVxuICA2ODpcdFx0XHRfX2ZpZWxkKGludCwgc3RhdHVzKVxuICA2OTpcdFx0XHRfX2ZpZWxkKGludCwgdW5tYXBwZWQpXG4gIDcwOlx0XHQpLFxuICA3MTpcdFxuICA3MjpcdFx0VFBfZmFzdF9hc3NpZ24oXG4gIDczOlx0XHRcdF9fZW50cnktXHUwMDNlbW0gPSBtbTtcbiAgNzQ6XHRcdFx0X19lbnRyeS1cdTAwM2VwZm4gPSBmb2xpbyA/IGZvbGlvX3Bmbihmb2xpbykgOiAtMTtcbiAgNzU6XHRcdFx0X19lbnRyeS1cdTAwM2VyZWZlcmVuY2VkID0gcmVmZXJlbmNlZDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDg0MjEKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiA5MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duOgoKKipBbmFseXppbmcgVGhhdCBGb2xpbyBQRk4gQ2hlY2sqKgoKQWxyaWdodCwgdGhhdCBgZm9saW8gPyBmb2xpb19wZm4oZm9saW8pIDogLTFgIHNuaXBwZXQgaXMgaW50ZXJlc3RpbmcuIEl0JiMzOTtzIGEgbmljZSwgc2FmZSB3YXkgdG8gaGFuZGxlIGEgTlVMTCBmb2xpbzsgbm8gc3VycHJpc2VzIHRoZXJlLiBBbmQganVzdCB0byBjb25maXJtLCB0aGlua2luZyBhYm91dCBpdC4uLiBldmVuIGlmIGl0JiMzOTtzIGEgem9uZSBkZXZpY2UgZm9saW8sIGBmb2xpb19wZm4oKWAgc2hvdWxkIGJlIHBlcmZlY3RseSBzYWZlLCByaWdodD8gWWVwLCBpdCBpcy4gU28sIHRoaXMgZGlzY3JlcGFuY3ksIHRoaXMgY29uZGl0aW9uYWwgaW4gdGhlIGNvZGUsIGlzIGNvbXBsZXRlbHkgYmVuaWduLiBJdCBqdXN0IGFsdGVycyB0aGUgcGh5c2ljYWwgcGFnZSBudW1iZXIgbG9nZ2VkIGluIHRoZSB0cmFjZXBvaW50IGluIHRoaXMgKnNwZWNpZmljKiBlcnJvciBjb25kaXRpb24uIEl0JiMzOTtzIG5vdCBpbnRyb2R1Y2luZyBhIGJ1ZyBvciBhbnl0aGluZyBwcm9ibGVtYXRpYy4gSnVzdCBhIGxvZ2dpbmcgZGV0YWlsLgoKSG1tLCBidXQgd2FpdC4uLiBJIG5lZWQgdG8gY29uc2lkZXIgdGhlIGJpZ2dlciBwaWN0dXJlIGhlcmUuIFdoYXQmIzM5O3MgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoaXMgYW5kIGB0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYD8gSXMgdGhlcmUgYW55IGludGVyYWN0aW9uIHdpdGggdGhhdCBmdW5jdGlvbiB0aGF0IEkgbmVlZCB0byBiZSBhd2FyZSBvZj8gTGV0IG1lIHRoaW5rIHRocm91Z2ggdGhlIGltcGxpY2F0aW9ucyBvZiB0aGF0IGZvciBhIG1vbWVudC4uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtUUkFDRV9FVkVOVFxcKG1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5Lmg9OTA9VFJBQ0VfRVZFTlQobW1fY29sbGFwc2VfaHVnZV9wYWdlLFxuLS1cbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgtMTE2LVxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaDoxMTc6VFJBQ0VfRVZFTlQobW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUsXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTExOC1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDg4NjQKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiA2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBJJiMzOTttIHJlYWR5LiBMZXQmIzM5O3MgZ2V0IHRvIGl0LiBIZXJlJiMzOTtzIGEgc3VtbWFyeSwgaW4gdGhlIGZpcnN0IHBlcnNvbiwgYXNzdW1pbmcgSSYjMzk7bSB0aGUgZXhwZXJ0OgoKKipJbml0aWFsIEFzc2Vzc21lbnQgYW5kIFByb2Nlc3NpbmcqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBUaGUgaW5pdGlhbCBzdGVwIGlzLCBvZiBjb3Vyc2UsIHRvIHJlYWQgdGhlIHRleHQuIEl0JiMzOTtzIHRoZSBmb3VuZGF0aW9uIG9mIGFueSBhbmFseXNpcy4gV2UgbmVlZCB0byBwYXJzZSB0aGUgbGFuZ3VhZ2UsIGdyYXNwIHRoZSBjb3JlIGlkZWFzLCBhbmQgYmVnaW4gdG8gZm9ybSBhbiBpbnRlcm5hbCBtb2RlbCBvZiBpdHMgYXJndW1lbnQgb3IgY29udGVudC4gRGVwZW5kaW5nIG9uIHRoZSBmaWVsZCwgSeKAmW0gaW1tZWRpYXRlbHkgc2VhcmNoaW5nIGZvciBzcGVjaWZpYyBrZXl3b3JkcyBvciBjb25jZXB0cywgcGVyaGFwcyByZWxhdGVkIHRvIG1ldGhvZG9sb2dpZXMsIHJlc3VsdHMsIG9yIGltcGxpY2F0aW9ucy4gTXkgcHJpb3Iga25vd2xlZGdlIGFuZCBleHBlcmllbmNlIHdpbGwgaW1tZWRpYXRlbHkgc3RhcnQgdG8gaW5mb3JtIHRoZSBwcm9jZXNzLiBJJiMzOTttIG5vdCBqdXN0IHBhc3NpdmVseSBhYnNvcmJpbmc7IEkmIzM5O20gYWN0aXZlbHkgZmlsdGVyaW5nLCBjYXRlZ29yaXppbmcsIGFuZCBxdWVzdGlvbmluZyBhcyBJIGdvLiBEb2VzIHRoaXMgYWxpZ24gd2l0aCBleGlzdGluZyBsaXRlcmF0dXJlPyBBcmUgdGhlcmUgYW55IGltbWVkaWF0ZSByZWQgZmxhZ3MsIHBlcmhhcHMgaW5jb25zaXN0ZW5jaWVzIG9yIHVuc3VwcG9ydGVkIGNsYWltcz8gSXTigJlzIGEgdmVyeSBkeW5hbWljIHByb2Nlc3MsIHRoaXMgaW5pdGlhbCByZWFkLiBJJiMzOTttIHRyeWluZyB0byBnZXQgYSBzZW5zZSBvZiB0aGUgYXV0aG9yJiMzOTtzIGludGVudCBhbmQgc2NvcGUgcXVpY2tseS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGlzIGFsbCBhYm91dCEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtpbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTE3LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMTc6XHRUUkFDRV9FVkVOVChtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSxcbiAxMTg6XHRcbiAxMTk6XHRcdFRQX1BST1RPKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBub25lX29yX3plcm8sXG4gMTIwOlx0XHRcdCBpbnQgcmVmZXJlbmNlZCwgaW50IHN0YXR1cywgdW5zaWduZWQgaW50IG9yZGVyKSxcbiAxMjE6XHRcbiAxMjI6XHRcdFRQX0FSR1MoZm9saW8sIG5vbmVfb3JfemVybywgcmVmZXJlbmNlZCwgc3RhdHVzLCBvcmRlciksXG4gMTIzOlx0XG4gMTI0Olx0XHRUUF9TVFJVQ1RfX2VudHJ5KFxuIDEyNTpcdFx0XHRfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIHBmbilcbiAxMjY6XHRcdFx0X19maWVsZChpbnQsIG5vbmVfb3JfemVybylcbiAxMjc6XHRcdFx0X19maWVsZChpbnQsIHJlZmVyZW5jZWQpXG4gMTI4Olx0XHRcdF9fZmllbGQoaW50LCBzdGF0dXMpXG4gMTI5Olx0XHRcdF9fZmllbGQodW5zaWduZWQgaW50LCBvcmRlcilcbiAxMzA6XHRcdCksXG4gMTMxOlx0XG4gMTMyOlx0XHRUUF9mYXN0X2Fzc2lnbihcbiAxMzM6XHRcdFx0X19lbnRyeS1cdTAwM2VwZm4gPSBmb2xpbyA/IGZvbGlvX3Bmbihmb2xpbykgOiAtMTtcbiAxMzQ6XHRcdFx0X19lbnRyeS1cdTAwM2Vub25lX29yX3plcm8gPSBub25lX29yX3plcm87XG4gMTM1Olx0XHRcdF9fZW50cnktXHUwMDNlcmVmZXJlbmNlZCA9IHJlZmVyZW5jZWQ7XG4gMTM2Olx0XHRcdF9fZW50cnktXHUwMDNlc3RhdHVzID0gc3RhdHVzO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0OTQ0MgoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDIyODkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQXNzZXNzbWVudCBvZiB0aGUgUGF0Y2gmIzM5O3MgSW1wYWN0IGFuZCB0aGUgTmVlZCBmb3IgRnV6emluZyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBwcmltYXJ5IGNvbmNlcm4gaXMgZW5zdXJpbmcgdGhpcyByZWZhY3RvcmluZyBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IHN1YnRsZSByZWdyZXNzaW9ucywgZXNwZWNpYWxseSBnaXZlbiBpdHMgdG91Y2ggb24gY29yZSBNTSBjb21wb25lbnRzIGxpa2Uga2h1Z2VwYWdlZC4gVGhlIGNvcmUgZnVuY3Rpb25hbCBjaGFuZ2UgYm9pbHMgZG93biB0byByZXBsYWNpbmcgYSBgVk1fQlVHX09OX0ZPTElPYCB3aXRoIGEgYFZNX1dBUk5fT05fRk9MSU9gIGFuZCB0aGUgY29ycmVzcG9uZGluZyByZXR1cm4gdmFsdWUuIEkgYWxzbyBhZGRlZCBgVk1fV0FSTl9PTl9GT0xJT2AgaW4gYGNvbGxhcHNlX3NjYW5fcG1kKClgLiBJdCBzZWVtcyB0aGF0IHRoZSBsb2dpYyYjMzk7cyBvdmVyYWxsIGJlaGF2aW9yIGlzIG1haW50YWluZWQuCgpTcGVjaWZpY2FsbHksIEkmIzM5O3ZlIGNoZWNrZWQgbXVsdGlwbGUgc2VjdGlvbnM6IFRoZSBoYW5kbGluZyBvZiBOVUxMIHZhbHVlcywgY2hlY2tzIG9uIHZhcmlvdXMgYGN0eGAgZmllbGRzIChgdW5tYXBwZWRgLCBgc2hhcmVkYCwgYG5vbmVfb3JfemVyb2ApIGFuZCB0aGVpciBpbnRlcmFjdGlvbnMgd2l0aCBsaW1pdHMsIGluY2x1ZGluZyBsb29raW5nIGludG8gYGNvbGxhcHNlX21heF9wdGVzX25vbmUoKWAgYW5kIGhvdyB0aGF0IGlzIGRlZmluZWQgYW5kIHVzZWQsIGFuZCB0aGUgaW5pdGlhbGl6YXRpb24gYGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKWAuIFRoaXMgc2VlbXMgY29ycmVjdC4gSSBzcGVudCBhIGZhaXIgYml0IG9mIHRpbWUgb24gYGNvbGxhcHNlX3NjYW5fZmlsZSgpYCBhbmQgY29uZmlybWluZyB0aGUgYWRkaXRpb24gb2YgYGJpdG1hcF96ZXJvYCBpcyBzYWZlIHRoZXJlLiBNeSBmb2N1cyB3YXMgcHJpbWFyaWx5IG9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgdG8gZW5zdXJlIHRoYXQgdGhlIGxvZ2ljIGlzIGlkZW50aWNhbCwgcGF5aW5nIHBhcnRpY3VsYXIgYXR0ZW50aW9uIHRvIHRoZSBpbnRlcmFjdGlvbnMgYmV0d2VlbiBgcHRlX25vbmVfb3JfemVybygpYCBhbmQgYHB0ZV9wcmVzZW50KClgLCBhbmQgaG93IHRoZXkgZmxvdyB0aHJvdWdoIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgLiBUaGUgYmVoYXZpb3Igc2VlbXMgaWRlbnRpY2FsLgoKV2hpbGUgdGhlIHNlbWFudGljIGNoYW5nZSBzZWVtcyBsaW1pdGVkLCB0aGUgaW50cm9kdWN0aW9uIG9mIHRoZSBgVk1fV0FSTl9PTl9GT0xJT2AgaXMgYSBwb3RlbnRpYWwgdHJpZ2dlciBmb3IgYW4gZWRnZSBjYXNlIHdoZXJlIGEgbm9uLWFub24gZm9saW8gbWlnaHQgZ2V0IG1hcHBlZCBpbnRvIGFub24gVk1BLiBHaXZlbiB0aGUgY29yZSBNTSBuYXR1cmUgb2YgdGhlIGNoYW5nZXMsIHRoZSByaXNrIG9mIHJlZ3Jlc3Npb25zLCBhbmQgdGhlIHBvdGVudGlhbCBmb3IgYSBzdWJ0bGUgZWRnZSBjYXNlIHdpdGggdGhlIHdhcm5pbmcsIGl0JiMzOTtzIHBydWRlbnQgdG8gdHJlYXQgdGhpcyBhcyBhIGNhbmRpZGF0ZSBmb3IgZnV6emluZy4gSSYjMzk7bGwgZmxhZyBgV29ydGhGdXp6aW5nPXRydWVgLgoKRm9yIGZ1enppbmcgdGFyZ2V0cywgSSYjMzk7bGwgZm9jdXMgb24gdGhlIGNyaXRpY2FsIGZ1bmN0aW9uczogYGNvbGxhcHNlX2NoZWNrX3B0ZWAsIGBjb2xsYXBzZV9zY2FuX3BtZGAsIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYCBhbmQgYG10aHBfY29sbGFwc2VgLiBJJiMzOTtsbCB3YW50IHRvIGVuc3VyZSB0aGF0IEkgaGF2ZSBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGVuYWJsZWQuIEkgY2FuIGFsc28gbG9vayBhdCBgUkVBRF9PTkxZX1RIUF9GT1JfRlNgLCBidXQgaXQgbWlnaHQgbm90IGJlIHJlbGV2YW50LiBJIHdpbGwgYWxzbyBlbmFibGUgYFVTRVJGQVVMVEZEYCwgc2luY2UgdGhlcmUmIzM5O3MgdGhlIGNoZWNrIGZvciBgcHRlX3VmZmRgIGluIHRoZSBjb2RlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZz04Mjk9Y29uZmlnIE1NX0lEXG4tLVxubW0vS2NvbmZpZy04MzEtXG5tbS9LY29uZmlnOjgzMjptZW51Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFXG5tbS9LY29uZmlnLTgzMy1cdGJvb2wgXCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydFwmIzM0O1xuLS1cbm1tL0tjb25maWc9ODUwPWNob2ljZVxuLS1cbm1tL0tjb25maWctODU1LVxubW0vS2NvbmZpZzo4NTY6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXG5tbS9LY29uZmlnLTg1Ny1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTg2Mi1cbm1tL0tjb25maWc6ODYzOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0Vcbm1tL0tjb25maWctODY0LVx0XHRib29sIFwmIzM0O21hZHZpc2VcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTg3MS1cbm1tL0tjb25maWc6ODcyOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX05FVkVSXG5tbS9LY29uZmlnLTg3My1cdFx0Ym9vbCBcJiMzNDtuZXZlclwmIzM0O1xuLS1cbm1tL0tjb25maWc9ODc5PWNob2ljZVxuLS1cbm1tL0tjb25maWctODg4LVxubW0vS2NvbmZpZzo4ODk6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9ORVZFUlxubW0vS2NvbmZpZy04OTAtXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTg5OC1cbm1tL0tjb25maWc6ODk5Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQUxXQVlTXG5tbS9LY29uZmlnLTkwMC1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTkwNi1cbm1tL0tjb25maWc6OTA3Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfV0lUSElOX1NJWkVcbm1tL0tjb25maWctOTA4LVx0XHRib29sIFwmIzM0O3dpdGhpbl9zaXplXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MTQtXG5tbS9LY29uZmlnOjkxNTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FEVklTRVxubW0vS2NvbmZpZy05MTYtXHRcdGJvb2wgXCYjMzQ7YWR2aXNlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz05MjQ9Y2hvaWNlXG4tLVxubW0vS2NvbmZpZy05MzMtXG5tbS9LY29uZmlnOjkzNDpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX05FVkVSXG5tbS9LY29uZmlnLTkzNS1cdFx0Ym9vbCBcJiMzNDtuZXZlclwmIzM0O1xuLS1cbm1tL0tjb25maWctOTQyLVxubW0vS2NvbmZpZzo5NDM6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BTFdBWVNcbm1tL0tjb25maWctOTQ0LVx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuLS1cbm1tL0tjb25maWctOTUwLVxubW0vS2NvbmZpZzo5NTE6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9XSVRISU5fU0laRVxubW0vS2NvbmZpZy05NTItXHRcdGJvb2wgXCYjMzQ7d2l0aGluX3NpemVcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk1OC1cbm1tL0tjb25maWc6OTU5Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQURWSVNFXG5tbS9LY29uZmlnLTk2MC1cdFx0Ym9vbCBcJiMzNDthZHZpc2VcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTI5ODYKCQkJCQkJCW91dHB1dDogMTkKCQkJCQkJCXRob3VnaHRzOiAzMjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgUmVhc29uaW5nIGZvciBTZWxlY3RpbmcgUmVsZXZhbnQgU3ltYm9scyoqCgpPa2F5LCBzbyBJJiMzOTttIGZvY3VzaW5nIG9uIHRoZSBzaWduaWZpY2FudCBjb25maWd1cmF0aW9ucyBhbmQgQVBJIGVudHJ5IHBvaW50cyByZWxhdGVkIHRvIFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMgKFRIUCkgZm9yIHRoaXMgdGFzay4gVGhlIHByaW1hcnkgY29uZmlndXJhdGlvbiBJIG5lZWQgdG8gY29uc2lkZXIgaXMsIG9mIGNvdXJzZSwgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYC4gSSYjMzk7bGwgYWxzbyBicmluZyBpbiBgVVNFUkZBVUxURkRgIHNpbmNlIGl0JiMzOTtzIGxpa2VseSByZWxldmFudCB0byB0aGUgb3ZlcmFsbCBwaWN0dXJlIG9mIFRIUCBtYW5hZ2VtZW50LgoKTm93LCBJJiMzOTttIGF0IHRoZSBwb2ludCB3aGVyZSBJIG5lZWQgdG8gc2VsZWN0IGZ1bmN0aW9ucy4gVGhlIGluc3RydWN0aW9ucyBzcGVjaWZ5IGEgcHJlZmVyZW5jZSBmb3Igbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5IHBvaW50cyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zLiBJIG5lZWQgdG8gYmUgY2FyZWZ1bCBoZXJlIGJlY2F1c2UgdGhlIGNvbXBpbGVyIGNhbiBpbmxpbmUuCgpMZXQgbWUgZG91YmxlLWNoZWNrIGBjb2xsYXBzZV9jaGVja19wdGVgLiBZZXAsIGl0JiMzOTtzIHN0YXRpYzoKCmBgYGMKc3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBjb2xsYXBzZV9jaGVja19wdGUocHRlX3QgcHRldmFsLAoJCXVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgpCmBgYAoKVGhlcmVmb3JlLCBJICp3b24mIzM5O3QqIGluY2x1ZGUgaXQuIEl0JiMzOTtzIGxpa2VseSBpbmxpbmVkLCBhbmQgbm90IGEgc3VpdGFibGUgZW50cnkgcG9pbnQuCgpJbnN0ZWFkLCBJIGNvbnNpZGVyZWQ6IGBjb2xsYXBzZV9zY2FuX3BtZGAsIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYCwgYG10aHBfY29sbGFwc2VgLCBhbmQgYGNvbGxhcHNlX2h1Z2VfcGFnZWAuIEJ1dCwgSSBxdWlja2x5IHJlYWxpemVkIHRoYXQgdGhvc2UgYXJlIGFsbCBhbHNvIHN0YXRpYyEgU28gdGhleSBhcmUgbm90IHdoYXQgSSBuZWVkLgoKSSBuZWVkIHRvIGZpbmQgdGhlIG5vbi1zdGF0aWMgZW50cnlwb2ludHMuIEhtbSwgSSBrbm93IGBraHVnZXBhZ2VkX3NjYW5fbW1fc2xvdGAgaXMgc3RhdGljLCBhbmQgYGtodWdlcGFnZWRgIGl0c2VsZiAodGhlIGtlcm5lbCB0aHJlYWQpIGlzIGFsc28gc3RhdGljLiBBaCEgV2FpdCBhIG1pbnV0ZSwgYG1hZHZpc2VfY29sbGFwc2VgICpzaG91bGQqIGJlIG5vbi1zdGF0aWMuIEkmIzM5O2xsIGRvdWJsZSBjaGVjayB0aGF0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttYWR2aXNlX2NvbGxhcHNlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdD0zNDY9QSBoaWdoZXIgdmFsdWUgbWF5IGluY3JlYXNlIG1lbW9yeSBmb290cHJpbnQgZm9yIHNvbWUgd29ya2xvYWRzLlxuLS1cbkRvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdC0zNTMtXG5Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3Q6MzU0OiAgIEN1cnJlbnRseSwgbWFkdmlzZV9jb2xsYXBzZSBvbmx5IHN1cHBvcnRzIGNvbGxhcHNpbmcgdG8gUE1ELXNpemVkIFRIUHNcbkRvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdC0zNTUtICAgYW5kIGRvZXMgbm90IGF0dGVtcHQgbVRIUCBjb2xsYXBzZXMuXG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NTExPWludCBodWdlcGFnZV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB2bV9mbGFnc190ICp2bV9mbGFncyxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTUxMi1cdFx0ICAgICBpbnQgYWR2aWNlKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjUxMzppbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTUxNC1cdFx0ICAgICB1bnNpZ25lZCBsb25nIGVuZCwgYm9vbCAqbG9ja19kcm9wcGVkKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD03MTI9c3RhdGljIGlubGluZSBpbnQgaHVnZXBhZ2VfbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC03MTctXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo3MTg6c3RhdGljIGlubGluZSBpbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTcxOS1cdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsXG4tLVxubW0va2h1Z2VwYWdlZC5jPTMxNzI9Ym9vbCBjdXJyZW50X2lzX2todWdlcGFnZWQodm9pZClcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzE3Ni1cbm1tL2todWdlcGFnZWQuYzozMTc3OnN0YXRpYyBpbnQgbWFkdmlzZV9jb2xsYXBzZV9lcnJubyhlbnVtIHNjYW5fcmVzdWx0IHIpXG5tbS9raHVnZXBhZ2VkLmMtMzE3OC17XG4tLVxubW0va2h1Z2VwYWdlZC5jLTMyMDgtXG5tbS9raHVnZXBhZ2VkLmM6MzIwOTppbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbm1tL2todWdlcGFnZWQuYy0zMjEwLVx0XHQgICAgIHVuc2lnbmVkIGxvbmcgZW5kLCBib29sICpsb2NrX2Ryb3BwZWQpXG4tLVxubW0va2h1Z2VwYWdlZC5jLTMyOTYtXHRyZXR1cm4gdGhwcyA9PSAoKGhlbmQgLSBoc3RhcnQpIFx1MDAzZVx1MDAzZSBIUEFHRV9QTURfU0hJRlQpID8gMFxubW0va2h1Z2VwYWdlZC5jOjMyOTc6XHRcdFx0OiBtYWR2aXNlX2NvbGxhcHNlX2Vycm5vKGxhc3RfZmFpbCk7XG5tbS9raHVnZXBhZ2VkLmMtMzI5OC19XG4tLVxubW0vbWFkdmlzZS5jPTEzMzg9c3RhdGljIGludCBtYWR2aXNlX3ZtYV9iZWhhdmlvcihzdHJ1Y3QgbWFkdmlzZV9iZWhhdmlvciAqbWFkdl9iZWhhdmlvcilcbi0tXG5tbS9tYWR2aXNlLmMtMTM2Mi1cdGNhc2UgTUFEVl9DT0xMQVBTRTpcbm1tL21hZHZpc2UuYzoxMzYzOlx0XHRyZXR1cm4gbWFkdmlzZV9jb2xsYXBzZSh2bWEsIHJhbmdlLVx1MDAzZXN0YXJ0LCByYW5nZS1cdTAwM2VlbmQsXG5tbS9tYWR2aXNlLmMtMTM2NC1cdFx0XHRcdTAwMjZtYWR2X2JlaGF2aW9yLVx1MDAzZWxvY2tfZHJvcHBlZCk7XG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTIzMT1zdGF0aWMgdm9pZCBmaWxsX21lbW9yeShpbnQgKnAsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0yNDQtICovXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MjQ1OnN0YXRpYyBpbnQgbWFkdmlzZV9jb2xsYXBzZV9yZXRyeSh2b2lkICpwLCB1bnNpZ25lZCBsb25nIHNpemUpXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMjQ2LXtcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM9MjYzPXN0YXRpYyB2b2lkICphbGxvY19ocGFnZShzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0yNzYtXHRrc2Z0X3ByaW50X21zZyhcJiMzNDtBbGxvY2F0ZSBodWdlIHBhZ2UuLi5cJiMzNDspO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjI3NzpcdGlmIChtYWR2aXNlX2NvbGxhcHNlX3JldHJ5KHAsIGhwYWdlX3BtZF9zaXplKSlcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0yNzgtXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttYWR2aXNlKE1BRFZfQ09MTEFQU0UpXCYjMzQ7KTtcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM9NTA0PXN0YXRpYyBib29sIGlzX2Fub24oc3RydWN0IG1lbV9vcHMgKm9wcylcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNTA4LVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjUwOTpzdGF0aWMgdm9pZCBfX21hZHZpc2VfY29sbGFwc2UoY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBpbnQgbnJfaHBhZ2VzLFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTUxMC1cdFx0XHQgICAgICAgc3RydWN0IG1lbV9vcHMgKm9wcywgYm9vbCBleHBlY3QpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTUzMi1cdG1hZHZpc2UocCwgbnJfaHBhZ2VzICogaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjUzMzpcdHJldCA9IG1hZHZpc2VfY29sbGFwc2VfcmV0cnkocCwgbnJfaHBhZ2VzICogaHBhZ2VfcG1kX3NpemUpO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTUzNC1cdGlmICgoKGJvb2wpcmV0KSA9PSBleHBlY3QpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTU0My1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzo1NDQ6c3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNTQ1LVx0XHRcdCAgICAgc3RydWN0IG1lbV9vcHMgKm9wcywgYm9vbCBleHBlY3QpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTU0OS1cdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1VuZXhwZWN0ZWQgaHVnZSBwYWdlXFxuXCYjMzQ7KTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzo1NTA6XHRfX21hZHZpc2VfY29sbGFwc2UobXNnLCBwLCBucl9ocGFnZXMsIG9wcywgZXhwZWN0KTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy01NTEtfVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYz02MjA9c3RhdGljIHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0IF9fbWFkdmlzZV9jb250ZXh0ID0ge1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjYyMTpcdC5jb2xsYXBzZSA9IFx1MDAyNm1hZHZpc2VfY29sbGFwc2UsXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNjIyLVx0LmVuZm9yY2VfcHRlX3NjYW5fbGltaXRzID0gZmFsc2UsXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTk4OD1zdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTEwNDUtXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MTA0NjpzdGF0aWMgdm9pZCBtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMTA0Ny1cdFx0XHRcdFx0ICAgc3RydWN0IG1lbV9vcHMgKm9wcylcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMTA1Ni1cdC8qIGMtXHUwMDNlY29sbGFwc2UoKSB3aWxsIGZpbmQgYSBodWdlcGFnZSBhbmQgY29tcGxhaW4gLSBjYWxsIGRpcmVjdGx5LiAqL1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjEwNTc6XHRfX21hZHZpc2VfY29sbGFwc2UoXCYjMzQ7UmUtY29sbGFwc2UgUE1ELW1hcHBlZCBodWdlcGFnZVwmIzM0OywgcCwgMSwgb3BzLCB0cnVlKTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0xMDU4LVx0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM9MTIwOD1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTEzMjYtXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MTMyNzpcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzoxMzI4Olx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzoxMzI5Olx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzoxMzMwOlx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgc2htZW1fb3BzKTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0xMzMxLVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NTg1MwoJCQkJCQkJb3V0cHV0OiAxNjAKCQkJCQkJCXRob3VnaHRzOiA1MTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgUG90ZW50aWFsIEZ1enppbmcgRW50cnlwb2ludHMqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBjb2RlIGFuZCB0cnlpbmcgdG8gZmlndXJlIG91dCB0aGUgYmVzdCBwb2ludHMgdG8gdGFyZ2V0IGZvciBmdXp6aW5nLiBUaGUgZ29hbCwgYXMgSSB1bmRlcnN0YW5kIGl0LCBpcyB0byBmaW5kIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50cywgYXMgdGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgdGhhdCByZXByZXNlbnQgdGhlICYjMzQ7ZnJvbnQgZG9vciYjMzQ7IG9mIHRoZSBmdW5jdGlvbmFsaXR5IHdlIHdhbnQgdG8gdGVzdC4gSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucywgYmVpbmcgaW5saW5lZCBieSB0aGUgY29tcGlsZXIsIGFyZSBlc3NlbnRpYWxseSBoaWRkZW4gd2l0aGluIHRoZSBsYXJnZXIgc3RydWN0dXJlcyBhbmQgZG9uJiMzOTt0IG9mZmVyIGFzIGNsZWFyIGEgdGVzdGluZyBzdXJmYWNlLgoKSW5pdGlhbGx5LCBJIGlkZW50aWZpZWQgYG1hZHZpc2VfY29sbGFwc2VgIGFzIGEga2V5IGNhbmRpZGF0ZS4gSXQmIzM5O3MgYSBub24tc3RhdGljIGVudHJ5cG9pbnQsIHBlcmZlY3QuIEkgbmVlZCB0byBpbmNsdWRlIGl0IGluIEZvY3VzU3ltYm9scy4gSSBhbHNvIGxvb2tlZCBhdCBga2h1Z2VwYWdlZGAsIGJ1dCB0aGF0JiMzOTtzIGEgc3RhdGljIGtlcm5lbCB0aHJlYWQg4oCTIHNvIGl0JiMzOTtzIG91dC4gVGhlbiwgSSBsb29rZWQgYXQgYGtodWdlcGFnZWRfc2Nhbl9wbWRgLCBidXQgdGhhdCYjMzk7cyBiZWVuIHJlbmFtZWQgdG8gYGNvbGxhcHNlX3NjYW5fcG1kYC4gYGtodWdlcGFnZWRfc2Nhbl9tbV9zbG90YCBpcyBhbHNvIG5vdCBhcHByb3ByaWF0ZS4gQWZ0ZXIgbW9yZSBpbnZlc3RpZ2F0aW9uLCBga2h1Z2VwYWdlZF9lbnRlcmAgYW5kIGBraHVnZXBhZ2VkX2VudGVyX3ZtYWAgYWxzbyBzZWVtIHRvIGZpdCB0aGUgYmlsbCBhcyBub24tc3RhdGljIGZ1bmN0aW9ucy4KCkhvd2V2ZXIsIHRoZSBwcm9tcHQgcmVhbGx5IGVtcGhhc2l6ZXMgcHJlZmVycmluZyB0aGUgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnRzLiBTbywgSSBuZWVkIHRvIHN0YXkgZm9jdXNlZCBvbiBgbWFkdmlzZV9jb2xsYXBzZWAuCgpCYXNlZCBvbiBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBwYXRjaCBhbmQgdGhlIGdvYWwsIHRoZSBtb3N0IGVmZmVjdGl2ZSBlbnRyeXBvaW50IHNlZW1zIHRvIGJlIGBtYWR2aXNlX2NvbGxhcHNlYC4gSSYjMzk7bSBnb2luZyB0byBzdGljayB3aXRoIHRoYXQuCgpUaGUgYnJvYWRlciBjb250ZXh0IHN1Z2dlc3RzIHRoaXMgZW50cnlwb2ludCBpcyB3b3J0aCBmdXp6aW5nLCB0aGF0JiMzOTtzIGNsZWFyLiBUaGUgcGF0Y2ggcmVmYWN0b3JzIHNvbWUgUFRFIGNoZWNraW5nIGxvZ2ljLCBhbmQgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgIGFuZCBga2h1Z2VwYWdlZGAgY2FuIGhlbHAgdmVyaWZ5IHRoYXQgdGhpcyBjaGFuZ2UgZG9lc24mIzM5O3QgaW50cm9kdWNlIHJlZ3Jlc3Npb25zLCBzcGVjaWZpY2FsbHkgYXJvdW5kIFBURSBzY2FubmluZyBvciB1bmluaXRpYWxpemVkIHZhcmlhYmxlIHVzYWdlLgoKTm93LCBsZXQmIzM5O3MgbWFrZSBzdXJlIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHNldCBhcHByb3ByaWF0ZWx5LiBJIG5lZWQgdG8gY2hlY2sgYFVTRVJGQVVMVEZEYCBiZWNhdXNlIHRoZSBjb2RlIGFwcGVhcnMgdG8gdXNlIGBwdGVfdWZmZGAuIEkmIzM5O3ZlIGNvbmZpcm1lZCB0aGF0IGBVU0VSRkFVTFRGRGAgaXMgaW5kZWVkIG5lZWRlZC4gQWxzbywgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBlc3NlbnRpYWwgYmVjYXVzZSBib3RoIGBraHVnZXBhZ2VkYCBhbmQgYG1hZHZpc2VfY29sbGFwc2VgIGFyZSBwYXJ0IG9mIHRoZSBUSFAgZnVuY3Rpb25hbGl0eS4KClNvLCBoZXJlJiMzOTtzIHRoZSBwbGFuOgoKKiAgICoqV29ydGhGdXp6aW5nOioqIGB0cnVlYAoqICAgKipGb2N1c1N5bWJvbHM6KiogYFsmIzM0O21hZHZpc2VfY29sbGFwc2UmIzM0O11gCiogICAqKkVuYWJsZUNvbmZpZ3M6KiogYFsmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssICYjMzQ7VVNFUkZBVUxURkQmIzM0O11gCiogICAqKlJlYXNvbmluZzoqKiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgUFRFIGNoZWNraW5nIGxvZ2ljIGZvciBUSFAgY29sbGFwc2UgaW50byBhIG5ldyBoZWxwZXIgZnVuY3Rpb24gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYC4gSXQgYWxzbyBtb2RpZmllcyB0aGUgYmVoYXZpb3Igd2hlbiBhIG5vbi1hbm9ueW1vdXMgZm9saW8gaXMgZW5jb3VudGVyZWQgaW4gYW4gYW5vbnltb3VzIFZNQSwgY2hhbmdpbmcgYSBgVk1fQlVHX09OX0ZPTElPYCB0byBhIGBWTV9XQVJOX09OX0ZPTElPYCBhbmQgcmV0dXJuaW5nIGFuIGVycm9yLiBGdXp6aW5nIGBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpYCBhbmQgYGtodWdlcGFnZWRgIGNhbiBoZWxwIHZlcmlmeSB0aGF0IHRoaXMgcmVmYWN0b3JpbmcgZG9lc24mIzM5O3QgaW50cm9kdWNlIHN1YnRsZSByZWdyZXNzaW9ucyBpbiBQVEUgc2Nhbm5pbmcgb3IgdW5pbml0aWFsaXplZCB2YXJpYWJsZSB1c2FnZS4mIzM0OwoKSSYjMzk7bSBjb25maWRlbnQgaW4gdGhpcyBhc3Nlc3NtZW50LiBJJiMzOTttIGdvaW5nIHRvIGNhbGwgYHNldC1yZXN1bHRzYCBub3cuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtVU0VSRkFVTFRGRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O21hZHZpc2VfY29sbGFwc2UmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIFBURSBjaGVja2luZyBsb2dpYyBmb3IgVEhQIGNvbGxhcHNlIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGNvbGxhcHNlX2NoZWNrX3B0ZSgpLiBJdCBhbHNvIG1vZGlmaWVzIHRoZSBiZWhhdmlvciB3aGVuIGEgbm9uLWFub255bW91cyBmb2xpbyBpcyBlbmNvdW50ZXJlZCBpbiBhbiBhbm9ueW1vdXMgVk1BLCBjaGFuZ2luZyBhIFZNX0JVR19PTl9GT0xJTyB0byBhIFZNX1dBUk5fT05fRk9MSU8gYW5kIHJldHVybmluZyBhbiBlcnJvci4gRnV6emluZyBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpIGFuZCBraHVnZXBhZ2VkIGNhbiBoZWxwIHZlcmlmeSB0aGF0IHRoaXMgcmVmYWN0b3JpbmcgZG9lc24mIzM5O3QgaW50cm9kdWNlIHN1YnRsZSByZWdyZXNzaW9ucyBpbiBQVEUgc2Nhbm5pbmcgb3IgdW5pbml0aWFsaXplZCB2YXJpYWJsZSB1c2FnZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OywKICAgICYjMzQ7VVNFUkZBVUxURkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDttYWR2aXNlX2NvbGxhcHNlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBQVEUgY2hlY2tpbmcgbG9naWMgZm9yIFRIUCBjb2xsYXBzZSBpbnRvIGEgbmV3IGhlbHBlciBmdW5jdGlvbiBjb2xsYXBzZV9jaGVja19wdGUoKS4gSXQgYWxzbyBtb2RpZmllcyB0aGUgYmVoYXZpb3Igd2hlbiBhIG5vbi1hbm9ueW1vdXMgZm9saW8gaXMgZW5jb3VudGVyZWQgaW4gYW4gYW5vbnltb3VzIFZNQSwgY2hhbmdpbmcgYSBWTV9CVUdfT05fRk9MSU8gdG8gYSBWTV9XQVJOX09OX0ZPTElPIGFuZCByZXR1cm5pbmcgYW4gZXJyb3IuIEZ1enppbmcgbWFkdmlzZShNQURWX0NPTExBUFNFKSBhbmQga2h1Z2VwYWdlZCBjYW4gaGVscCB2ZXJpZnkgdGhhdCB0aGlzIHJlZmFjdG9yaW5nIGRvZXNuJiMzOTt0IGludHJvZHVjZSBzdWJ0bGUgcmVncmVzc2lvbnMgaW4gUFRFIHNjYW5uaW5nIG9yIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgdXNhZ2UuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTozODo1OS4wNjQ1MDcwNzVaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyOTg4MDY4OTA1ODUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgICBcIlVTRVJGQVVMVEZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibWFkdmlzZV9jb2xsYXBzZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBQVEUgY2hlY2tpbmcgbG9naWMgZm9yIFRIUCBjb2xsYXBzZSBpbnRvIGEgbmV3IGhlbHBlciBmdW5jdGlvbiBjb2xsYXBzZV9jaGVja19wdGUoKS4gSXQgYWxzbyBtb2RpZmllcyB0aGUgYmVoYXZpb3Igd2hlbiBhIG5vbi1hbm9ueW1vdXMgZm9saW8gaXMgZW5jb3VudGVyZWQgaW4gYW4gYW5vbnltb3VzIFZNQSwgY2hhbmdpbmcgYSBWTV9CVUdfT05fRk9MSU8gdG8gYSBWTV9XQVJOX09OX0ZPTElPIGFuZCByZXR1cm5pbmcgYW4gZXJyb3IuIEZ1enppbmcgbWFkdmlzZShNQURWX0NPTExBUFNFKSBhbmQga2h1Z2VwYWdlZCBjYW4gaGVscCB2ZXJpZnkgdGhhdCB0aGlzIHJlZmFjdG9yaW5nIGRvZXNuJ3QgaW50cm9kdWNlIHN1YnRsZSByZWdyZXNzaW9ucyBpbiBQVEUgc2Nhbm5pbmcgb3IgdW5pbml0aWFsaXplZCB2YXJpYWJsZSB1c2FnZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6Mzg6NTkuMDY0NTEyNTY0WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzE0ODU4MTE2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgNTc4YTRkYTYwODNjNTU1MmMyNmYyYTcwZmVkOGFlOWI5YTM0OWY0MFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgVHVlIEF1ZyA0IDE5OjM4OjU3IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdFxcbmluZGV4IDE2ZjM3MTM1ZWQ4MGQuLmIxODdkNjE4NDUyZjQgMTAwNjQ0XFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XFxuKysrIGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XFxuQEAgLTIyNCw3ICsyMjQsNyBAQCBraHVnZXBhZ2VkIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIHdoZW4gYW55IFRIUCBzaXplIGlzIGVuYWJsZWRcXG4gKGVpdGhlciBvZiB0aGUgcGVyLXNpemUgYW5vbiBjb250cm9sIG9yIHRoZSB0b3AtbGV2ZWwgY29udHJvbCBhcmUgc2V0XFxuIHRvIFxcXCJhbHdheXNcXFwiIG9yIFxcXCJtYWR2aXNlXFxcIiksIGFuZCBpdCdsbCBiZSBhdXRvbWF0aWNhbGx5IHNodXRkb3duIHdoZW5cXG4gYWxsIFRIUCBzaXplcyBhcmUgZGlzYWJsZWQgKHdoZW4gYm90aCB0aGUgcGVyLXNpemUgYW5vbiBjb250cm9sIGFuZCB0aGVcXG4tdG9wLWxldmVsIGNvbnRyb2wgYXJlIFxcXCJuZXZlclxcXCIpXFxuK3RvcC1sZXZlbCBjb250cm9sIGFyZSBcXFwibmV2ZXJcXFwiKS5cXG4gXFxuIHByb2Nlc3MgVEhQIGNvbnRyb2xzXFxuIC0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuQEAgLTMwMSw3ICszMDEsOSBAQCBiZWluZyByZXBsYWNlZCBieSBhIFBNRCBtYXBwaW5nLCBvciAoMikgcGh5c2ljYWwgcGFnZXMgcmVwbGFjZWQgYnkgb25lXFxuIGh1Z2VwYWdlIG9mIHZhcmlvdXMgc2l6ZXMgKFBNRC1zaXplZCBvciBtVEhQKS4gRWFjaCBtYXkgaGFwcGVuIGluZGVwZW5kZW50bHksXFxuIG9yIHRvZ2V0aGVyLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgbWVtb3J5IGFuZCB0aGUgZmFpbHVyZXMgdGhhdCBvY2N1ci5cXG4gQXMgc3VjaCwgdGhpcyB2YWx1ZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgcm91Z2hseSBhcyBhIHNpZ24gb2YgcHJvZ3Jlc3MsXFxuLWFuZCBjb3VudGVycyBpbiAvcHJvYy92bXN0YXQgY29uc3VsdGVkIGZvciBtb3JlIGFjY3VyYXRlIGFjY291bnRpbmcpOjpcXG4rYW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZy5cXG4rUGVyLW9yZGVyIG1USFAgY29sbGFwc2Ugc3RhdGlzdGljcyBhcmUgYWxzbyBhdmFpbGFibGUgdW5kZXJcXG4rL3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2UvaHVnZXBhZ2VzLVxcdTAwM2NzaXplXFx1MDAzZWtCL3N0YXRzLyk6OlxcbiBcXG4gXFx0L3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2Uva2h1Z2VwYWdlZC9wYWdlc19jb2xsYXBzZWRcXG4gXFxuZGlmZiAtLWdpdCBhL21tL2todWdlcGFnZWQuYyBiL21tL2todWdlcGFnZWQuY1xcbmluZGV4IGIyMzdmNmU3NjYyYTUuLjMzMzhlOWRjMTFkZDAgMTAwNjQ0XFxuLS0tIGEvbW0va2h1Z2VwYWdlZC5jXFxuKysrIGIvbW0va2h1Z2VwYWdlZC5jXFxuQEAgLTY1LDYgKzY1LDEyIEBAIGVudW0gc2Nhbl9yZXN1bHQge1xcbiBcXHRTQ0FOX1BBR0VfRElSVFlfT1JfV1JJVEVCQUNLLFxcbiB9O1xcbiBcXG4rZW51bSBwdGVfY2hlY2tfcmVzdWx0IHtcXG4rXFx0UFRFX0NIRUNLX1NVQ0NFRUQsXFxuK1xcdFBURV9DSEVDS19GQUlMLFxcbitcXHRQVEVfQ0hFQ0tfQ09OVElOVUUsXFxuK307XFxuK1xcbiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFNcXG4gI2luY2x1ZGUgXFx1MDAzY3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oXFx1MDAzZVxcbiBcXG5AQCAtMTE5LDYgKzEyNSwyMCBAQCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCB7XFxuIFxcdERFQ0xBUkVfQklUTUFQKG10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcXG4gfTtcXG4gXFxuK3N0cnVjdCBwdGVfY2hlY2tfY29udGV4dCB7XFxuK1xcdHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYztcXG4rXFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7XFxuK1xcdHVuc2lnbmVkIGludCBvcmRlcjtcXG4rXFx0c3RydWN0IGZvbGlvICpmb2xpbztcXG4rXFx0aW50IG5vbmVfb3JfemVybztcXG4rXFx0aW50IHNoYXJlZDtcXG4rXFx0aW50IHVubWFwcGVkO1xcbitcXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdDtcXG4rXFx0dW5zaWduZWQgaW50IG1heF9wdGVzX25vbmU7XFxuK1xcdHVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwO1xcbitcXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkO1xcbit9O1xcbitcXG4gLyoqXFxuICAqIHN0cnVjdCBraHVnZXBhZ2VkX3NjYW4gLSBjdXJzb3IgZm9yIHNjYW5uaW5nXFxuICAqIEBtbV9oZWFkOiB0aGUgaGVhZCBvZiB0aGUgbW0gbGlzdCB0byBzY2FuXFxuQEAgLTYyMCw3ICs2NDAsNyBAQCB2b2lkIF9fa2h1Z2VwYWdlZF9leGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxcbiBcXHRcXHQvKlxcbiBcXHRcXHQgKiBUaGlzIGlzIHJlcXVpcmVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0XFxuIFxcdFxcdCAqIGNvbGxhcHNlX3Rlc3RfZXhpdCgpICh3aGljaCBpcyBndWFyYW50ZWVkIHRvIHJ1blxcbi1cXHRcXHQgKiB1bmRlciBtbWFwIHNlbSByZWFkIG1vZGUpLiBTdG9wIGhlcmUgKGFmdGVyIHdlIHJldHVybiBhbGxcXG4rXFx0XFx0ICogdW5kZXIgbW1hcF9sb2NrIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbFxcbiBcXHRcXHQgKiBwYWdldGFibGVzIHdpbGwgYmUgZGVzdHJveWVkKSB1bnRpbCBraHVnZXBhZ2VkIGhhcyBmaW5pc2hlZFxcbiBcXHRcXHQgKiB3b3JraW5nIG9uIHRoZSBwYWdldGFibGVzIHVuZGVyIHRoZSBtbWFwX2xvY2suXFxuIFxcdFxcdCAqL1xcbkBAIC02MjksNiArNjQ5LDEzIEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pXFxuIFxcdH1cXG4gfVxcbiBcXG4rc3RhdGljIHZvaWQgY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKVxcbit7XFxuK1xcdG1lbXNldChjYy1cXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXFx1MDAzZW5vZGVfbG9hZCkpO1xcbitcXHRub2Rlc19jbGVhcihjYy1cXHUwMDNlYWxsb2Nfbm1hc2spO1xcbitcXHRiaXRtYXBfemVybyhjYy1cXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpO1xcbit9XFxuK1xcbiBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiB7XFxuIFxcdG5vZGVfc3RhdF9tb2RfZm9saW8oZm9saW8sXFxuQEAgLTY2NSw3NiArNjkyLDE1NiBAQCBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9wYWdlcyhwdGVfdCAqcHRlLCBwdGVfdCAqX3B0ZSxcXG4gXFx0fVxcbiB9XFxuIFxcbisvKlxcbisgKiBwdGVfaXNfcmVmZXJlbmNlZCgpIC0gQ2hlY2sgZm9yIGVub3VnaCByZWZlcmVuY2VkIFBURXMgdG8ganVzdGlmeSBjb2xsYXBzaW5nXFxuKyAqXFxuKyAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGUgcGFnZSBoYXMgYmVlblxcbisgKiByZWNlbnRseSBhY2Nlc3NlZCAoeW91bmcgcHRlKSB0byBqdXN0aWZ5IGNvbGxhcHNpbmcgdGhlIHBhZ2UuXFxuKyAqXFxuKyAqIFJldHVybjogdHJ1ZSBpZiB0aGUgcGFnZSBoYXMgYmVlbiByZWNlbnRseSBhY2Nlc3NlZC5cXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBwdGVfaXNfcmVmZXJlbmNlZChzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsIHB0ZV90IHB0ZXZhbCxcXG4rXFx0c3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcilcXG4re1xcbitcXHRyZXR1cm4gY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fFxcbitcXHRcXHRmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XFxuK1xcdFxcdG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS1cXHUwMDNldm1fbW0sIGFkZHIpKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY291bnRfY29sbGFwc2VfZXZlbnQodW5zaWduZWQgaW50IG9yZGVyLCBlbnVtIHZtX2V2ZW50X2l0ZW0gdm1fZXZlbnQsXFxuK1xcdFxcdGVudW0gbXRocF9zdGF0X2l0ZW0gbXRocF9ldmVudClcXG4re1xcbitcXHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcXG4rXFx0XFx0Y291bnRfdm1fZXZlbnQodm1fZXZlbnQpO1xcbitcXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIG10aHBfZXZlbnQpO1xcbit9XFxuK1xcbisvKlxcbisgKiBwdGVfY2hlY2tfZmFpbCgpIC0gQSBzaW1wbGUgaGVscGVyIHRvIHNldCB0aGUgcHRlX2NoZWNrX2NvbnRleHQgcmVzdWx0IGFuZFxcbisgKiByZXR1cm4gUFRFX0NIRUNLX0ZBSUwuXFxuKyAqL1xcbitzdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVja19mYWlsKHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCAqY3R4LFxcbitcXHRcXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdClcXG4re1xcbitcXHRjdHgtXFx1MDAzZXJlc3VsdCA9IHJlc3VsdDtcXG4rXFx0cmV0dXJuIFBURV9DSEVDS19GQUlMO1xcbit9XFxuK1xcbisvKlxcbisgKiBjb2xsYXBzZV9jaGVja19wdGUoKSAtIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZVxcbisgKlxcbisgKiBDaGVjayBpZiBhIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2UgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjcml0ZXJpYTpcXG4rICogLSBtYXhfcHRlXyogdmFsdWVzIGFyZSBub3QgZXhjZWVkZWRcXG4rICogLSB1ZmZkIGlzIG5vdCBhY3RpdmVcXG4rICogLSBsYXp5ZnJlZSBwcm9wZXJ0aWVzIGFyZSBub3QgcHJlc2VudFxcbisgKiAtIG9ubHkgYW5vbnltb3VzIHBhZ2VzIGFyZSBwcmVzZW50XFxuKyAqXFxuKyAqIGEgaGVscGVyIHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBpcyB1c2VkIHRvIHBhc3MgYW5kIHN0b3JlIHJlbGV2YW50XFxuKyAqIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIGNvbGxhcHNlX2NoZWNrX3B0ZSgpIGZ1bmN0aW9uIGFuZCB0aGUgY2FsbGVyLlxcbisgKlxcbisgKiBSZXR1cm46IFBURV9DSEVDS19TVUNDRUVEIGlmIHRoZSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlLFxcbisgKiAgICAgICAgIFBURV9DSEVDS19GQUlMIGlmIHRoZSBQVEUgaXMgbm90IHN1aXRhYmxlIGZvciBjb2xsYXBzZSxcXG4rICogICAgICAgICBQVEVfQ0hFQ0tfQ09OVElOVUUgaWYgdGhlIHNjYW4gc2hvdWxkIGNvbnRpbnVlIHRvIGNoZWNrIHRoZSBuZXh0IFBURS5cXG4rICovXFxuK3N0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eClcXG4re1xcbitcXHRpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7XFxuK1xcdFxcdGlmICgrK2N0eC1cXHUwMDNlbm9uZV9vcl96ZXJvIFxcdTAwM2UgY3R4LVxcdTAwM2VtYXhfcHRlc19ub25lKSB7XFxuK1xcdFxcdFxcdGNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC1cXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xcbitcXHRcXHRcXHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9OT05FX1BURSk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0cmV0dXJuIFBURV9DSEVDS19DT05USU5VRTtcXG4rXFx0fVxcbitcXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcXG4rXFx0XFx0aWYgKGN0eC1cXHUwMDNldW5tYXBwZWQgPT0gLTEpXFxuK1xcdFxcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX05PTl9QUkVTRU5UKTtcXG4rXFx0XFx0aWYgKCsrY3R4LVxcdTAwM2V1bm1hcHBlZCBcXHUwMDNlIGN0eC1cXHUwMDNlbWF4X3B0ZXNfc3dhcCkge1xcbitcXHRcXHRcXHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXFx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTtcXG4rXFx0XFx0XFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfU1dBUF9QVEUpO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpXFxuK1xcdFxcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xcbitcXHRcXHRyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFO1xcbitcXHR9XFxuK1xcdC8qXFxuK1xcdCAqIERvbid0IGNvbGxhcHNlIGlmIGFueSBvZiB0aGUgc21hbGwgUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkXFxuK1xcdCAqIHdyaXRlIHByb3RlY3Rpb24uIE1hcmtpbmcgdGhlIG5ldyBodWdlIHBtZCBhcyB3cml0ZSBwcm90ZWN0ZWRcXG4rXFx0ICogY291bGQgYnJpbmcgdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbCBvdXRzaWRlIG9mIHRoZVxcbitcXHQgKiByZWdpc3RlcmVkIHJhbmdlLlxcbitcXHQgKi9cXG4rXFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpXFxuK1xcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xcbitcXG4rXFx0Y3R4LVxcdTAwM2Vmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyhjdHgtXFx1MDAzZXZtYSwgYWRkciwgcHRldmFsKTtcXG4rXFx0aWYgKHVubGlrZWx5KCFjdHgtXFx1MDAzZWZvbGlvKSB8fCB1bmxpa2VseShmb2xpb19pc196b25lX2RldmljZShjdHgtXFx1MDAzZWZvbGlvKSkpXFxuK1xcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9OVUxMKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcXG4rXFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxcbitcXHQgKi9cXG4rXFx0aWYgKGN0eC1cXHUwMDNlY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgXFx1MDAyNlxcdTAwMjYgIShjdHgtXFx1MDAzZXZtYS1cXHUwMDNldm1fZmxhZ3MgXFx1MDAyNiBWTV9EUk9QUEFCTEUpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBmb2xpb190ZXN0X2xhenlmcmVlKGN0eC1cXHUwMDNlZm9saW8pIFxcdTAwMjZcXHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSlcXG4rXFx0XFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0xBWllGUkVFKTtcXG4rXFxuK1xcdGlmICghZm9saW9fdGVzdF9hbm9uKGN0eC1cXHUwMDNlZm9saW8pKSB7XFxuK1xcdFxcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihjdHgtXFx1MDAzZWZvbGlvKSwgY3R4LVxcdTAwM2Vmb2xpbyk7XFxuK1xcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9BTk9OKTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoY3R4LVxcdTAwM2Vmb2xpbykpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXJcXG4rXFx0XFx0ICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhXFxuK1xcdFxcdCAqIHNoYXJlZCBtYXkgY2F1c2UgYSBmdXR1cmUgaGlnaGVyIG9yZGVyIGNvbGxhcHNlIG9uIGFcXG4rXFx0XFx0ICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKCsrY3R4LVxcdTAwM2VzaGFyZWQgXFx1MDAzZSBjdHgtXFx1MDAzZW1heF9wdGVzX3NoYXJlZCkge1xcbitcXHRcXHRcXHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXFx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7XFxuK1xcdFxcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiBQVEVfQ0hFQ0tfU1VDQ0VFRDtcXG4rfVxcbitcXG4gc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBwdGVfdCAqcHRlLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsXFxuIFxcdFxcdHVuc2lnbmVkIGludCBvcmRlciwgc3RydWN0IGxpc3RfaGVhZCAqY29tcG91bmRfcGFnZWxpc3QpXFxuIHtcXG4tXFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKTtcXG4tXFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpO1xcbiBcXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFxcdTAwM2NcXHUwMDNjIG9yZGVyO1xcbi1cXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7XFxuIFxcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMO1xcbiBcXHR1bnNpZ25lZCBsb25nIGFkZHIgPSBzdGFydF9hZGRyO1xcbi1cXHRwdGVfdCAqX3B0ZTtcXG4tXFx0aW50IG5vbmVfb3JfemVybyA9IDAsIHNoYXJlZCA9IDAsIHJlZmVyZW5jZWQgPSAwO1xcbitcXHRwdGVfdCAqX3B0ZSwgcHRldmFsO1xcbitcXHRpbnQgcmVmZXJlbmNlZCA9IDA7XFxuIFxcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xcbitcXHRlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrO1xcbitcXHRzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0ge1xcbitcXHRcXHQuY2MgPSBjYyxcXG4rXFx0XFx0LnZtYSA9IHZtYSxcXG4rXFx0XFx0Lm9yZGVyID0gb3JkZXIsXFxuK1xcdFxcdC51bm1hcHBlZCA9IC0xLCAvKiBkb24ndCBjaGVjayBzd2FwIFBURXMgKi9cXG4rXFx0XFx0Lm1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKSxcXG4rXFx0XFx0Lm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpLFxcbitcXHR9O1xcbiBcXG4gXFx0Zm9yIChfcHRlID0gcHRlOyBfcHRlIFxcdTAwM2MgcHRlICsgbnJfcGFnZXM7XFxuIFxcdCAgICAgX3B0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSkge1xcbi1cXHRcXHRwdGVfdCBwdGV2YWwgPSBwdGVwX2dldChfcHRlKTtcXG4tXFx0XFx0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xcbi1cXHRcXHRcXHRpZiAoKytub25lX29yX3plcm8gXFx1MDAzZSBtYXhfcHRlc19ub25lKSB7XFxuLVxcdFxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFO1xcbi1cXHRcXHRcXHRcXHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcXG4tXFx0XFx0XFx0XFx0XFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTtcXG4tXFx0XFx0XFx0XFx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xcbi1cXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0XFx0fVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0fVxcbi1cXHRcXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QVEVfTk9OX1BSRVNFTlQ7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHR9XFxuLVxcdFxcdGlmIChwdGVfdWZmZChwdGV2YWwpKSB7XFxuLVxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHR9XFxuLVxcdFxcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7XFxuLVxcdFxcdGlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHtcXG4tXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QQUdFX05VTEw7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHR9XFxuLVxcbi1cXHRcXHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XFxuLVxcdFxcdFZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSwgZm9saW8pO1xcbi1cXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogSWYgdGhlIHZtYSBoYXMgdGhlIFZNX0RST1BQQUJMRSBmbGFnLCB0aGUgY29sbGFwc2Ugd2lsbFxcbi1cXHRcXHQgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRpZiAoY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgXFx1MDAyNlxcdTAwMjYgISh2bWEtXFx1MDAzZXZtX2ZsYWdzIFxcdTAwMjYgVk1fRFJPUFBBQkxFKSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHQgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgXFx1MDAyNlxcdTAwMjYgIXB0ZV9kaXJ0eShwdGV2YWwpKSB7XFxuLVxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTtcXG4rXFx0XFx0cHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7XFxuK1xcdFxcdHB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsIFxcdTAwMjZjdHgpO1xcbitcXHRcXHRmb2xpbyA9IGN0eC5mb2xpbztcXG4rXFx0XFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkge1xcbitcXHRcXHRcXHRyZXN1bHQgPSBjdHgucmVzdWx0O1xcbiBcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0fVxcbitcXHRcXHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuIFxcbi1cXHRcXHQvKiBTZWUgY29sbGFwc2Vfc2Nhbl9wbWQoKS4gKi9cXG4tXFx0XFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7XFxuLVxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdCAqIFRPRE86IFN1cHBvcnQgc2hhcmVkIHBhZ2VzIHdpdGhvdXQgbGVhZGluZyB0byBmdXJ0aGVyXFxuLVxcdFxcdFxcdCAqIG1USFAgY29sbGFwc2VzLiBDdXJyZW50bHkgYnJpbmdpbmcgaW4gbmV3IHBhZ2VzIHZpYVxcbi1cXHRcXHRcXHQgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhXFxuLVxcdFxcdFxcdCAqIHJlc2NhbiBvZiB0aGUgc2FtZSByYW5nZS5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGlmICgrK3NoYXJlZCBcXHUwMDNlIG1heF9wdGVzX3NoYXJlZCkge1xcbi1cXHRcXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFO1xcbi1cXHRcXHRcXHRcXHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcXG4tXFx0XFx0XFx0XFx0XFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xcbi1cXHRcXHRcXHRcXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcXG4tXFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0fVxcbiBcXHRcXHQvKlxcbiBcXHRcXHQgKiBUT0RPOiBJbiBzb21lIGNhc2VzIG9mIHBhcnRpYWxseS1tYXBwZWQgZm9saW9zLCB3ZSdkIGFjdHVhbGx5XFxuIFxcdFxcdCAqIHdhbnQgdG8gY29sbGFwc2UuXFxuQEAgLTc1OSw4ICs4NjYsOCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogV2UgY2FuIGRvIGl0IGJlZm9yZSBmb2xpb19pc29sYXRlX2xydSBiZWNhdXNlIHRoZVxcbi1cXHRcXHQgKiBmb2xpbyBjYW4ndCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBQR19sb2NrXFxuLVxcdFxcdCAqIGlzIG5lZWRlZCB0byBzZXJpYWxpemUgYWdhaW5zdCBzcGxpdF9odWdlX3BhZ2VcXG4rXFx0XFx0ICogZm9saW8gY2FuJ3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogZm9saW8gbG9ja1xcbitcXHRcXHQgKiBpcyBuZWVkZWQgdG8gc2VyaWFsaXplIGFnYWluc3Qgc3BsaXRfaHVnZV9wYWdlKClcXG4gXFx0XFx0ICogd2hlbiBpbnZva2VkIGZyb20gdGhlIFZNLlxcbiBcXHRcXHQgKi9cXG4gXFx0XFx0aWYgKCFmb2xpb190cnlsb2NrKGZvbGlvKSkge1xcbkBAIC03ODYsNyArODkzLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0fVxcbiBcXG4gXFx0XFx0LypcXG4tXFx0XFx0ICogSXNvbGF0ZSB0aGUgcGFnZSB0byBhdm9pZCBjb2xsYXBzaW5nIGFuIGh1Z2VwYWdlXFxuK1xcdFxcdCAqIElzb2xhdGUgdGhlIGZvbGlvIHRvIGF2b2lkIGNvbGxhcHNpbmcgYSBodWdlcGFnZVxcbiBcXHRcXHQgKiBjdXJyZW50bHkgaW4gdXNlIGJ5IHRoZSBWTS5cXG4gXFx0XFx0ICovXFxuIFxcdFxcdGlmICghZm9saW9faXNvbGF0ZV9scnUoZm9saW8pKSB7XFxuQEAgLTgwMywxNCArOTEwLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxcbiBcXHRcXHRcXHRsaXN0X2FkZF90YWlsKFxcdTAwMjZmb2xpby1cXHUwMDNlbHJ1LCBjb21wb3VuZF9wYWdlbGlzdCk7XFxuIG5leHQ6XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpc1xcbi1cXHRcXHQgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZVxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdCAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcXG4tXFx0XFx0ICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XFxuLVxcdFxcdCAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVxcdTAwM2V2bV9tbSwgYWRkcikpKVxcbitcXHRcXHRpZiAocHRlX2lzX3JlZmVyZW5jZWQoY2MsIHB0ZXZhbCwgZm9saW8sIHZtYSwgYWRkcikpXFxuIFxcdFxcdFxcdHJlZmVyZW5jZWQrKztcXG4gXFx0fVxcbiBcXG5AQCAtODE4LDEzICs5MTgsMTMgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0cmVzdWx0ID0gU0NBTl9MQUNLX1JFRkVSRU5DRURfUEFHRTtcXG4gXFx0fSBlbHNlIHtcXG4gXFx0XFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xcbi1cXHRcXHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgbm9uZV9vcl96ZXJvLFxcbitcXHRcXHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybyxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0ICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpO1xcbiBcXHRcXHRyZXR1cm4gcmVzdWx0O1xcbiBcXHR9XFxuIG91dDpcXG4gXFx0cmVsZWFzZV9wdGVfcGFnZXMocHRlLCBfcHRlLCBjb21wb3VuZF9wYWdlbGlzdCk7XFxuLVxcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sXFxuK1xcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgcmVmZXJlbmNlZCwgcmVzdWx0LCBvcmRlcik7XFxuIFxcdHJldHVybiByZXN1bHQ7XFxuIH1cXG5AQCAtOTA0LDcgKzEwMDQsNyBAQCBzdGF0aWMgdm9pZCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X2ZhaWxlZChwdGVfdCAqcHRlLFxcbiBcXHQgKiBSZS1lc3RhYmxpc2ggdGhlIFBNRCB0byBwb2ludCB0byB0aGUgb3JpZ2luYWwgcGFnZSB0YWJsZVxcbiBcXHQgKiBlbnRyeS4gUmVzdG9yaW5nIFBNRCBuZWVkcyB0byBiZSBkb25lIHByaW9yIHRvIHJlbGVhc2luZ1xcbiBcXHQgKiBwYWdlcy4gU2luY2UgcGFnZXMgYXJlIHN0aWxsIGlzb2xhdGVkIGFuZCBsb2NrZWQgaGVyZSxcXG4tXFx0ICogYWNxdWlyaW5nIGFub25fdm1hX2xvY2tfd3JpdGUgaXMgdW5uZWNlc3NhcnkuXFxuK1xcdCAqIGFjcXVpcmluZyBhbm9uX3ZtYV9sb2NrX3dyaXRlKCkgaXMgdW5uZWNlc3NhcnkuXFxuIFxcdCAqL1xcbiBcXHRwbWRfcHRsID0gcG1kX2xvY2sodm1hLVxcdTAwM2V2bV9tbSwgcG1kKTtcXG4gXFx0cG1kX3BvcHVsYXRlKHZtYS1cXHUwMDNldm1fbW0sIHBtZCwgcG1kX3BndGFibGUob3JpZ19wbWQpKTtcXG5AQCAtMTA3OCw5ICsxMTc4LDkgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxcXG4gXFx0XFx0cmV0dXJuIFNDQU5fVk1BX0NIRUNLO1xcbiBcXHQvKlxcbiBcXHQgKiBBbm9uIFZNQSBleHBlY3RlZCwgdGhlIGFkZHJlc3MgbWF5IGJlIHVubWFwcGVkIHRoZW5cXG4tXFx0ICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYXF1aXJlZCB0aGUgbW1hcF9sb2NrLlxcbitcXHQgKiByZW1hcHBlZCB0byBmaWxlIGFmdGVyIGtodWdlcGFnZWQgcmVhY3F1aXJlZCB0aGUgbW1hcF9sb2NrLlxcbiBcXHQgKlxcbi1cXHQgKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMgbWF5IHJldHVybiB0cnVlIGZvciBxdWFsaWZpZWQgZmlsZVxcbitcXHQgKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoKSBtYXkgcmV0dXJuIHRydWUgZm9yIHF1YWxpZmllZCBmaWxlXFxuIFxcdCAqIHZtYXMuXFxuIFxcdCAqL1xcbiBcXHRpZiAoZXhwZWN0X2Fub24gXFx1MDAyNlxcdTAwMjYgKCEoKnZtYXApLVxcdTAwM2Vhbm9uX3ZtYSB8fCAhdm1hX2lzX2Fub255bW91cygqdm1hcCkpKVxcbkBAIC0xMTM2LDcgKzEyMzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjaGVja19wbWRfc3RpbGxfdmFsaWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIFxcbiAvKlxcbiAgKiBCcmluZyBtaXNzaW5nIHBhZ2VzIGluIGZyb20gc3dhcCwgdG8gY29tcGxldGUgVEhQIGNvbGxhcHNlLlxcbi0gKiBPbmx5IGRvbmUgaWYga2h1Z2VwYWdlZF9zY2FuX3BtZCBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLlxcbisgKiBPbmx5IGRvbmUgaWYgY29sbGFwc2Vfc2Nhbl9wbWQoKSBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLlxcbiAgKlxcbiAgKiBGb3IgbVRIUCBvcmRlcnMgdGhlIGZ1bmN0aW9uIGJhaWxzIG9uIHRoZSBmaXJzdCBzd2FwIGVudHJ5LCBiZWNhdXNlXFxuICAqIGZhdWx0aW5nIHBhZ2VzIGJhY2sgaW4gZHVyaW5nIGNvbGxhcHNlIGNvdWxkIHJlLXBvcHVsYXRlIFBURXMgdGhhdFxcbkBAIC0xMjA0LDcgKzEzMDQsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4oc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIFxcdFxcdHB0ZSA9IE5VTEw7XFxuIFxcbiBcXHRcXHQvKlxcbi1cXHRcXHQgKiBkb19zd2FwX3BhZ2UgcmV0dXJucyBWTV9GQVVMVF9SRVRSWSB3aXRoIHJlbGVhc2VkIG1tYXBfbG9jay5cXG4rXFx0XFx0ICogZG9fc3dhcF9wYWdlKCkgcmV0dXJucyBWTV9GQVVMVF9SRVRSWSB3aXRoIHJlbGVhc2VkIG1tYXBfbG9jay5cXG4gXFx0XFx0ICogTm90ZSB3ZSB0cmVhdCBWTV9GQVVMVF9SRVRSWSBhcyBWTV9GQVVMVF9FUlJPUiBoZXJlIGJlY2F1c2VcXG4gXFx0XFx0ICogd2UgZG8gbm90IHJldHJ5IGhlcmUgYW5kIHN3YXAgZW50cnkgd2lsbCByZW1haW4gaW4gcGFnZXRhYmxlXFxuIFxcdFxcdCAqIHJlc3VsdGluZyBpbiBsYXRlciBmYWlsdXJlLlxcbkBAIC0xMjQ3LDE1ICsxMzQ3LDEyIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGFsbG9jX2NoYXJnZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKipmb2xpb3AsIHN0cnVjdCBtbV9zdHJ1XFxuIFxcdGZvbGlvID0gX19mb2xpb19hbGxvYyhnZnAsIG9yZGVyLCBub2RlLCBcXHUwMDI2Y2MtXFx1MDAzZWFsbG9jX25tYXNrKTtcXG4gXFx0aWYgKCFmb2xpbykge1xcbiBcXHRcXHQqZm9saW9wID0gTlVMTDtcXG4tXFx0XFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXFxuLVxcdFxcdFxcdGNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xcbi1cXHRcXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xcbitcXHRcXHRjb3VudF9jb2xsYXBzZV9ldmVudChvcmRlciwgVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCxcXG4rXFx0XFx0XFx0XFx0ICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTtcXG4gXFx0XFx0cmV0dXJuIFNDQU5fQUxMT0NfSFVHRV9QQUdFX0ZBSUw7XFxuIFxcdH1cXG4gXFxuLVxcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxcbi1cXHRcXHRjb3VudF92bV9ldmVudChUSFBfQ09MTEFQU0VfQUxMT0MpO1xcbi1cXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQyk7XFxuK1xcdGNvdW50X2NvbGxhcHNlX2V2ZW50KG9yZGVyLCBUSFBfQ09MTEFQU0VfQUxMT0MsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQyk7XFxuIFxcbiBcXHRpZiAodW5saWtlbHkobWVtX2Nncm91cF9jaGFyZ2UoZm9saW8sIG1tLCBnZnApKSkge1xcbiBcXHRcXHRmb2xpb19wdXQoZm9saW8pO1xcbkBAIC0xMjcxLDcgKzEzNjgsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydVxcbiB9XFxuIFxcbiAvKlxcbi0gKiBjb2xsYXBzZV9odWdlX3BhZ2UgZXhwZWN0cyB0aGUgbW1hcF9sb2NrIHRvIGJlIHVubG9ja2VkIGJlZm9yZSBlbnRlcmluZyBhbmRcXG4rICogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbW1hcF9sb2NrIHRvIGJlIHVubG9ja2VkIGJlZm9yZSBlbnRlcmluZyBhbmRcXG4gICogd2lsbCBhbHdheXMgcmV0dXJuIHdpdGggdGhlIGxvY2sgdW5sb2NrZWQsIHRvIGF2b2lkIGhvbGRpbmcgdGhlIG1tYXBfbG9ja1xcbiAgKiB3aGlsZSBhbGxvY2F0aW5nIGEgVEhQLCBhcyB0aGF0IGNvdWxkIHRyaWdnZXIgZGlyZWN0IHJlY2xhaW0vY29tcGFjdGlvbi5cXG4gICogTm90ZSB0aGF0IHRoZSBWTUEgbXVzdCBiZSByZWNoZWNrZWQgYWZ0ZXIgZ3JhYmJpbmcgdGhlIG1tYXBfbG9jayBhZ2Fpbi5cXG5AQCAtMTMxOCw3ICsxNDE1LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcXG4gXFxuIFxcdGlmICh1bm1hcHBlZCkge1xcbiBcXHRcXHQvKlxcbi1cXHRcXHQgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4gd2lsbCByZXR1cm4gd2l0aCBtbWFwX2xvY2tcXG4rXFx0XFx0ICogX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKCkgd2lsbCByZXR1cm4gd2l0aCBtbWFwX2xvY2tcXG4gXFx0XFx0ICogcmVsZWFzZWQgd2hlbiBpdCBmYWlscy4gU28gd2UganVtcCBvdXRfbm9sb2NrIGRpcmVjdGx5IGluXFxuIFxcdFxcdCAqIHRoYXQgY2FzZS4gIENvbnRpbnVpbmcgdG8gY29sbGFwc2UgY2F1c2VzIGluY29uc2lzdGVuY3kuXFxuIFxcdFxcdCAqL1xcbkBAIC0xMzMxLDggKzE0MjgsOCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xcbiBcXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcXG4gXFx0LypcXG4gXFx0ICogUHJldmVudCBhbGwgYWNjZXNzIHRvIHBhZ2V0YWJsZXMgd2l0aCB0aGUgZXhjZXB0aW9uIG9mXFxuLVxcdCAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHB0ZXBfY2xlYXJfZmx1c2ggYW5kIHRoZSBWTVxcbi1cXHQgKiBoYW5kbGVkIGJ5IHRoZSBhbm9uX3ZtYSBsb2NrICsgUEdfbG9jay5cXG4rXFx0ICogZ3VwX2Zhc3QgbGF0ZXIgaGFuZGxlZCBieSB0aGUgcG1kcF9jb2xsYXBzZV9mbHVzaCgpIGFuZCB0aGUgVk1cXG4rXFx0ICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayArIGZvbGlvIGxvY2suXFxuIFxcdCAqXFxuIFxcdCAqIFVGRkRJT19NT1ZFIGlzIHByZXZlbnRlZCB0byByYWNlIGFzIHdlbGwgdGhhbmtzIHRvIHRoZVxcbiBcXHQgKiBtbWFwX2xvY2suXFxuQEAgLTEzODksOSArMTQ4Niw5IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXFxuIFxcdFxcdHNwaW5fbG9jayhwbWRfcHRsKTtcXG4gXFx0XFx0Vk1fV0FSTl9PTl9PTkNFKCFwbWRfbm9uZSgqcG1kKSk7XFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIFdlIGNhbiBvbmx5IHVzZSBzZXRfcG1kX2F0IHdoZW4gZXN0YWJsaXNoaW5nXFxuK1xcdFxcdCAqIFdlIGNhbiBvbmx5IHVzZSBzZXRfcG1kX2F0KCkgd2hlbiBlc3RhYmxpc2hpbmdcXG4gXFx0XFx0ICogaHVnZXBtZHMgYW5kIG5ldmVyIGZvciBlc3RhYmxpc2hpbmcgcmVndWxhciBwbWRzIHRoYXRcXG4tXFx0XFx0ICogcG9pbnRzIHRvIHJlZ3VsYXIgcGFnZXRhYmxlcy4gVXNlIHBtZF9wb3B1bGF0ZSBmb3IgdGhhdFxcbitcXHRcXHQgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlKCkgZm9yIHRoYXRcXG4gXFx0XFx0ICovXFxuIFxcdFxcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwbWRfcGd0YWJsZShfcG1kKSk7XFxuIFxcdFxcdHNwaW5fdW5sb2NrKHBtZF9wdGwpO1xcbkBAIC0xNDM5LDcgKzE1MzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xcbiBcXHRcXHRcXHRzcGluX2xvY2tfbmVzdGVkKHB0ZV9wdGwsIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTtcXG4gXFx0XFx0cG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBtZF9wZ3RhYmxlKF9wbWQpKTtcXG4gXFx0XFx0bWFwX2Fub25fZm9saW9fcHRlX25vcGYoZm9saW8sIHB0ZSwgdm1hLCBzdGFydF9hZGRyLFxcbi1cXHRcXHRcXHRcXHRcXHQgIC8qdWZmZF93cD0qLyBmYWxzZSk7XFxuK1xcdFxcdFxcdFxcdFxcdCAgLyp1ZmZkPSovIGZhbHNlKTtcXG4gXFx0XFx0aWYgKHB0ZV9wdGwgIT0gcG1kX3B0bClcXG4gXFx0XFx0XFx0c3Bpbl91bmxvY2socHRlX3B0bCk7XFxuIFxcdH1cXG5AQCAtMTQ0OSwxMCArMTU0NiwxMCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xcbiBcXG4gXFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xcbiBvdXRfdXBfd3JpdGU6XFxuLVxcdGlmIChhbm9uX3ZtYV9sb2NrZWQpXFxuLVxcdFxcdGFub25fdm1hX3VubG9ja193cml0ZSh2bWEtXFx1MDAzZWFub25fdm1hKTtcXG4gXFx0aWYgKHB0ZSlcXG4gXFx0XFx0cHRlX3VubWFwKHB0ZSk7XFxuK1xcdGlmIChhbm9uX3ZtYV9sb2NrZWQpXFxuK1xcdFxcdGFub25fdm1hX3VubG9ja193cml0ZSh2bWEtXFx1MDAzZWFub25fdm1hKTtcXG4gXFx0bW1hcF93cml0ZV91bmxvY2sobW0pO1xcbiBvdXRfbm9sb2NrOlxcbiBcXHRpZiAoZm9saW8pXFxuQEAgLTE1OTMsNDIgKzE2OTAsNDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIFxcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsXFxuIFxcdFxcdGJvb2wgKmxvY2tfZHJvcHBlZCwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKVxcbiB7XFxuLVxcdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIEhQQUdFX1BNRF9PUkRFUik7XFxuLVxcdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwID0gY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChjYywgSFBBR0VfUE1EX09SREVSKTtcXG4tXFx0dW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIEhQQUdFX1BNRF9PUkRFUik7XFxuIFxcdGVudW0gdHZhX3R5cGUgdHZhX2ZsYWdzID0gY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgPyBUVkFfS0hVR0VQQUdFRCA6IFRWQV9GT1JDRURfQ09MTEFQU0U7XFxuIFxcdHBtZF90ICpwbWQ7XFxuIFxcdHB0ZV90ICpwdGUsICpfcHRlLCBwdGV2YWw7XFxuIFxcdGludCBpO1xcbi1cXHRpbnQgbm9uZV9vcl96ZXJvID0gMCwgc2hhcmVkID0gMCwgcmVmZXJlbmNlZCA9IDA7XFxuLVxcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xcbi1cXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7XFxuIFxcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMO1xcbitcXHRpbnQgcmVmZXJlbmNlZCA9IDA7XFxuK1xcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xcbiBcXHR1bnNpZ25lZCBsb25nIGFkZHI7XFxuIFxcdHVuc2lnbmVkIGxvbmcgZW5hYmxlZF9vcmRlcnM7XFxuIFxcdHNwaW5sb2NrX3QgKnB0bDtcXG4tXFx0aW50IG5vZGUgPSBOVU1BX05PX05PREUsIHVubWFwcGVkID0gMDtcXG4rXFx0aW50IG5vZGUgPSBOVU1BX05PX05PREU7XFxuK1xcdGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2s7XFxuIFxcbiBcXHRWTV9CVUdfT04oc3RhcnRfYWRkciBcXHUwMDI2IH5IUEFHRV9QTURfTUFTSyk7XFxuIFxcbitcXHRzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0ge1xcbitcXHRcXHQuY2MgPSBjYyxcXG4rXFx0XFx0LnZtYSA9IHZtYSxcXG4rXFx0XFx0Lm9yZGVyID0gSFBBR0VfUE1EX09SREVSLFxcbitcXHRcXHQubWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKSxcXG4rXFx0XFx0Lm1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpLFxcbitcXHRcXHQubWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBIUEFHRV9QTURfT1JERVIpLFxcbitcXHR9O1xcbitcXG4gXFx0cmVzdWx0ID0gZmluZF9wbWRfb3JfdGhwX29yX25vbmUobW0sIHN0YXJ0X2FkZHIsIFxcdTAwMjZwbWQpO1xcbiBcXHRpZiAocmVzdWx0ICE9IFNDQU5fU1VDQ0VFRCkge1xcbiBcXHRcXHRjYy1cXHUwMDNlcHJvZ3Jlc3MrKztcXG4gXFx0XFx0Z290byBvdXQ7XFxuIFxcdH1cXG4gXFxuLVxcdGJpdG1hcF96ZXJvKGNjLVxcdTAwM2VtdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7XFxuLVxcdG1lbXNldChjYy1cXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXFx1MDAzZW5vZGVfbG9hZCkpO1xcbi1cXHRub2Rlc19jbGVhcihjYy1cXHUwMDNlYWxsb2Nfbm1hc2spO1xcbitcXHRjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7XFxuIFxcbiBcXHRlbmFibGVkX29yZGVycyA9IGNvbGxhcHNlX3Bvc3NpYmxlX29yZGVycyh2bWEsIHZtYS1cXHUwMDNldm1fZmxhZ3MsIHR2YV9mbGFncyk7XFxuIFxcbiBcXHQvKlxcbiBcXHQgKiBJZiBQTUQgaXMgdGhlIG9ubHkgZW5hYmxlZCBvcmRlciwgZW5mb3JjZSBtYXhfcHRlc19ub25lLCBvdGhlcndpc2VcXG4tXFx0ICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS5cXG4rXFx0ICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS4gVGhlIGJpdG1hcFxcbitcXHQgKiBpcyB0aGVuIGNoZWNrZWQgYWdhaW4gaW4gbXRocF9jb2xsYXBzZSgpIGZvciBlYWNoIGF0dGVtcHRlZCBvcmRlci5cXG4gXFx0ICovXFxuIFxcdGlmIChlbmFibGVkX29yZGVycyAhPSBCSVQoSFBBR0VfUE1EX09SREVSKSlcXG4tXFx0XFx0bWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7XFxuK1xcdFxcdGN0eC5tYXhfcHRlc19ub25lID0gS0hVR0VQQUdFRF9NQVhfUFRFU19MSU1JVDtcXG4gXFxuIFxcdHB0ZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgc3RhcnRfYWRkciwgXFx1MDAyNnB0bCk7XFxuIFxcdGlmICghcHRlKSB7XFxuQEAgLTE2NDQsODQgKzE3NDYsMTQgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIFxcbiBcXHRcXHRjYy1cXHUwMDNlcHJvZ3Jlc3MrKztcXG4gXFxuLVxcdFxcdGlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0aWYgKCsrbm9uZV9vcl96ZXJvIFxcdTAwM2UgbWF4X3B0ZXNfbm9uZSkge1xcbi1cXHRcXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9OT05FX1BURTtcXG4tXFx0XFx0XFx0XFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTtcXG4tXFx0XFx0XFx0XFx0Y291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUixcXG4tXFx0XFx0XFx0XFx0XFx0XFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTtcXG4tXFx0XFx0XFx0XFx0Z290byBvdXRfdW5tYXA7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0Y29udGludWU7XFxuLVxcdFxcdH1cXG4tXFx0XFx0aWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7XFxuLVxcdFxcdFxcdGlmICgrK3VubWFwcGVkIFxcdTAwM2UgbWF4X3B0ZXNfc3dhcCkge1xcbi1cXHRcXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TV0FQX1BURTtcXG4tXFx0XFx0XFx0XFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NXQVBfUFRFKTtcXG4tXFx0XFx0XFx0XFx0Y291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUixcXG4tXFx0XFx0XFx0XFx0XFx0XFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTtcXG4tXFx0XFx0XFx0XFx0Z290byBvdXRfdW5tYXA7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogQWx3YXlzIGJlIHN0cmljdCB3aXRoIHVmZmQtd3BcXG4tXFx0XFx0XFx0ICogZW5hYmxlZCBzd2FwIGVudHJpZXMuICBQbGVhc2Ugc2VlXFxuLVxcdFxcdFxcdCAqIGNvbW1lbnQgYmVsb3cgZm9yIHB0ZV91ZmZkKCkuXFxuLVxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRpZiAocHRlX3N3cF91ZmZkX2FueShwdGV2YWwpKSB7XFxuLVxcdFxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XFxuLVxcdFxcdFxcdFxcdGdvdG8gb3V0X3VubWFwO1xcbi1cXHRcXHRcXHR9XFxuLVxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXHRcXHR9XFxuLVxcdFxcdGlmIChwdGVfdWZmZChwdGV2YWwpKSB7XFxuLVxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdCAqIERvbid0IGNvbGxhcHNlIHRoZSBwYWdlIGlmIGFueSBvZiB0aGUgc21hbGxcXG4tXFx0XFx0XFx0ICogUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkIHdyaXRlIHByb3RlY3Rpb24uXFxuLVxcdFxcdFxcdCAqIEhlcmUgd2UgY2FuIGFsc28gbWFyayB0aGUgbmV3IGh1Z2UgcG1kIGFzXFxuLVxcdFxcdFxcdCAqIHdyaXRlIHByb3RlY3RlZCBpZiBhbnkgb2YgdGhlIHNtYWxsIG9uZXMgaXNcXG4tXFx0XFx0XFx0ICogbWFya2VkIGJ1dCB0aGF0IGNvdWxkIGJyaW5nIHVua25vd25cXG4tXFx0XFx0XFx0ICogdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbHMgb3V0c2lkZSBvZlxcbi1cXHRcXHRcXHQgKiB0aGUgcmVnaXN0ZXJlZCByYW5nZS4gIFNvLCBqdXN0IGJlIHNpbXBsZS5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XFxuLVxcdFxcdFxcdGdvdG8gb3V0X3VubWFwO1xcbi1cXHRcXHR9XFxuLVxcbi1cXHRcXHRwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGV2YWwpO1xcbi1cXHRcXHRpZiAodW5saWtlbHkoIXBhZ2UpIHx8IHVubGlrZWx5KGlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSkpKSB7XFxuLVxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMO1xcbi1cXHRcXHRcXHRnb3RvIG91dF91bm1hcDtcXG4tXFx0XFx0fVxcbi1cXHRcXHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XFxuLVxcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsXFxuLVxcdFxcdCAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdGlmIChjYy1cXHUwMDNlaXNfa2h1Z2VwYWdlZCBcXHUwMDI2XFx1MDAyNiAhKHZtYS1cXHUwMDNldm1fZmxhZ3MgXFx1MDAyNiBWTV9EUk9QUEFCTEUpIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdCAgICBmb2xpb190ZXN0X2xhenlmcmVlKGZvbGlvKSBcXHUwMDI2XFx1MDAyNiAhcHRlX2RpcnR5KHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QQUdFX0xBWllGUkVFO1xcbitcXHRcXHRwdGVfY2hlY2sgPSBjb2xsYXBzZV9jaGVja19wdGUocHRldmFsLCBhZGRyLCBcXHUwMDI2Y3R4KTtcXG4rXFx0XFx0Zm9saW8gPSBjdHguZm9saW87XFxuK1xcdFxcdGlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0ZBSUwpIHtcXG4rXFx0XFx0XFx0cmVzdWx0ID0gY3R4LnJlc3VsdDtcXG4gXFx0XFx0XFx0Z290byBvdXRfdW5tYXA7XFxuIFxcdFxcdH1cXG4tXFxuLVxcdFxcdGlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkge1xcbi1cXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX1BBR0VfQU5PTjtcXG4tXFx0XFx0XFx0Z290byBvdXRfdW5tYXA7XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIFdlIHRyZWF0IGEgc2luZ2xlIHBhZ2UgYXMgc2hhcmVkIGlmIGFueSBwYXJ0IG9mIHRoZSBUSFBcXG4tXFx0XFx0ICogaXMgc2hhcmVkLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7XFxuLVxcdFxcdFxcdGlmICgrK3NoYXJlZCBcXHUwMDNlIG1heF9wdGVzX3NoYXJlZCkge1xcbi1cXHRcXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFO1xcbi1cXHRcXHRcXHRcXHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSk7XFxuLVxcdFxcdFxcdFxcdGNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcXG4tXFx0XFx0XFx0XFx0Z290byBvdXRfdW5tYXA7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0fVxcbitcXHRcXHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuIFxcbiBcXHRcXHQvKiBTZXQgYml0IGZvciBvY2N1cGllZCBwYWdlcyAqL1xcbiBcXHRcXHRfX3NldF9iaXQoaSwgY2MtXFx1MDAzZW10aHBfcHJlc2VudF9wdGVzKTtcXG5AQCAtMTc0OSwzMSArMTc4MSwyMSBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogQ2hlY2sgaWYgdGhlIHBhZ2UgaGFzIGFueSBHVVAgKG9yIG90aGVyIGV4dGVybmFsKSBwaW5zLlxcbiBcXHRcXHQgKlxcbi1cXHRcXHQgKiBIZXJlIHRoZSBjaGVjayBtYXkgYmUgcmFjeTpcXG4tXFx0XFx0ICogaXQgbWF5IHNlZSBmb2xpb19tYXBjb3VudCgpIFxcdTAwM2UgZm9saW9fcmVmX2NvdW50KCkuXFxuLVxcdFxcdCAqIEJ1dCBzdWNoIGNhc2UgaXMgZXBoZW1lcmFsIHdlIGNvdWxkIGFsd2F5cyByZXRyeSBjb2xsYXBzZVxcbi1cXHRcXHQgKiBsYXRlci4gIEhvd2V2ZXIgaXQgbWF5IHJlcG9ydCBmYWxzZSBwb3NpdGl2ZSBpZiB0aGUgcGFnZVxcbi1cXHRcXHQgKiBoYXMgZXhjZXNzaXZlIEdVUCBwaW5zIChpLmUuIDUxMikuICBBbnl3YXkgdGhlIHNhbWUgY2hlY2tcXG4tXFx0XFx0ICogd2lsbCBiZSBkb25lIGFnYWluIGxhdGVyIHRoZSByaXNrIHNlZW1zIGxvdy5cXG4rXFx0XFx0ICogSGVyZSB0aGUgY2hlY2sgaXMgcmFjeSwgYnV0IHN1Y2ggY2FzZSBpcyBlcGhlbWVyYWwgYW5kXFxuK1xcdFxcdCAqIHdlIGNvdWxkIGFsd2F5cyByZXRyeSBjb2xsYXBzZSBsYXRlci4gQW55d2F5IHRoZSBzYW1lXFxuK1xcdFxcdCAqIGNoZWNrIHdpbGwgYmUgZG9uZSBhZ2FpbiBsYXRlciB0aGUgcmlzayBzZWVtcyBsb3cuXFxuIFxcdFxcdCAqL1xcbiBcXHRcXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pKSB7XFxuIFxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUEFHRV9DT1VOVDtcXG4gXFx0XFx0XFx0Z290byBvdXRfdW5tYXA7XFxuIFxcdFxcdH1cXG4gXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpc1xcbi1cXHRcXHQgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZVxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdCAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcXG4tXFx0XFx0ICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XFxuLVxcdFxcdCAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVxcdTAwM2V2bV9tbSwgYWRkcikpKVxcbitcXHRcXHRpZiAocHRlX2lzX3JlZmVyZW5jZWQoY2MsIHB0ZXZhbCwgZm9saW8sIHZtYSwgYWRkcikpXFxuIFxcdFxcdFxcdHJlZmVyZW5jZWQrKztcXG4gXFx0fVxcbiBcXHRpZiAoY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgXFx1MDAyNlxcdTAwMjZcXG4gXFx0XFx0ICAgKCFyZWZlcmVuY2VkIHx8XFxuLVxcdFxcdCAgICAodW5tYXBwZWQgXFx1MDAyNlxcdTAwMjYgcmVmZXJlbmNlZCBcXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xcbitcXHRcXHQgICAgKGN0eC51bm1hcHBlZCBcXHUwMDI2XFx1MDAyNiByZWZlcmVuY2VkIFxcdTAwM2MgSFBBR0VfUE1EX05SIC8gMikpKSB7XFxuIFxcdFxcdHJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7XFxuIFxcdH0gZWxzZSB7XFxuIFxcdFxcdHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcXG5AQCAtMTc4MSwxNiArMTgwMywxNiBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gb3V0X3VubWFwOlxcbiBcXHRwdGVfdW5tYXBfdW5sb2NrKHB0ZSwgcHRsKTtcXG4gXFx0aWYgKHJlc3VsdCA9PSBTQ0FOX1NVQ0NFRUQpIHtcXG4tXFx0XFx0LyogY29sbGFwc2VfaHVnZV9wYWdlIGV4cGVjdHMgdGhlIGxvY2sgdG8gYmUgZHJvcHBlZCBiZWZvcmUgY2FsbGluZyAqL1xcbitcXHRcXHQvKiBjb2xsYXBzZV9odWdlX3BhZ2UoKSBleHBlY3RzIHRoZSBsb2NrIHRvIGJlIGRyb3BwZWQgYmVmb3JlIGNhbGxpbmcgKi9cXG4gXFx0XFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XFxuIFxcdFxcdHJlc3VsdCA9IG10aHBfY29sbGFwc2UobW0sIHN0YXJ0X2FkZHIsIHJlZmVyZW5jZWQsXFxuLVxcdFxcdFxcdFxcdCAgICAgICB1bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTtcXG4rXFx0XFx0XFx0XFx0ICAgICAgIGN0eC51bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTtcXG4gXFx0XFx0LyogbW1hcF9sb2NrIHdhcyByZWxlYXNlZCBhYm92ZSwgc2V0IGxvY2tfZHJvcHBlZCAqL1xcbiBcXHRcXHQqbG9ja19kcm9wcGVkID0gdHJ1ZTtcXG4gXFx0fVxcbiBvdXQ6XFxuIFxcdHRyYWNlX21tX2todWdlcGFnZWRfc2Nhbl9wbWQobW0sIGZvbGlvLCByZWZlcmVuY2VkLFxcbi1cXHRcXHRcXHRcXHQgICAgIG5vbmVfb3JfemVybywgcmVzdWx0LCB1bm1hcHBlZCk7XFxuK1xcdFxcdFxcdFxcdCAgICAgY3R4Lm5vbmVfb3JfemVybywgcmVzdWx0LCBjdHgudW5tYXBwZWQpO1xcbiBcXHRyZXR1cm4gcmVzdWx0O1xcbiB9XFxuIFxcbkBAIC0yNjkxLDggKzI3MTMsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIFxcbiBcXHRwcmVzZW50ID0gMDtcXG4gXFx0c3dhcCA9IDA7XFxuLVxcdG1lbXNldChjYy1cXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXFx1MDAzZW5vZGVfbG9hZCkpO1xcbi1cXHRub2Rlc19jbGVhcihjYy1cXHUwMDNlYWxsb2Nfbm1hc2spO1xcbitcXHRjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7XFxuIFxcdHJjdV9yZWFkX2xvY2soKTtcXG4gXFx0eGFzX2Zvcl9lYWNoKFxcdTAwMjZ4YXMsIGZvbGlvLCBzdGFydCArIEhQQUdFX1BNRF9OUiAtIDEpIHtcXG4gXFx0XFx0aWYgKHhhc19yZXRyeShcXHUwMDI2eGFzLCBmb2xpbykpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjM5OjAwLjM4MDA0OTM4WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6Mjk3NDkxMzM4MDQ5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJVU0VSRkFVTFRGRFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIm1hZHZpc2VfY29sbGFwc2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgUFRFIGNoZWNraW5nIGxvZ2ljIGZvciBUSFAgY29sbGFwc2UgaW50byBhIG5ldyBoZWxwZXIgZnVuY3Rpb24gY29sbGFwc2VfY2hlY2tfcHRlKCkuIEl0IGFsc28gbW9kaWZpZXMgdGhlIGJlaGF2aW9yIHdoZW4gYSBub24tYW5vbnltb3VzIGZvbGlvIGlzIGVuY291bnRlcmVkIGluIGFuIGFub255bW91cyBWTUEsIGNoYW5naW5nIGEgVk1fQlVHX09OX0ZPTElPIHRvIGEgVk1fV0FSTl9PTl9GT0xJTyBhbmQgcmV0dXJuaW5nIGFuIGVycm9yLiBGdXp6aW5nIG1hZHZpc2UoTUFEVl9DT0xMQVBTRSkgYW5kIGtodWdlcGFnZWQgY2FuIGhlbHAgdmVyaWZ5IHRoYXQgdGhpcyByZWZhY3RvcmluZyBkb2Vzbid0IGludHJvZHVjZSBzdWJ0bGUgcmVncmVzc2lvbnMgaW4gUFRFIHNjYW5uaW5nIG9yIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgdXNhZ2UuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDU3OGE0ZGE2MDgzYzU1NTJjMjZmMmE3MGZlZDhhZTliOWEzNDlmNDBcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIEF1ZyA0IDE5OjM4OjU3IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XG5pbmRleCAxNmYzNzEzNWVkODBkLi5iMTg3ZDYxODQ1MmY0IDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XG4rKysgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3RcbkBAIC0yMjQsNyArMjI0LDcgQEAga2h1Z2VwYWdlZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB3aGVuIGFueSBUSFAgc2l6ZSBpcyBlbmFibGVkXG4gKGVpdGhlciBvZiB0aGUgcGVyLXNpemUgYW5vbiBjb250cm9sIG9yIHRoZSB0b3AtbGV2ZWwgY29udHJvbCBhcmUgc2V0XG4gdG8gXCJhbHdheXNcIiBvciBcIm1hZHZpc2VcIiksIGFuZCBpdCdsbCBiZSBhdXRvbWF0aWNhbGx5IHNodXRkb3duIHdoZW5cbiBhbGwgVEhQIHNpemVzIGFyZSBkaXNhYmxlZCAod2hlbiBib3RoIHRoZSBwZXItc2l6ZSBhbm9uIGNvbnRyb2wgYW5kIHRoZVxuLXRvcC1sZXZlbCBjb250cm9sIGFyZSBcIm5ldmVyXCIpXG4rdG9wLWxldmVsIGNvbnRyb2wgYXJlIFwibmV2ZXJcIikuXG4gXG4gcHJvY2VzcyBUSFAgY29udHJvbHNcbiAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuQEAgLTMwMSw3ICszMDEsOSBAQCBiZWluZyByZXBsYWNlZCBieSBhIFBNRCBtYXBwaW5nLCBvciAoMikgcGh5c2ljYWwgcGFnZXMgcmVwbGFjZWQgYnkgb25lXG4gaHVnZXBhZ2Ugb2YgdmFyaW91cyBzaXplcyAoUE1ELXNpemVkIG9yIG1USFApLiBFYWNoIG1heSBoYXBwZW4gaW5kZXBlbmRlbnRseSxcbiBvciB0b2dldGhlciwgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIG1lbW9yeSBhbmQgdGhlIGZhaWx1cmVzIHRoYXQgb2NjdXIuXG4gQXMgc3VjaCwgdGhpcyB2YWx1ZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgcm91Z2hseSBhcyBhIHNpZ24gb2YgcHJvZ3Jlc3MsXG4tYW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZyk6OlxuK2FuZCBjb3VudGVycyBpbiAvcHJvYy92bXN0YXQgY29uc3VsdGVkIGZvciBtb3JlIGFjY3VyYXRlIGFjY291bnRpbmcuXG4rUGVyLW9yZGVyIG1USFAgY29sbGFwc2Ugc3RhdGlzdGljcyBhcmUgYWxzbyBhdmFpbGFibGUgdW5kZXJcbisvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9odWdlcGFnZXMtXHUwMDNjc2l6ZVx1MDAzZWtCL3N0YXRzLyk6OlxuIFxuIFx0L3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2Uva2h1Z2VwYWdlZC9wYWdlc19jb2xsYXBzZWRcbiBcbmRpZmYgLS1naXQgYS9tbS9raHVnZXBhZ2VkLmMgYi9tbS9raHVnZXBhZ2VkLmNcbmluZGV4IGIyMzdmNmU3NjYyYTUuLjMzMzhlOWRjMTFkZDAgMTAwNjQ0XG4tLS0gYS9tbS9raHVnZXBhZ2VkLmNcbisrKyBiL21tL2todWdlcGFnZWQuY1xuQEAgLTY1LDYgKzY1LDEyIEBAIGVudW0gc2Nhbl9yZXN1bHQge1xuIFx0U0NBTl9QQUdFX0RJUlRZX09SX1dSSVRFQkFDSyxcbiB9O1xuIFxuK2VudW0gcHRlX2NoZWNrX3Jlc3VsdCB7XG4rXHRQVEVfQ0hFQ0tfU1VDQ0VFRCxcbitcdFBURV9DSEVDS19GQUlMLFxuK1x0UFRFX0NIRUNLX0NPTlRJTlVFLFxuK307XG4rXG4gI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTXG4gI2luY2x1ZGUgXHUwMDNjdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmhcdTAwM2VcbiBcbkBAIC0xMTksNiArMTI1LDIwIEBAIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sIHtcbiBcdERFQ0xBUkVfQklUTUFQKG10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcbiB9O1xuIFxuK3N0cnVjdCBwdGVfY2hlY2tfY29udGV4dCB7XG4rXHRzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2M7XG4rXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTtcbitcdHVuc2lnbmVkIGludCBvcmRlcjtcbitcdHN0cnVjdCBmb2xpbyAqZm9saW87XG4rXHRpbnQgbm9uZV9vcl96ZXJvO1xuK1x0aW50IHNoYXJlZDtcbitcdGludCB1bm1hcHBlZDtcbitcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0O1xuK1x0dW5zaWduZWQgaW50IG1heF9wdGVzX25vbmU7XG4rXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc3dhcDtcbitcdHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQ7XG4rfTtcbitcbiAvKipcbiAgKiBzdHJ1Y3Qga2h1Z2VwYWdlZF9zY2FuIC0gY3Vyc29yIGZvciBzY2FubmluZ1xuICAqIEBtbV9oZWFkOiB0aGUgaGVhZCBvZiB0aGUgbW0gbGlzdCB0byBzY2FuXG5AQCAtNjIwLDcgKzY0MCw3IEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pXG4gXHRcdC8qXG4gXHRcdCAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gc2VyaWFsaXplIGFnYWluc3RcbiBcdFx0ICogY29sbGFwc2VfdGVzdF9leGl0KCkgKHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gcnVuXG4tXHRcdCAqIHVuZGVyIG1tYXAgc2VtIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbFxuK1x0XHQgKiB1bmRlciBtbWFwX2xvY2sgcmVhZCBtb2RlKS4gU3RvcCBoZXJlIChhZnRlciB3ZSByZXR1cm4gYWxsXG4gXHRcdCAqIHBhZ2V0YWJsZXMgd2lsbCBiZSBkZXN0cm95ZWQpIHVudGlsIGtodWdlcGFnZWQgaGFzIGZpbmlzaGVkXG4gXHRcdCAqIHdvcmtpbmcgb24gdGhlIHBhZ2V0YWJsZXMgdW5kZXIgdGhlIG1tYXBfbG9jay5cbiBcdFx0ICovXG5AQCAtNjI5LDYgKzY0OSwxMyBAQCB2b2lkIF9fa2h1Z2VwYWdlZF9leGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxuIFx0fVxuIH1cbiBcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXG4re1xuK1x0bWVtc2V0KGNjLVx1MDAzZW5vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLVx1MDAzZW5vZGVfbG9hZCkpO1xuK1x0bm9kZXNfY2xlYXIoY2MtXHUwMDNlYWxsb2Nfbm1hc2spO1xuK1x0Yml0bWFwX3plcm8oY2MtXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpO1xuK31cbitcbiBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIHtcbiBcdG5vZGVfc3RhdF9tb2RfZm9saW8oZm9saW8sXG5AQCAtNjY1LDc2ICs2OTIsMTU2IEBAIHN0YXRpYyB2b2lkIHJlbGVhc2VfcHRlX3BhZ2VzKHB0ZV90ICpwdGUsIHB0ZV90ICpfcHRlLFxuIFx0fVxuIH1cbiBcbisvKlxuKyAqIHB0ZV9pc19yZWZlcmVuY2VkKCkgLSBDaGVjayBmb3IgZW5vdWdoIHJlZmVyZW5jZWQgUFRFcyB0byBqdXN0aWZ5IGNvbGxhcHNpbmdcbisgKlxuKyAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGUgcGFnZSBoYXMgYmVlblxuKyAqIHJlY2VudGx5IGFjY2Vzc2VkICh5b3VuZyBwdGUpIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZS5cbisgKlxuKyAqIFJldHVybjogdHJ1ZSBpZiB0aGUgcGFnZSBoYXMgYmVlbiByZWNlbnRseSBhY2Nlc3NlZC5cbisgKi9cbitzdGF0aWMgaW5saW5lIGJvb2wgcHRlX2lzX3JlZmVyZW5jZWQoc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLCBwdGVfdCBwdGV2YWwsXG4rXHRzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyKVxuK3tcbitcdHJldHVybiBjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNlxuK1x0ICAgICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fFxuK1x0XHRmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XG4rXHRcdG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS1cdTAwM2V2bV9tbSwgYWRkcikpO1xuK31cbitcbitzdGF0aWMgdm9pZCBjb3VudF9jb2xsYXBzZV9ldmVudCh1bnNpZ25lZCBpbnQgb3JkZXIsIGVudW0gdm1fZXZlbnRfaXRlbSB2bV9ldmVudCxcbitcdFx0ZW51bSBtdGhwX3N0YXRfaXRlbSBtdGhwX2V2ZW50KVxuK3tcbitcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuK1x0XHRjb3VudF92bV9ldmVudCh2bV9ldmVudCk7XG4rXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIG10aHBfZXZlbnQpO1xuK31cbitcbisvKlxuKyAqIHB0ZV9jaGVja19mYWlsKCkgLSBBIHNpbXBsZSBoZWxwZXIgdG8gc2V0IHRoZSBwdGVfY2hlY2tfY29udGV4dCByZXN1bHQgYW5kXG4rICogcmV0dXJuIFBURV9DSEVDS19GQUlMLlxuKyAqL1xuK3N0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrX2ZhaWwoc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgsXG4rXHRcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0KVxuK3tcbitcdGN0eC1cdTAwM2VyZXN1bHQgPSByZXN1bHQ7XG4rXHRyZXR1cm4gUFRFX0NIRUNLX0ZBSUw7XG4rfVxuK1xuKy8qXG4rICogY29sbGFwc2VfY2hlY2tfcHRlKCkgLSBDaGVjayBpZiBhIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2VcbisgKlxuKyAqIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOlxuKyAqIC0gbWF4X3B0ZV8qIHZhbHVlcyBhcmUgbm90IGV4Y2VlZGVkXG4rICogLSB1ZmZkIGlzIG5vdCBhY3RpdmVcbisgKiAtIGxhenlmcmVlIHByb3BlcnRpZXMgYXJlIG5vdCBwcmVzZW50XG4rICogLSBvbmx5IGFub255bW91cyBwYWdlcyBhcmUgcHJlc2VudFxuKyAqXG4rICogYSBoZWxwZXIgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGlzIHVzZWQgdG8gcGFzcyBhbmQgc3RvcmUgcmVsZXZhbnRcbisgKiBpbmZvcm1hdGlvbiBiZXR3ZWVuIHRoZSBjb2xsYXBzZV9jaGVja19wdGUoKSBmdW5jdGlvbiBhbmQgdGhlIGNhbGxlci5cbisgKlxuKyAqIFJldHVybjogUFRFX0NIRUNLX1NVQ0NFRUQgaWYgdGhlIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2UsXG4rICogICAgICAgICBQVEVfQ0hFQ0tfRkFJTCBpZiB0aGUgUFRFIGlzIG5vdCBzdWl0YWJsZSBmb3IgY29sbGFwc2UsXG4rICogICAgICAgICBQVEVfQ0hFQ0tfQ09OVElOVUUgaWYgdGhlIHNjYW4gc2hvdWxkIGNvbnRpbnVlIHRvIGNoZWNrIHRoZSBuZXh0IFBURS5cbisgKi9cbitzdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGVfdCBwdGV2YWwsXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgpXG4re1xuK1x0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xuK1x0XHRpZiAoKytjdHgtXHUwMDNlbm9uZV9vcl96ZXJvIFx1MDAzZSBjdHgtXHUwMDNlbWF4X3B0ZXNfbm9uZSkge1xuK1x0XHRcdGNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC1cdTAwM2VvcmRlciwgVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFLFxuK1x0XHRcdFx0XHQgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7XG4rXHRcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfTk9ORV9QVEUpO1xuK1x0XHR9XG4rXHRcdHJldHVybiBQVEVfQ0hFQ0tfQ09OVElOVUU7XG4rXHR9XG4rXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcbitcdFx0aWYgKGN0eC1cdTAwM2V1bm1hcHBlZCA9PSAtMSlcbitcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9OT05fUFJFU0VOVCk7XG4rXHRcdGlmICgrK2N0eC1cdTAwM2V1bm1hcHBlZCBcdTAwM2UgY3R4LVx1MDAzZW1heF9wdGVzX3N3YXApIHtcbitcdFx0XHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSxcbitcdFx0XHRcdFx0ICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NXQVApO1xuK1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NXQVBfUFRFKTtcbitcdFx0fVxuK1x0XHRpZiAocHRlX3N3cF91ZmZkX2FueShwdGV2YWwpKVxuK1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xuK1x0XHRyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFO1xuK1x0fVxuK1x0LypcbitcdCAqIERvbid0IGNvbGxhcHNlIGlmIGFueSBvZiB0aGUgc21hbGwgUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkXG4rXHQgKiB3cml0ZSBwcm90ZWN0aW9uLiBNYXJraW5nIHRoZSBuZXcgaHVnZSBwbWQgYXMgd3JpdGUgcHJvdGVjdGVkXG4rXHQgKiBjb3VsZCBicmluZyB1c2VyZmF1bHQgbWVzc2FnZXMgdGhhdCBmYWxsIG91dHNpZGUgb2YgdGhlXG4rXHQgKiByZWdpc3RlcmVkIHJhbmdlLlxuK1x0ICovXG4rXHRpZiAocHRlX3VmZmQocHRldmFsKSlcbitcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfVUZGRCk7XG4rXG4rXHRjdHgtXHUwMDNlZm9saW8gPSB2bV9ub3JtYWxfZm9saW8oY3R4LVx1MDAzZXZtYSwgYWRkciwgcHRldmFsKTtcbitcdGlmICh1bmxpa2VseSghY3R4LVx1MDAzZWZvbGlvKSB8fCB1bmxpa2VseShmb2xpb19pc196b25lX2RldmljZShjdHgtXHUwMDNlZm9saW8pKSlcbitcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX05VTEwpO1xuK1xuK1x0LypcbitcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcbitcdCAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC5cbitcdCAqL1xuK1x0aWYgKGN0eC1cdTAwM2VjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNiAhKGN0eC1cdTAwM2V2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkgXHUwMDI2XHUwMDI2XG4rXHQgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShjdHgtXHUwMDNlZm9saW8pIFx1MDAyNlx1MDAyNiAhcHRlX2RpcnR5KHB0ZXZhbCkpXG4rXHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9MQVpZRlJFRSk7XG4rXG4rXHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihjdHgtXHUwMDNlZm9saW8pKSB7XG4rXHRcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihjdHgtXHUwMDNlZm9saW8pLCBjdHgtXHUwMDNlZm9saW8pO1xuK1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfQU5PTik7XG4rXHR9XG4rXG4rXHRpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChjdHgtXHUwMDNlZm9saW8pKSB7XG4rXHRcdC8qXG4rXHRcdCAqIFRPRE86IFN1cHBvcnQgc2hhcmVkIHBhZ2VzIHdpdGhvdXQgbGVhZGluZyB0byBmdXJ0aGVyXG4rXHRcdCAqIG1USFAgY29sbGFwc2VzLiBDdXJyZW50bHkgYnJpbmdpbmcgaW4gbmV3IHBhZ2VzIHZpYVxuK1x0XHQgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhXG4rXHRcdCAqIHJlc2NhbiBvZiB0aGUgc2FtZSByYW5nZS5cbitcdFx0ICovXG4rXHRcdGlmICgrK2N0eC1cdTAwM2VzaGFyZWQgXHUwMDNlIGN0eC1cdTAwM2VtYXhfcHRlc19zaGFyZWQpIHtcbitcdFx0XHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFLFxuK1x0XHRcdFx0XHQgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcbitcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0cmV0dXJuIFBURV9DSEVDS19TVUNDRUVEO1xuK31cbitcbiBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHR1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsIHB0ZV90ICpwdGUsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYyxcbiBcdFx0dW5zaWduZWQgaW50IG9yZGVyLCBzdHJ1Y3QgbGlzdF9oZWFkICpjb21wb3VuZF9wYWdlbGlzdClcbiB7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgb3JkZXIpO1xuLVx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpO1xuIFx0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7XG4gXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDtcbiBcdHVuc2lnbmVkIGxvbmcgYWRkciA9IHN0YXJ0X2FkZHI7XG4tXHRwdGVfdCAqX3B0ZTtcbi1cdGludCBub25lX29yX3plcm8gPSAwLCBzaGFyZWQgPSAwLCByZWZlcmVuY2VkID0gMDtcbitcdHB0ZV90ICpfcHRlLCBwdGV2YWw7XG4rXHRpbnQgcmVmZXJlbmNlZCA9IDA7XG4gXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcbitcdGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2s7XG4rXHRzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0ge1xuK1x0XHQuY2MgPSBjYyxcbitcdFx0LnZtYSA9IHZtYSxcbitcdFx0Lm9yZGVyID0gb3JkZXIsXG4rXHRcdC51bm1hcHBlZCA9IC0xLCAvKiBkb24ndCBjaGVjayBzd2FwIFBURXMgKi9cbitcdFx0Lm1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKSxcbitcdFx0Lm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpLFxuK1x0fTtcbiBcbiBcdGZvciAoX3B0ZSA9IHB0ZTsgX3B0ZSBcdTAwM2MgcHRlICsgbnJfcGFnZXM7XG4gXHQgICAgIF9wdGUrKywgYWRkciArPSBQQUdFX1NJWkUpIHtcbi1cdFx0cHRlX3QgcHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7XG4tXHRcdGlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHtcbi1cdFx0XHRpZiAoKytub25lX29yX3plcm8gXHUwMDNlIG1heF9wdGVzX25vbmUpIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFO1xuLVx0XHRcdFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7XG4tXHRcdFx0XHRnb3RvIG91dDtcbi1cdFx0XHR9XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0aWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QVEVfTk9OX1BSRVNFTlQ7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9VRkZEO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXHRcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7XG4tXHRcdGlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfTlVMTDtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVxuLVx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXHRcdFZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSwgZm9saW8pO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsXG4tXHRcdCAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC5cbi1cdFx0ICovXG4tXHRcdGlmIChjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNiAhKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fRFJPUFBBQkxFKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pIFx1MDAyNlx1MDAyNiAhcHRlX2RpcnR5KHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7XG4rXHRcdHB0ZXZhbCA9IHB0ZXBfZ2V0KF9wdGUpO1xuK1x0XHRwdGVfY2hlY2sgPSBjb2xsYXBzZV9jaGVja19wdGUocHRldmFsLCBhZGRyLCBcdTAwMjZjdHgpO1xuK1x0XHRmb2xpbyA9IGN0eC5mb2xpbztcbitcdFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkge1xuK1x0XHRcdHJlc3VsdCA9IGN0eC5yZXN1bHQ7XG4gXHRcdFx0Z290byBvdXQ7XG4gXHRcdH1cbitcdFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfQ09OVElOVUUpXG4rXHRcdFx0Y29udGludWU7XG4gXG4tXHRcdC8qIFNlZSBjb2xsYXBzZV9zY2FuX3BtZCgpLiAqL1xuLVx0XHRpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChmb2xpbykpIHtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFRPRE86IFN1cHBvcnQgc2hhcmVkIHBhZ2VzIHdpdGhvdXQgbGVhZGluZyB0byBmdXJ0aGVyXG4tXHRcdFx0ICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhXG4tXHRcdFx0ICogc2hhcmVkIG1heSBjYXVzZSBhIGZ1dHVyZSBoaWdoZXIgb3JkZXIgY29sbGFwc2Ugb24gYVxuLVx0XHRcdCAqIHJlc2NhbiBvZiB0aGUgc2FtZSByYW5nZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAoKytzaGFyZWQgXHUwMDNlIG1heF9wdGVzX3NoYXJlZCkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfU0hBUkVEX1BURTtcbi1cdFx0XHRcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuLVx0XHRcdFx0XHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcbi1cdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdH1cbi1cdFx0fVxuIFx0XHQvKlxuIFx0XHQgKiBUT0RPOiBJbiBzb21lIGNhc2VzIG9mIHBhcnRpYWxseS1tYXBwZWQgZm9saW9zLCB3ZSdkIGFjdHVhbGx5XG4gXHRcdCAqIHdhbnQgdG8gY29sbGFwc2UuXG5AQCAtNzU5LDggKzg2Niw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXG4gXHRcdC8qXG4gXHRcdCAqIFdlIGNhbiBkbyBpdCBiZWZvcmUgZm9saW9faXNvbGF0ZV9scnUgYmVjYXVzZSB0aGVcbi1cdFx0ICogZm9saW8gY2FuJ3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogUEdfbG9ja1xuLVx0XHQgKiBpcyBuZWVkZWQgdG8gc2VyaWFsaXplIGFnYWluc3Qgc3BsaXRfaHVnZV9wYWdlXG4rXHRcdCAqIGZvbGlvIGNhbid0IGJlIGZyZWVkIGZyb20gdW5kZXIgdXMuIE5PVEU6IGZvbGlvIGxvY2tcbitcdFx0ICogaXMgbmVlZGVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHNwbGl0X2h1Z2VfcGFnZSgpXG4gXHRcdCAqIHdoZW4gaW52b2tlZCBmcm9tIHRoZSBWTS5cbiBcdFx0ICovXG4gXHRcdGlmICghZm9saW9fdHJ5bG9jayhmb2xpbykpIHtcbkBAIC03ODYsNyArODkzLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0fVxuIFxuIFx0XHQvKlxuLVx0XHQgKiBJc29sYXRlIHRoZSBwYWdlIHRvIGF2b2lkIGNvbGxhcHNpbmcgYW4gaHVnZXBhZ2VcbitcdFx0ICogSXNvbGF0ZSB0aGUgZm9saW8gdG8gYXZvaWQgY29sbGFwc2luZyBhIGh1Z2VwYWdlXG4gXHRcdCAqIGN1cnJlbnRseSBpbiB1c2UgYnkgdGhlIFZNLlxuIFx0XHQgKi9cbiBcdFx0aWYgKCFmb2xpb19pc29sYXRlX2xydShmb2xpbykpIHtcbkBAIC04MDMsMTQgKzkxMCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSlcbiBcdFx0XHRsaXN0X2FkZF90YWlsKFx1MDAyNmZvbGlvLVx1MDAzZWxydSwgY29tcG91bmRfcGFnZWxpc3QpO1xuIG5leHQ6XG4tXHRcdC8qXG4tXHRcdCAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpc1xuLVx0XHQgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZVxuLVx0XHQgKi9cbi1cdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcbi1cdFx0ICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XG4tXHRcdCAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVx1MDAzZXZtX21tLCBhZGRyKSkpXG4rXHRcdGlmIChwdGVfaXNfcmVmZXJlbmNlZChjYywgcHRldmFsLCBmb2xpbywgdm1hLCBhZGRyKSlcbiBcdFx0XHRyZWZlcmVuY2VkKys7XG4gXHR9XG4gXG5AQCAtODE4LDEzICs5MTgsMTMgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0cmVzdWx0ID0gU0NBTl9MQUNLX1JFRkVSRU5DRURfUEFHRTtcbiBcdH0gZWxzZSB7XG4gXHRcdHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcbi1cdFx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIG5vbmVfb3JfemVybyxcbitcdFx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIGN0eC5ub25lX29yX3plcm8sXG4gXHRcdFx0XHRcdFx0ICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpO1xuIFx0XHRyZXR1cm4gcmVzdWx0O1xuIFx0fVxuIG91dDpcbiBcdHJlbGVhc2VfcHRlX3BhZ2VzKHB0ZSwgX3B0ZSwgY29tcG91bmRfcGFnZWxpc3QpO1xuLVx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIG5vbmVfb3JfemVybyxcbitcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxuIFx0XHRcdFx0XHQgICAgcmVmZXJlbmNlZCwgcmVzdWx0LCBvcmRlcik7XG4gXHRyZXR1cm4gcmVzdWx0O1xuIH1cbkBAIC05MDQsNyArMTAwNCw3IEBAIHN0YXRpYyB2b2lkIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfZmFpbGVkKHB0ZV90ICpwdGUsXG4gXHQgKiBSZS1lc3RhYmxpc2ggdGhlIFBNRCB0byBwb2ludCB0byB0aGUgb3JpZ2luYWwgcGFnZSB0YWJsZVxuIFx0ICogZW50cnkuIFJlc3RvcmluZyBQTUQgbmVlZHMgdG8gYmUgZG9uZSBwcmlvciB0byByZWxlYXNpbmdcbiBcdCAqIHBhZ2VzLiBTaW5jZSBwYWdlcyBhcmUgc3RpbGwgaXNvbGF0ZWQgYW5kIGxvY2tlZCBoZXJlLFxuLVx0ICogYWNxdWlyaW5nIGFub25fdm1hX2xvY2tfd3JpdGUgaXMgdW5uZWNlc3NhcnkuXG4rXHQgKiBhY3F1aXJpbmcgYW5vbl92bWFfbG9ja193cml0ZSgpIGlzIHVubmVjZXNzYXJ5LlxuIFx0ICovXG4gXHRwbWRfcHRsID0gcG1kX2xvY2sodm1hLVx1MDAzZXZtX21tLCBwbWQpO1xuIFx0cG1kX3BvcHVsYXRlKHZtYS1cdTAwM2V2bV9tbSwgcG1kLCBwbWRfcGd0YWJsZShvcmlnX3BtZCkpO1xuQEAgLTEwNzgsOSArMTE3OCw5IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsXG4gXHRcdHJldHVybiBTQ0FOX1ZNQV9DSEVDSztcbiBcdC8qXG4gXHQgKiBBbm9uIFZNQSBleHBlY3RlZCwgdGhlIGFkZHJlc3MgbWF5IGJlIHVubWFwcGVkIHRoZW5cbi1cdCAqIHJlbWFwcGVkIHRvIGZpbGUgYWZ0ZXIga2h1Z2VwYWdlZCByZWFxdWlyZWQgdGhlIG1tYXBfbG9jay5cbitcdCAqIHJlbWFwcGVkIHRvIGZpbGUgYWZ0ZXIga2h1Z2VwYWdlZCByZWFjcXVpcmVkIHRoZSBtbWFwX2xvY2suXG4gXHQgKlxuLVx0ICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzIG1heSByZXR1cm4gdHJ1ZSBmb3IgcXVhbGlmaWVkIGZpbGVcbitcdCAqIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpIG1heSByZXR1cm4gdHJ1ZSBmb3IgcXVhbGlmaWVkIGZpbGVcbiBcdCAqIHZtYXMuXG4gXHQgKi9cbiBcdGlmIChleHBlY3RfYW5vbiBcdTAwMjZcdTAwMjYgKCEoKnZtYXApLVx1MDAzZWFub25fdm1hIHx8ICF2bWFfaXNfYW5vbnltb3VzKCp2bWFwKSkpXG5AQCAtMTEzNiw3ICsxMjM2LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY2hlY2tfcG1kX3N0aWxsX3ZhbGlkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIC8qXG4gICogQnJpbmcgbWlzc2luZyBwYWdlcyBpbiBmcm9tIHN3YXAsIHRvIGNvbXBsZXRlIFRIUCBjb2xsYXBzZS5cbi0gKiBPbmx5IGRvbmUgaWYga2h1Z2VwYWdlZF9zY2FuX3BtZCBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLlxuKyAqIE9ubHkgZG9uZSBpZiBjb2xsYXBzZV9zY2FuX3BtZCgpIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXG4gICpcbiAgKiBGb3IgbVRIUCBvcmRlcnMgdGhlIGZ1bmN0aW9uIGJhaWxzIG9uIHRoZSBmaXJzdCBzd2FwIGVudHJ5LCBiZWNhdXNlXG4gICogZmF1bHRpbmcgcGFnZXMgYmFjayBpbiBkdXJpbmcgY29sbGFwc2UgY291bGQgcmUtcG9wdWxhdGUgUFRFcyB0aGF0XG5AQCAtMTIwNCw3ICsxMzA0LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHRwdGUgPSBOVUxMO1xuIFxuIFx0XHQvKlxuLVx0XHQgKiBkb19zd2FwX3BhZ2UgcmV0dXJucyBWTV9GQVVMVF9SRVRSWSB3aXRoIHJlbGVhc2VkIG1tYXBfbG9jay5cbitcdFx0ICogZG9fc3dhcF9wYWdlKCkgcmV0dXJucyBWTV9GQVVMVF9SRVRSWSB3aXRoIHJlbGVhc2VkIG1tYXBfbG9jay5cbiBcdFx0ICogTm90ZSB3ZSB0cmVhdCBWTV9GQVVMVF9SRVRSWSBhcyBWTV9GQVVMVF9FUlJPUiBoZXJlIGJlY2F1c2VcbiBcdFx0ICogd2UgZG8gbm90IHJldHJ5IGhlcmUgYW5kIHN3YXAgZW50cnkgd2lsbCByZW1haW4gaW4gcGFnZXRhYmxlXG4gXHRcdCAqIHJlc3VsdGluZyBpbiBsYXRlciBmYWlsdXJlLlxuQEAgLTEyNDcsMTUgKzEzNDcsMTIgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnVcbiBcdGZvbGlvID0gX19mb2xpb19hbGxvYyhnZnAsIG9yZGVyLCBub2RlLCBcdTAwMjZjYy1cdTAwM2VhbGxvY19ubWFzayk7XG4gXHRpZiAoIWZvbGlvKSB7XG4gXHRcdCpmb2xpb3AgPSBOVUxMO1xuLVx0XHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcbi1cdFx0XHRjb3VudF92bV9ldmVudChUSFBfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTtcbi1cdFx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTtcbitcdFx0Y291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQ19GQUlMRUQsXG4rXHRcdFx0XHQgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xuIFx0XHRyZXR1cm4gU0NBTl9BTExPQ19IVUdFX1BBR0VfRkFJTDtcbiBcdH1cbiBcbi1cdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuLVx0XHRjb3VudF92bV9ldmVudChUSFBfQ09MTEFQU0VfQUxMT0MpO1xuLVx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0MpO1xuK1x0Y291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQywgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTtcbiBcbiBcdGlmICh1bmxpa2VseShtZW1fY2dyb3VwX2NoYXJnZShmb2xpbywgbW0sIGdmcCkpKSB7XG4gXHRcdGZvbGlvX3B1dChmb2xpbyk7XG5AQCAtMTI3MSw3ICsxMzY4LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnVcbiB9XG4gXG4gLypcbi0gKiBjb2xsYXBzZV9odWdlX3BhZ2UgZXhwZWN0cyB0aGUgbW1hcF9sb2NrIHRvIGJlIHVubG9ja2VkIGJlZm9yZSBlbnRlcmluZyBhbmRcbisgKiBjb2xsYXBzZV9odWdlX3BhZ2UoKSBleHBlY3RzIHRoZSBtbWFwX2xvY2sgdG8gYmUgdW5sb2NrZWQgYmVmb3JlIGVudGVyaW5nIGFuZFxuICAqIHdpbGwgYWx3YXlzIHJldHVybiB3aXRoIHRoZSBsb2NrIHVubG9ja2VkLCB0byBhdm9pZCBob2xkaW5nIHRoZSBtbWFwX2xvY2tcbiAgKiB3aGlsZSBhbGxvY2F0aW5nIGEgVEhQLCBhcyB0aGF0IGNvdWxkIHRyaWdnZXIgZGlyZWN0IHJlY2xhaW0vY29tcGFjdGlvbi5cbiAgKiBOb3RlIHRoYXQgdGhlIFZNQSBtdXN0IGJlIHJlY2hlY2tlZCBhZnRlciBncmFiYmluZyB0aGUgbW1hcF9sb2NrIGFnYWluLlxuQEAgLTEzMTgsNyArMTQxNSw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXG4gXHRpZiAodW5tYXBwZWQpIHtcbiBcdFx0Lypcbi1cdFx0ICogX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluIHdpbGwgcmV0dXJuIHdpdGggbW1hcF9sb2NrXG4rXHRcdCAqIF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbigpIHdpbGwgcmV0dXJuIHdpdGggbW1hcF9sb2NrXG4gXHRcdCAqIHJlbGVhc2VkIHdoZW4gaXQgZmFpbHMuIFNvIHdlIGp1bXAgb3V0X25vbG9jayBkaXJlY3RseSBpblxuIFx0XHQgKiB0aGF0IGNhc2UuICBDb250aW51aW5nIHRvIGNvbGxhcHNlIGNhdXNlcyBpbmNvbnNpc3RlbmN5LlxuIFx0XHQgKi9cbkBAIC0xMzMxLDggKzE0MjgsOCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XG4gXHQvKlxuIFx0ICogUHJldmVudCBhbGwgYWNjZXNzIHRvIHBhZ2V0YWJsZXMgd2l0aCB0aGUgZXhjZXB0aW9uIG9mXG4tXHQgKiBndXBfZmFzdCBsYXRlciBoYW5kbGVkIGJ5IHRoZSBwdGVwX2NsZWFyX2ZsdXNoIGFuZCB0aGUgVk1cbi1cdCAqIGhhbmRsZWQgYnkgdGhlIGFub25fdm1hIGxvY2sgKyBQR19sb2NrLlxuK1x0ICogZ3VwX2Zhc3QgbGF0ZXIgaGFuZGxlZCBieSB0aGUgcG1kcF9jb2xsYXBzZV9mbHVzaCgpIGFuZCB0aGUgVk1cbitcdCAqIGhhbmRsZWQgYnkgdGhlIGFub25fdm1hIGxvY2sgKyBmb2xpbyBsb2NrLlxuIFx0ICpcbiBcdCAqIFVGRkRJT19NT1ZFIGlzIHByZXZlbnRlZCB0byByYWNlIGFzIHdlbGwgdGhhbmtzIHRvIHRoZVxuIFx0ICogbW1hcF9sb2NrLlxuQEAgLTEzODksOSArMTQ4Niw5IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXHRcdHNwaW5fbG9jayhwbWRfcHRsKTtcbiBcdFx0Vk1fV0FSTl9PTl9PTkNFKCFwbWRfbm9uZSgqcG1kKSk7XG4gXHRcdC8qXG4tXHRcdCAqIFdlIGNhbiBvbmx5IHVzZSBzZXRfcG1kX2F0IHdoZW4gZXN0YWJsaXNoaW5nXG4rXHRcdCAqIFdlIGNhbiBvbmx5IHVzZSBzZXRfcG1kX2F0KCkgd2hlbiBlc3RhYmxpc2hpbmdcbiBcdFx0ICogaHVnZXBtZHMgYW5kIG5ldmVyIGZvciBlc3RhYmxpc2hpbmcgcmVndWxhciBwbWRzIHRoYXRcbi1cdFx0ICogcG9pbnRzIHRvIHJlZ3VsYXIgcGFnZXRhYmxlcy4gVXNlIHBtZF9wb3B1bGF0ZSBmb3IgdGhhdFxuK1x0XHQgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlKCkgZm9yIHRoYXRcbiBcdFx0ICovXG4gXHRcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwbWRfcGd0YWJsZShfcG1kKSk7XG4gXHRcdHNwaW5fdW5sb2NrKHBtZF9wdGwpO1xuQEAgLTE0MzksNyArMTUzNiw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXHRcdFx0c3Bpbl9sb2NrX25lc3RlZChwdGVfcHRsLCBTSU5HTEVfREVQVEhfTkVTVElORyk7XG4gXHRcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwbWRfcGd0YWJsZShfcG1kKSk7XG4gXHRcdG1hcF9hbm9uX2ZvbGlvX3B0ZV9ub3BmKGZvbGlvLCBwdGUsIHZtYSwgc3RhcnRfYWRkcixcbi1cdFx0XHRcdFx0ICAvKnVmZmRfd3A9Ki8gZmFsc2UpO1xuK1x0XHRcdFx0XHQgIC8qdWZmZD0qLyBmYWxzZSk7XG4gXHRcdGlmIChwdGVfcHRsICE9IHBtZF9wdGwpXG4gXHRcdFx0c3Bpbl91bmxvY2socHRlX3B0bCk7XG4gXHR9XG5AQCAtMTQ0OSwxMCArMTU0NiwxMCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFxuIFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xuIG91dF91cF93cml0ZTpcbi1cdGlmIChhbm9uX3ZtYV9sb2NrZWQpXG4tXHRcdGFub25fdm1hX3VubG9ja193cml0ZSh2bWEtXHUwMDNlYW5vbl92bWEpO1xuIFx0aWYgKHB0ZSlcbiBcdFx0cHRlX3VubWFwKHB0ZSk7XG4rXHRpZiAoYW5vbl92bWFfbG9ja2VkKVxuK1x0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUodm1hLVx1MDAzZWFub25fdm1hKTtcbiBcdG1tYXBfd3JpdGVfdW5sb2NrKG1tKTtcbiBvdXRfbm9sb2NrOlxuIFx0aWYgKGZvbGlvKVxuQEAgLTE1OTMsNDIgKzE2OTAsNDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsXG4gXHRcdGJvb2wgKmxvY2tfZHJvcHBlZCwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKVxuIHtcbi1cdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIEhQQUdFX1BNRF9PUkRFUik7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc3dhcCA9IGNvbGxhcHNlX21heF9wdGVzX3N3YXAoY2MsIEhQQUdFX1BNRF9PUkRFUik7XG4tXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKTtcbiBcdGVudW0gdHZhX3R5cGUgdHZhX2ZsYWdzID0gY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCA/IFRWQV9LSFVHRVBBR0VEIDogVFZBX0ZPUkNFRF9DT0xMQVBTRTtcbiBcdHBtZF90ICpwbWQ7XG4gXHRwdGVfdCAqcHRlLCAqX3B0ZSwgcHRldmFsO1xuIFx0aW50IGk7XG4tXHRpbnQgbm9uZV9vcl96ZXJvID0gMCwgc2hhcmVkID0gMCwgcmVmZXJlbmNlZCA9IDA7XG4tXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcbi1cdHN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDtcbiBcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMO1xuK1x0aW50IHJlZmVyZW5jZWQgPSAwO1xuK1x0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7XG4gXHR1bnNpZ25lZCBsb25nIGFkZHI7XG4gXHR1bnNpZ25lZCBsb25nIGVuYWJsZWRfb3JkZXJzO1xuIFx0c3BpbmxvY2tfdCAqcHRsO1xuLVx0aW50IG5vZGUgPSBOVU1BX05PX05PREUsIHVubWFwcGVkID0gMDtcbitcdGludCBub2RlID0gTlVNQV9OT19OT0RFO1xuK1x0ZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVjaztcbiBcbiBcdFZNX0JVR19PTihzdGFydF9hZGRyIFx1MDAyNiB+SFBBR0VfUE1EX01BU0spO1xuIFxuK1x0c3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGN0eCA9IHtcbitcdFx0LmNjID0gY2MsXG4rXHRcdC52bWEgPSB2bWEsXG4rXHRcdC5vcmRlciA9IEhQQUdFX1BNRF9PUkRFUixcbitcdFx0Lm1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIEhQQUdFX1BNRF9PUkRFUiksXG4rXHRcdC5tYXhfcHRlc19zd2FwID0gY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChjYywgSFBBR0VfUE1EX09SREVSKSxcbitcdFx0Lm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgSFBBR0VfUE1EX09SREVSKSxcbitcdH07XG4rXG4gXHRyZXN1bHQgPSBmaW5kX3BtZF9vcl90aHBfb3Jfbm9uZShtbSwgc3RhcnRfYWRkciwgXHUwMDI2cG1kKTtcbiBcdGlmIChyZXN1bHQgIT0gU0NBTl9TVUNDRUVEKSB7XG4gXHRcdGNjLVx1MDAzZXByb2dyZXNzKys7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuLVx0Yml0bWFwX3plcm8oY2MtXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpO1xuLVx0bWVtc2V0KGNjLVx1MDAzZW5vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLVx1MDAzZW5vZGVfbG9hZCkpO1xuLVx0bm9kZXNfY2xlYXIoY2MtXHUwMDNlYWxsb2Nfbm1hc2spO1xuK1x0Y29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oY2MpO1xuIFxuIFx0ZW5hYmxlZF9vcmRlcnMgPSBjb2xsYXBzZV9wb3NzaWJsZV9vcmRlcnModm1hLCB2bWEtXHUwMDNldm1fZmxhZ3MsIHR2YV9mbGFncyk7XG4gXG4gXHQvKlxuIFx0ICogSWYgUE1EIGlzIHRoZSBvbmx5IGVuYWJsZWQgb3JkZXIsIGVuZm9yY2UgbWF4X3B0ZXNfbm9uZSwgb3RoZXJ3aXNlXG4tXHQgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLlxuK1x0ICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS4gVGhlIGJpdG1hcFxuK1x0ICogaXMgdGhlbiBjaGVja2VkIGFnYWluIGluIG10aHBfY29sbGFwc2UoKSBmb3IgZWFjaCBhdHRlbXB0ZWQgb3JkZXIuXG4gXHQgKi9cbiBcdGlmIChlbmFibGVkX29yZGVycyAhPSBCSVQoSFBBR0VfUE1EX09SREVSKSlcbi1cdFx0bWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7XG4rXHRcdGN0eC5tYXhfcHRlc19ub25lID0gS0hVR0VQQUdFRF9NQVhfUFRFU19MSU1JVDtcbiBcbiBcdHB0ZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgc3RhcnRfYWRkciwgXHUwMDI2cHRsKTtcbiBcdGlmICghcHRlKSB7XG5AQCAtMTY0NCw4NCArMTc0NiwxNCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcbiBcdFx0Y2MtXHUwMDNlcHJvZ3Jlc3MrKztcbiBcbi1cdFx0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xuLVx0XHRcdGlmICgrK25vbmVfb3JfemVybyBcdTAwM2UgbWF4X3B0ZXNfbm9uZSkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfTk9ORV9QVEU7XG4tXHRcdFx0XHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUpO1xuLVx0XHRcdFx0Y291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUixcbi1cdFx0XHRcdFx0XHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdGlmICghcHRlX3ByZXNlbnQocHRldmFsKSkge1xuLVx0XHRcdGlmICgrK3VubWFwcGVkIFx1MDAzZSBtYXhfcHRlc19zd2FwKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TV0FQX1BURTtcbi1cdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxuLVx0XHRcdFx0XHRcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU1dBUCk7XG4tXHRcdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0XHR9XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBBbHdheXMgYmUgc3RyaWN0IHdpdGggdWZmZC13cFxuLVx0XHRcdCAqIGVuYWJsZWQgc3dhcCBlbnRyaWVzLiAgUGxlYXNlIHNlZVxuLVx0XHRcdCAqIGNvbW1lbnQgYmVsb3cgZm9yIHB0ZV91ZmZkKCkuXG4tXHRcdFx0ICovXG4tXHRcdFx0aWYgKHB0ZV9zd3BfdWZmZF9hbnkocHRldmFsKSkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9QVEVfVUZGRDtcbi1cdFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHRcdH1cbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRpZiAocHRlX3VmZmQocHRldmFsKSkge1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogRG9uJ3QgY29sbGFwc2UgdGhlIHBhZ2UgaWYgYW55IG9mIHRoZSBzbWFsbFxuLVx0XHRcdCAqIFBURXMgYXJlIGFybWVkIHdpdGggdWZmZCB3cml0ZSBwcm90ZWN0aW9uLlxuLVx0XHRcdCAqIEhlcmUgd2UgY2FuIGFsc28gbWFyayB0aGUgbmV3IGh1Z2UgcG1kIGFzXG4tXHRcdFx0ICogd3JpdGUgcHJvdGVjdGVkIGlmIGFueSBvZiB0aGUgc21hbGwgb25lcyBpc1xuLVx0XHRcdCAqIG1hcmtlZCBidXQgdGhhdCBjb3VsZCBicmluZyB1bmtub3duXG4tXHRcdFx0ICogdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbHMgb3V0c2lkZSBvZlxuLVx0XHRcdCAqIHRoZSByZWdpc3RlcmVkIHJhbmdlLiAgU28sIGp1c3QgYmUgc2ltcGxlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XG4tXHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdH1cbi1cbi1cdFx0cGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRldmFsKTtcbi1cdFx0aWYgKHVubGlrZWx5KCFwYWdlKSB8fCB1bmxpa2VseShpc196b25lX2RldmljZV9wYWdlKHBhZ2UpKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMO1xuLVx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHR9XG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICogSWYgdGhlIHZtYSBoYXMgdGhlIFZNX0RST1BQQUJMRSBmbGFnLCB0aGUgY29sbGFwc2Ugd2lsbFxuLVx0XHQgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuXG4tXHRcdCAqL1xuLVx0XHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjYgISh2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpb190ZXN0X2xhenlmcmVlKGZvbGlvKSBcdTAwMjZcdTAwMjYgIXB0ZV9kaXJ0eShwdGV2YWwpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX0xBWllGUkVFO1xuK1x0XHRwdGVfY2hlY2sgPSBjb2xsYXBzZV9jaGVja19wdGUocHRldmFsLCBhZGRyLCBcdTAwMjZjdHgpO1xuK1x0XHRmb2xpbyA9IGN0eC5mb2xpbztcbitcdFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkge1xuK1x0XHRcdHJlc3VsdCA9IGN0eC5yZXN1bHQ7XG4gXHRcdFx0Z290byBvdXRfdW5tYXA7XG4gXHRcdH1cbi1cbi1cdFx0aWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX0FOT047XG4tXHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdH1cbi1cbi1cdFx0Lypcbi1cdFx0ICogV2UgdHJlYXQgYSBzaW5nbGUgcGFnZSBhcyBzaGFyZWQgaWYgYW55IHBhcnQgb2YgdGhlIFRIUFxuLVx0XHQgKiBpcyBzaGFyZWQuXG4tXHRcdCAqL1xuLVx0XHRpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChmb2xpbykpIHtcbi1cdFx0XHRpZiAoKytzaGFyZWQgXHUwMDNlIG1heF9wdGVzX3NoYXJlZCkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfU0hBUkVEX1BURTtcbi1cdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsXG4tXHRcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHR9XG4rXHRcdGlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0NPTlRJTlVFKVxuK1x0XHRcdGNvbnRpbnVlO1xuIFxuIFx0XHQvKiBTZXQgYml0IGZvciBvY2N1cGllZCBwYWdlcyAqL1xuIFx0XHRfX3NldF9iaXQoaSwgY2MtXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMpO1xuQEAgLTE3NDksMzEgKzE3ODEsMjEgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdC8qXG4gXHRcdCAqIENoZWNrIGlmIHRoZSBwYWdlIGhhcyBhbnkgR1VQIChvciBvdGhlciBleHRlcm5hbCkgcGlucy5cbiBcdFx0ICpcbi1cdFx0ICogSGVyZSB0aGUgY2hlY2sgbWF5IGJlIHJhY3k6XG4tXHRcdCAqIGl0IG1heSBzZWUgZm9saW9fbWFwY291bnQoKSBcdTAwM2UgZm9saW9fcmVmX2NvdW50KCkuXG4tXHRcdCAqIEJ1dCBzdWNoIGNhc2UgaXMgZXBoZW1lcmFsIHdlIGNvdWxkIGFsd2F5cyByZXRyeSBjb2xsYXBzZVxuLVx0XHQgKiBsYXRlci4gIEhvd2V2ZXIgaXQgbWF5IHJlcG9ydCBmYWxzZSBwb3NpdGl2ZSBpZiB0aGUgcGFnZVxuLVx0XHQgKiBoYXMgZXhjZXNzaXZlIEdVUCBwaW5zIChpLmUuIDUxMikuICBBbnl3YXkgdGhlIHNhbWUgY2hlY2tcbi1cdFx0ICogd2lsbCBiZSBkb25lIGFnYWluIGxhdGVyIHRoZSByaXNrIHNlZW1zIGxvdy5cbitcdFx0ICogSGVyZSB0aGUgY2hlY2sgaXMgcmFjeSwgYnV0IHN1Y2ggY2FzZSBpcyBlcGhlbWVyYWwgYW5kXG4rXHRcdCAqIHdlIGNvdWxkIGFsd2F5cyByZXRyeSBjb2xsYXBzZSBsYXRlci4gQW55d2F5IHRoZSBzYW1lXG4rXHRcdCAqIGNoZWNrIHdpbGwgYmUgZG9uZSBhZ2FpbiBsYXRlciB0aGUgcmlzayBzZWVtcyBsb3cuXG4gXHRcdCAqL1xuIFx0XHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pKSB7XG4gXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX0NPVU5UO1xuIFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuIFx0XHR9XG4gXG4tXHRcdC8qXG4tXHRcdCAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpc1xuLVx0XHQgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZVxuLVx0XHQgKi9cbi1cdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcbi1cdFx0ICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XG4tXHRcdCAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVx1MDAzZXZtX21tLCBhZGRyKSkpXG4rXHRcdGlmIChwdGVfaXNfcmVmZXJlbmNlZChjYywgcHRldmFsLCBmb2xpbywgdm1hLCBhZGRyKSlcbiBcdFx0XHRyZWZlcmVuY2VkKys7XG4gXHR9XG4gXHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjZcbiBcdFx0ICAgKCFyZWZlcmVuY2VkIHx8XG4tXHRcdCAgICAodW5tYXBwZWQgXHUwMDI2XHUwMDI2IHJlZmVyZW5jZWQgXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xuK1x0XHQgICAgKGN0eC51bm1hcHBlZCBcdTAwMjZcdTAwMjYgcmVmZXJlbmNlZCBcdTAwM2MgSFBBR0VfUE1EX05SIC8gMikpKSB7XG4gXHRcdHJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7XG4gXHR9IGVsc2Uge1xuIFx0XHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XG5AQCAtMTc4MSwxNiArMTgwMywxNiBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBvdXRfdW5tYXA6XG4gXHRwdGVfdW5tYXBfdW5sb2NrKHB0ZSwgcHRsKTtcbiBcdGlmIChyZXN1bHQgPT0gU0NBTl9TVUNDRUVEKSB7XG4tXHRcdC8qIGNvbGxhcHNlX2h1Z2VfcGFnZSBleHBlY3RzIHRoZSBsb2NrIHRvIGJlIGRyb3BwZWQgYmVmb3JlIGNhbGxpbmcgKi9cbitcdFx0LyogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovXG4gXHRcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xuIFx0XHRyZXN1bHQgPSBtdGhwX2NvbGxhcHNlKG1tLCBzdGFydF9hZGRyLCByZWZlcmVuY2VkLFxuLVx0XHRcdFx0ICAgICAgIHVubWFwcGVkLCBjYywgZW5hYmxlZF9vcmRlcnMpO1xuK1x0XHRcdFx0ICAgICAgIGN0eC51bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTtcbiBcdFx0LyogbW1hcF9sb2NrIHdhcyByZWxlYXNlZCBhYm92ZSwgc2V0IGxvY2tfZHJvcHBlZCAqL1xuIFx0XHQqbG9ja19kcm9wcGVkID0gdHJ1ZTtcbiBcdH1cbiBvdXQ6XG4gXHR0cmFjZV9tbV9raHVnZXBhZ2VkX3NjYW5fcG1kKG1tLCBmb2xpbywgcmVmZXJlbmNlZCxcbi1cdFx0XHRcdCAgICAgbm9uZV9vcl96ZXJvLCByZXN1bHQsIHVubWFwcGVkKTtcbitcdFx0XHRcdCAgICAgY3R4Lm5vbmVfb3JfemVybywgcmVzdWx0LCBjdHgudW5tYXBwZWQpO1xuIFx0cmV0dXJuIHJlc3VsdDtcbiB9XG4gXG5AQCAtMjY5MSw4ICsyNzEzLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIFx0cHJlc2VudCA9IDA7XG4gXHRzd2FwID0gMDtcbi1cdG1lbXNldChjYy1cdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cdTAwM2Vub2RlX2xvYWQpKTtcbi1cdG5vZGVzX2NsZWFyKGNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbitcdGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTtcbiBcdHJjdV9yZWFkX2xvY2soKTtcbiBcdHhhc19mb3JfZWFjaChcdTAwMjZ4YXMsIGZvbGlvLCBzdGFydCArIEhQQUdFX1BNRF9OUiAtIDEpIHtcbiBcdFx0aWYgKHhhc19yZXRyeShcdTAwMjZ4YXMsIGZvbGlvKSlcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjM5OjAwLjM4MDA1MDhaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoyNzM0NTU3NjIzNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEtodWdlcGFnZWQgQ29sbGFwc2UgTG9naWMgUmVmYWN0b3IqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIHRoYXQgc2VlbXMgdG8gYmUgYSByZWZhY3RvcmluZyBvZiB0aGUga2h1Z2VwYWdlZCBjb2xsYXBzZSBsb2dpYywgc3BlY2lmaWNhbGx5IHRoZSBQVEUgc2Nhbm5pbmcgcGFydCwgbW9kaWZ5aW5nIGBtbS9raHVnZXBhZ2VkLmNgIGFuZCBgRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0YC4gVGhlIG1haW4gY2hhbmdlcyBhcHBlYXIgdG8gYmUgdGhlIGludHJvZHVjdGlvbiBvZiBhIG5ldyBgcHRlX2NoZWNrX2NvbnRleHRgIHN0cnVjdCBhbmQgYSBuZXcgZnVuY3Rpb24gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCB0byBjZW50cmFsaXplIFBURSBjaGVja2luZy4gU2V2ZXJhbCBvdGhlciByZWxhdGVkIGZ1bmN0aW9ucyBsaWtlIGBwdGVfaXNfcmVmZXJlbmNlZCgpYCwgYGNvdW50X2NvbGxhcHNlX2V2ZW50KClgLCBhbmQgYGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKClgIGFyZSBhZGRlZCBvciBtb2RpZmllZCBhcyB3ZWxsLiBNeSBpbml0aWFsIGltcHJlc3Npb24gaXMgdGhhdCB0aGlzIGlzIGEgY2xlYW4tdXAsIGJ1dCBJIG5lZWQgdG8gYmUgc3VyZS5cblxuTG9va2luZyBjbG9zZWx5IGF0IHRoZSBkaWZmIGluIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCwgSSBzZWUgdGhhdCBhIHNlcmllcyBvZiBjaGVja3MgaGF2ZSBiZWVuIG1vdmVkIGludG8gdGhlIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgZnVuY3Rpb24uIE15IGZpcnN0IHRob3VnaHQgaXMgXCJvaywgdGhpcyBzZWVtcyBsaWtlIGp1c3QgYSBsb2dpY2FsIGdyb3VwaW5nIGFuZCBzaW1wbGlmaWNhdGlvbi5cIiBUaGUgb3JpZ2luYWwgY29kZSBkaWQgaW5saW5lIGNoZWNrcyB3aXRoIGBwdGVfbm9uZV9vcl96ZXJvKClgLCBgcHRlX3ByZXNlbnQoKWAsIGFuZCBzb21lIGZvbGlvIHRlc3RzLiBOb3csIHRoZXNlIGFyZSBhbGwgZG9uZSB3aXRoaW4gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYC5cblxuSG93ZXZlciwgYXMgSSBkaXZlIGRlZXBlciwgSSBub3RpY2Ugc3VidGxlIGRldGFpbHMuIEluIGBjb2xsYXBzZV9jaGVja19wdGUoKWAsIHRoZSBjb250ZXh0IHN0cnVjdCBpcyBpbml0aWFsaXplZC4gQ29tcGFyaW5nIHRoaXMgdG8gdGhlIG9sZGVyIHZlcnNpb24sIEkgd2FudCB0byB2ZXJpZnkgaWYgdGhlcmUgaXMgYW55IGZ1bmN0aW9uYWwgY2hhbmdlLiBMb29raW5nIGNsb3NlciwgdGhlcmUgaXMgYSBgY3R4LVx1MDAzZXVubWFwcGVkYCB3aGljaCBpcyBpbml0aWFsaXplZCB0byBgLTFgIGluIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgLiBUaGlzIGlzIGltcG9ydGFudCwgYXMgaXQgaGFuZGxlcyBhIGRpZmZlcmVudCBjYXNlIHRoYW4gaW4gYGNvbGxhcHNlX3NjYW5fcG1kKClgLiBJbiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAsIHRoZSBpbml0aWFsaXphdGlvbiBpcyBpbXBsaWNpdCwgYnV0IEkgbmVlZCB0byB2ZXJpZnkgdGhhdCBhbGwgdGhlIG9sZCBhbmQgbmV3IGNvbnRleHRzIGFyZSBjb21wYXJhYmxlLiBUaGUgb2xkIGNvZGUgaGFkIGBpbnQgdW5tYXBwZWQgPSAwO2AgYW5kIHNvIG9uLCBzbyBub3cgSSBuZWVkIHRvIGNoZWNrIHRoZSBkZWZhdWx0IHZhbHVlcy4gU28gdGhlIGRlZmF1bHQgdmFsdWVzIGFyZSBhbHNvIDAuIGBub25lX29yX3plcm9gIGFuZCBgc2hhcmVkYCBhcmUgYWxzbyAwLiBTbyBubyBmdW5jdGlvbmFsIGNoYW5nZSBoZXJlLlxuXG5UaGVuLCB0aGVyZSBpcyB0aGUgZnVuY3Rpb25hbCBlcXVpdmFsZW5jZSBvZiBgdm1fbm9ybWFsX2ZvbGlvKClgIHZzIHRoZSBvbGQgYHZtX25vcm1hbF9wYWdlKClgICsgYHBhZ2VfZm9saW8oKWAgY29tYmluYXRpb24uIEFsdGhvdWdoIHRoZXkgYXJlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IGZvciBtb3N0IGNhc2VzLCBgdm1fbm9ybWFsX2ZvbGlvKClgIG1pZ2h0IGJlIHNsaWdodGx5IGRpZmZlcmVudC4gU28gdGhpcyBwYXJ0IGlzIGFsc28gcmVmYWN0b3JpbmcuIFRoZSBzYW1lIGdvZXMgZm9yIHRoZSBhZGRpdGlvbiBvZiBgY291bnRfY29sbGFwc2VfZXZlbnQoKWAsIGl0IGlzIGEgc2ltcGxlIHJlZmFjdG9yaW5nLlxuXG5XYWl0LCBsb29raW5nIGF0IGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgLCBJIG9ic2VydmUgYSBjcml0aWNhbCBjaGFuZ2U6IGBWTV9CVUdfT05fRk9MSU9gIGlzIGJlaW5nIHJlcGxhY2VkIGJ5IGBWTV9XQVJOX09OX0ZPTElPYC4gVGhpcyBjaGFuZ2UgaXMgYWxzbyBhZGRlZCBpbiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAhIFRoaXMgaXMgcG90ZW50aWFsbHkgc2lnbmlmaWNhbnQhIEluIHRoZSBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBjYWxsIHNpdGUsIHRoZSBvbGQgY29kZSBoYWQgYSBgVk1fQlVHX09OX0ZPTElPYCBjaGVjaywgYnV0IGl0IGlzIHJlcGxhY2VkIHdpdGggYFZNX1dBUk5fT05fRk9MSU9gIG5vdy4gSW4gdGhlIG90aGVyIGNhbGwgc2l0ZSwgYGNvbGxhcHNlX3NjYW5fcG1kKClgLCBpdCB1c2VkIHRvIHNpbXBseSByZXR1cm4gYFNDQU5fUEFHRV9BTk9OYCB3aGVuIGl0IGZvdW5kIGEgbm9uLWFub255bW91cyBwYWdlLiBOb3csIGl0IHdpbGwgdHJpZ2dlciBhIGBWTV9XQVJOX09OX0ZPTElPYCBpZiBpdCdzIG5vdCBhbm9uISBUaGlzIGlzIGEgZG93bmdyYWRlIGZvciBvbmUgY2FsbCBzaXRlLCBidXQgYW4gaW50cm9kdWN0aW9uIG9mIGEgbmV3IHdhcm5pbmcgZm9yIHRoZSBvdGhlci5cblxuU28gdGhlIHF1ZXN0aW9uIGJlY29tZXM6IGNhbiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgZXZlciBlbmNvdW50ZXIgYSBub24tYW5vbnltb3VzIGZvbGlvPyBJJ2xsIG5lZWQgdG8gdmVyaWZ5IHRoZSBjYWxsIHBhdGhzIG9mIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCwgd2hpY2ggaXMgY2FsbGVkIGZyb20gYGtodWdlcGFnZWRfc2Nhbl9wbWQoKWAsIHdoaWNoIGlzIGNhbGxlZCBmcm9tIGBraHVnZXBhZ2VkX3NjYW5fbW1fc2xvdCgpYC4gSXQgc2NhbnMgYW5vbnltb3VzIFZNQXMsIG1lYW5pbmcgdGhlIG5vbi1hbm9uIGZvbGlvIG11c3QgY29tZSBmcm9tIGEgc291cmNlIHRoYXQga2h1Z2VwYWdlZCBpbnRlcmFjdHMgd2l0aC4gSSdtIHRoaW5raW5nIHRoZSB6ZXJvIHBhZ2UgaXMgaGFuZGxlZCBieSBgcHRlX25vbmVfb3JfemVybygpYC4gSXQgbG9va3MgbGlrZSB0aGlzIG5ldyB3YXJuaW5nIGNvdWxkIGJlIHRyaWdnZXJlZCBieSBzb21ldGhpbmcgbGlrZSBhIFZNQSBiZWluZyBhbm9ueW1vdXMsIGJ1dCB0aGUgdW5kZXJseWluZyBwYWdlIG5vdCBhY3R1YWxseSBiZWluZyBhbm9ueW1vdXMuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGludHJvZHVjZSBhbnkgbmV3IGluc3RhYmlsaXR5IGR1ZSB0byBuZXcgd2FybmluZ3MuIEknbGwgbmVlZCB0byBjaGVjayB0aGUgVk1BIHRvIHZlcmlmeSB3aGV0aGVyIGBraHVnZXBhZ2VkYCBjYW4gYWN0dWFsbHkgaW50ZXJhY3Qgd2l0aCB0aGlzIGNhc2Ugb3Igbm90LCBhbmQgd2hldGhlciB0aGF0IGZvbGlvIGNhbiBhY3R1YWxseSBiZSBub24tYW5vbi5cblxuSSdtIG5vdyBnb2luZyB0byB1c2UgYGRlZmF1bHRfYXBpOmdyZXBwZXJgIHRvIHNlYXJjaCBmb3IgYGNvbGxhcHNlX3NjYW5fcG1kYCB0byB2ZXJpZnkgbXkgZmluZGluZ3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExMjM2LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgyMiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjM5OjI3LjcyNTYyOTIxNVoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjA4Njk5MDM1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbGxhcHNlX3NjYW5fcG1kXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2todWdlcGFnZWQuYz0xMjI0PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNoZWNrX3BtZF9zdGlsbF92YWxpZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMjM4LSAqIEJyaW5nIG1pc3NpbmcgcGFnZXMgaW4gZnJvbSBzd2FwLCB0byBjb21wbGV0ZSBUSFAgY29sbGFwc2UuXFxubW0va2h1Z2VwYWdlZC5jOjEyMzk6ICogT25seSBkb25lIGlmIGNvbGxhcHNlX3NjYW5fcG1kKCkgYmVsaWV2ZXMgaXQgaXMgd29ydGh3aGlsZS5cXG5tbS9raHVnZXBhZ2VkLmMtMTI0MC0gKlxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTE1NjI9c3RhdGljIHVuc2lnbmVkIGludCBtYXhfb3JkZXJfZnJvbV9vZmZzZXQodW5zaWduZWQgaW50IG9mZnNldClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNTcxLSAqIG10aHBfY29sbGFwc2UoKSBjb25zdW1lcyB0aGUgYml0bWFwIHRoYXQgaXMgZ2VuZXJhdGVkIGR1cmluZ1xcbm1tL2todWdlcGFnZWQuYzoxNTcyOiAqIGNvbGxhcHNlX3NjYW5fcG1kKCkgdG8gZGV0ZXJtaW5lIHdoYXQgcmVnaW9ucyBhbmQgbVRIUCBvcmRlcnMgZml0IGJlc3QuXFxubW0va2h1Z2VwYWdlZC5jLTE1NzMtICpcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0xNTg3PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IG10aHBfY29sbGFwc2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTY4OC1cXG5tbS9raHVnZXBhZ2VkLmM6MTY4OTpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG5tbS9raHVnZXBhZ2VkLmMtMTY5MC1cXHRcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTI4MTE9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2luZ2xlX3BtZCh1bnNpZ25lZCBsb25nIGFkZHIsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMjgyMy1cXHRpZiAodm1hX2lzX2Fub255bW91cyh2bWEpKSB7XFxubW0va2h1Z2VwYWdlZC5jOjI4MjQ6XFx0XFx0cmVzdWx0ID0gY29sbGFwc2Vfc2Nhbl9wbWQobW0sIHZtYSwgYWRkciwgbG9ja19kcm9wcGVkLCBjYyk7XFxubW0va2h1Z2VwYWdlZC5jLTI4MjUtXFx0XFx0Z290byBlbmQ7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjM5OjI5LjMzNDM1NDAxWiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTIzMjAyNTU5NzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEtlcm5lbCBCdWcgaW4gYGNvbGxhcHNlX3NjYW5fcG1kKClgKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgYGNvbGxhcHNlX3NjYW5fcG1kKClgIGFuZCBpdCdzIGNhbGxlZCB3aGVuIHRoZSBWTUEgaXMgYW5vbnltb3VzLCBzcGVjaWZpY2FsbHkgd2hlbiBgdm1hX2lzX2Fub255bW91cyh2bWEpYCBpcyB0cnVlLiBNeSBmaXJzdCB0aG91Z2h0IGlzOiBjYW4gYW4gYW5vbnltb3VzIFZNQSAqYWN0dWFsbHkqIGNvbnRhaW4gYSBub24tYW5vbnltb3VzIGZvbGlvPyBJIGltbWVkaWF0ZWx5IGtub3cgdGhhdCBhIGBNQVBfUFJJVkFURWAgbWFwcGluZyBvZiBhIGZpbGUgd291bGQgcmV0dXJuIGZhbHNlIGZvciBgdm1hX2lzX2Fub255bW91cyh2bWEpYC4gQnV0IHdoYXQgYWJvdXQgYE1BUF9BTk9OWU1PVVMgfCBNQVBfU0hBUkVEYD8gVGhhdCdzIGEgc2htZW0gVk1BLCBhZ2FpbiwgYHZtYV9pc19hbm9ueW1vdXModm1hKWAgaXMgZmFsc2UuICBBIHN0YW5kYXJkIGBtbWFwKE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSlgIGNyZWF0ZXMgYW4gKmFub255bW91cyogVk1BLCBidXQgY291bGQgaXQgaGF2ZSBhIG5vbi1hbm9uIGZvbGlvPyAgSSBjb25zaWRlciBLU00gcGFnZXMsIGJ1dCB0aGV5J3JlIGFub24sIHNvIG5vIGx1Y2sgdGhlcmUuIFVwcm9iZXM/IFN0aWxsIGFub24uIFB0cmFjZSBpbnNlcnRlZCBwYWdlcz8gU3RpbGwgYW5vbi5cblxuQWhhISBXaGF0IGlmIGEgZGV2aWNlIGRyaXZlciB1c2VzIGB2bV9pbnNlcnRfcGFnZSgpYCB0byBtYXAgcGFnZXMgaW50byBhbiBhbm9ueW1vdXMgVk1BPyBJZiBhIGRyaXZlciBkb2VzIGRvIGEgYHZtX2luc2VydF9wYWdlKClgIGludG8gYW4gYW5vbnltb3VzIFZNQSwgdGhhdCBwYWdlICptaWdodCogbm90IGJlIGFub255bW91cy4gR29vZC4gTGV0J3Mgc2VlLi4uIGB2bV9ub3JtYWxfZm9saW8oKWAgd2lsbCByZXR1cm4gdGhlIGZvbGlvLiBJZiBpdCdzIG5vdCBhbm9uLCBgZm9saW9fdGVzdF9hbm9uKClgIHdpbGwgcmV0dXJuIGZhbHNlLiBBbmQsIHRoZSBjcnVjaWFsIHBhcnQsIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgd2lsbCB0cmlnZ2VyIGEgYFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihjdHgtXHUwMDNlZm9saW8pLCBjdHgtXHUwMDNlZm9saW8pO2AuIFdhaXQsIGlzIHRoaXMgYSBidWcgaW4gdGhlIHBhdGNoPyAgSXQgZGlkbid0IHVzZWQgdG8gaGF2ZSB0aGF0IHdhcm5pbmchIExldCBtZSBjaGVjayB0aGUgb3JpZ2luYWwgY29kZS4uLlxuXG5Pa2F5LCBJIHNlZSBpdC4gVGhlIG9yaWdpbmFsIGNvZGUganVzdCByZXR1cm5lZCBgU0NBTl9QQUdFX0FOT05gLiBUaGUgbmV3IGNvZGUgbm93IGFkZHMgYSBgVk1fV0FSTl9PTl9GT0xJT2AsIHdoaWNoIG1lYW5zIHRoZSBjdXJyZW50IHBhdGNoIGludHJvZHVjZWQgYSBmdW5jdGlvbmFsIGNoYW5nZS4gVGhhdOKAmXMgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGZ1enplZCFcblxuQ2FuIHdlIGV2ZW4gdHJpZ2dlciB0aGlzIHdhcm5pbmc/IEhvdyBjb3VsZCB3ZSBnZXQgYSBub24tYW5vbiBwYWdlIGludG8gYW4gYW5vbiBWTUE/IFRoZSBiZXN0IHdheSBJIHRoaW5rIHdvdWxkIGJlIGZvciBzeXprYWxsZXIgdG8gbWFwIGEgbm9uLWFub24gcGFnZSBpbnRvIGFuIGFub255bW91cyBWTUEgYW5kIHRoZW4gdHJpZ2dlciBraHVnZXBhZ2VkIHRvIHNjYW4gaXQsIHdoaWNoIHNob3VsZCB0cmlnZ2VyIHRoZSB3YXJuaW5nLlxuXG5JIHN0YXJ0IHJ1bm5pbmcgdGhyb3VnaCBwb3NzaWJsZSBhdmVudWVzOiBgbW1hcChNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUpYCB3b24ndCB3b3JrIHRvIG1hcCBhIG5vbi1hbm9uIHBhZ2UuIFdoYXQgYWJvdXQgYG1yZW1hcGA/IE5vLCBpdCBqdXN0IG1vdmVzIHRoZSB3aG9sZSBWTUEuIFdoYXQgYWJvdXQgYHZtc3BsaWNlYD8gV2hhdCBhYm91dCBgdXNlcmZhdWx0ZmRgPyBXaXRoIGBVRkZESU9fQ09QWWAsIGl0IGNvcGllcyBpbnRvIGFuIGFub24gcGFnZS4gQnV0IHdoYXQgYWJvdXQgYFVGRkRJT19DT05USU5VRWA/IFRoYXQncyBmb3Igc2htZW0vaHVnZXRsYi4gYG1hZHZpc2UoTUFEVl9NRVJHRUFCTEUpYD8gS1NNIHBhZ2VzIGFyZSBhbm9uLCBhZ2Fpbi4gYE9fRElSRUNUYCByZWFkIGludG8gYW4gYW5vbiBWTUE/IFBhZ2VzIGFyZSBhbm9uLiBXaGF0IGFib3V0IGBnZXRfdXNlcl9wYWdlc2A/XG5cbldhaXQsIHdoYXQgaWYgd2UgdXNlIGBtbWFwYCB0byBtYXAgYSBmaWxlLCB0aGVuIGBtcHJvdGVjdGA/IE5vLiBXaGF0IGFib3V0IGByZW1hcF9maWxlX3BhZ2VzYD8gSXQgd2FzIGRlcHJlY2F0ZWQuXG5cbk9rYXksIGxldCdzIHJlY2FwLiBJdCBpcyBwb3NzaWJsZSB0byB0cmlnZ2VyIHRoaXMgY2FzZS4gVG8gbWFwIGEgbm9uLWFub24gZm9saW8gaW50byBhbm9uIFZNQSB3ZSBzaG91bGQgc2VhcmNoIHRocm91Z2ggcG9zc2libGUgd2F5cywgZm9yIGV4YW1wbGU6IGEgZGV2aWNlIGRyaXZlciB1c2VzIGB2bV9pbnNlcnRfcGFnZSgpYCB0byBtYXAgcGFnZXMgaW50byBhbiBhbm9ueW1vdXMgVk1BLiBUaGlzIGlzIGRlZmluaXRlbHkgYSBidWcgaW4gdGhlIHBhdGNoISBMZXQncyBzZWFyY2ggZm9yIGBTQ0FOX1BBR0VfQU5PTmAgaW4gdGhlIGtlcm5lbCBzb3VyY2UgdG8gc2VlIGlmIHRoaXMgaXMgYSBrbm93biBpc3N1ZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTU1MjAsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4MDgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6Mzk6NDEuNjU0NjEyOTc2WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI2NTE4NTk1NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiU0NBTl9QQUdFX0FOT05cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC0yNi1cXHRFTSggU0NBTl9QQUdFX0xPQ0ssXFx0XFx0XFxcInBhZ2VfbG9ja2VkXFxcIilcXHRcXHRcXHRcXFxcXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaDoyNzpcXHRFTSggU0NBTl9QQUdFX0FOT04sXFx0XFx0XFxcInBhZ2Vfbm90X2Fub25cXFwiKVxcdFxcdFxcXFxcXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTI4LVxcdEVNKCBTQ0FOX1BBR0VfTEFaWUZSRUUsXFx0XFx0XFxcInBhZ2VfbGF6eWZyZWVcXFwiKVxcdFxcdFxcXFxcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0zMz1lbnVtIHNjYW5fcmVzdWx0IHtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy00OS1cXHRTQ0FOX1BBR0VfTE9DSyxcXG5tbS9raHVnZXBhZ2VkLmM6NTA6XFx0U0NBTl9QQUdFX0FOT04sXFxubW0va2h1Z2VwYWdlZC5jLTUxLVxcdFNDQU5fUEFHRV9MQVpZRlJFRSxcXG4tLVxcbm1tL2todWdlcGFnZWQuYz03NDc9c3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBjb2xsYXBzZV9jaGVja19wdGUocHRlX3QgcHRldmFsLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTc5Mi1cXHRcXHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oY3R4LVxcdTAwM2Vmb2xpbyksIGN0eC1cXHUwMDNlZm9saW8pO1xcbm1tL2todWdlcGFnZWQuYzo3OTM6XFx0XFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0FOT04pO1xcbm1tL2todWdlcGFnZWQuYy03OTQtXFx0fVxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTExNTM9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMTg2LVxcdGlmIChleHBlY3RfYW5vbiBcXHUwMDI2XFx1MDAyNiAoISgqdm1hcCktXFx1MDAzZWFub25fdm1hIHx8ICF2bWFfaXNfYW5vbnltb3VzKCp2bWFwKSkpXFxubW0va2h1Z2VwYWdlZC5jOjExODc6XFx0XFx0cmV0dXJuIFNDQU5fUEFHRV9BTk9OO1xcbm1tL2todWdlcGFnZWQuYy0xMTg4LVxcdHJldHVybiBTQ0FOX1NVQ0NFRUQ7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjM5OjQ0LjMwNjQ3ODg0NloiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwMDUzMzgyNzM0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgS2h1Z2VwYWdlZCBBbm9ueW1vdXMgUGFnZSBDb2xsYXBzZSBMb2dpYyoqXG5cbk9rYXksIHNvIEknbSBkaWdnaW5nIGludG8gdGhpcyBgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoKWAgZnVuY3Rpb24gYW5kIEkgc2VlIGl0IHJldHVybnMgYFNDQU5fUEFHRV9BTk9OYCB3aGVuIGBleHBlY3RfYW5vbmAgaXMgdHJ1ZSwgYnV0IHRoZSBWTUEgaXNuJ3QgYW5vbnltb3VzIGFueW1vcmUuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBcIldoZXJlIGFyZSB3ZSBjaGVja2luZyB0aGlzP1wiIFRoZW4gSSByZW1lbWJlciB0aGF0IGBjb2xsYXBzZV9jaGVja19wdGUoKWAgaXMgY2FsbGVkIHdoZW4gc2Nhbm5pbmcgdGhlIFBURXMuXG5cbk5vdywgaGVyZSdzIHdoZXJlIGl0IGdldHMgaW50ZXJlc3RpbmcuIEknbSBsb29raW5nIGF0IGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgIGFuZCByZWFsaXplIHRoZSBvbGQgY29kZSBhbHJlYWR5IGhhZCBgVk1fQlVHX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7YC4gVGhpcyBlbnN1cmVzIHRoYXQgd2UgYXJlIGNvbGxhcHNpbmcgYW5vbiBwYWdlcyBhbmQgdGhyb3dzIGEgVk0gYnVnIGlmIG5vdC5cblxuVGhlIHBhdGNoIHJlcGxhY2VzIHRoaXMgd2l0aCBgY29sbGFwc2VfY2hlY2tfcHRlKClgLCB3aGljaCBoYXMgYFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihjdHgtXHUwMDNlZm9saW8pLCBjdHgtXHUwMDNlZm9saW8pO2AuIFNvLCB0aGUgcGF0Y2ggYWN0dWFsbHkgKmRvd25ncmFkZXMqIGEgYFZNX0JVR19PTl9GT0xJT2AgdG8gYSBgVk1fV0FSTl9PTl9GT0xJT2AgaW4gYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAhIEF0IHRoZSBzYW1lIHRpbWUgaXQgKnVwZ3JhZGVzKiBhIHNpbGVudCByZXR1cm4gdG8gYFZNX1dBUk5fT05fRk9MSU9gIGluIGBjb2xsYXBzZV9zY2FuX3BtZCgpYC5cblxuSG9sZCBvbiwgSSBuZWVkIHRvIHRyYWNlIHRoZSBjYWxsIGZsb3cuIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgIGlzIGNhbGxlZCBmcm9tIGBjb2xsYXBzZV9odWdlX3BhZ2UoKWAsIHdoaWNoIGlzIGNhbGxlZCAqYWZ0ZXIqIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBoYXMgc3VjY2VlZGVkLiBTbyBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgc2NhbnMgdGhlIFBNRCBhbmQgaWYgaXQgZmluZHMgYSBub24tYW5vbnltb3VzIGZvbGlvLCBpdCAqdXNlZCogdG8gc2lsZW50bHkgcmV0dXJuIGBTQ0FOX1BBR0VfQU5PTmAuIElmIGl0ICpzdWNjZWVkZWQqLCBhbGwgdGhlIGZvbGlvcyB3ZXJlIGFub255bW91cy4gVGhlbiwgYGNvbGxhcHNlX2h1Z2VfcGFnZSgpYCBpcyBjYWxsZWQsIHdoaWNoIGNhbGxzIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgLiBJbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCwgaXQgdXNlZCB0byBoYXZlIHRoZSBgVk1fQlVHX09OX0ZPTElPYCwgYmVjYXVzZSBpdCAqYXNzdW1lZCogdGhhdCBzaW5jZSBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgYWxyZWFkeSBjaGVja2VkLCBpdCBtdXN0IGJlIGFub255bW91cy5cblxuQnV0IHdhaXQgYSBtaW51dGXigKYgdGhlIGBtbWFwX2xvY2tgIGlzIGRyb3BwZWQgKmJldHdlZW4qIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBhbmQgYGNvbGxhcHNlX2h1Z2VfcGFnZSgpYCEgIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBkcm9wcyB0aGUgbG9jayBiZWZvcmUgY2FsbGluZyBgbXRocF9jb2xsYXBzZSgpYC5cblxuTm93LCBpcyBgbXRocF9jb2xsYXBzZSgpYCBjYWxsZWQgKmluc3RlYWQqIG9mIGBjb2xsYXBzZV9odWdlX3BhZ2UoKWA/ICBMZXQncyBjaGVjayBgbXRocF9jb2xsYXBzZSgpYC4uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzU5NSwiT3V0cHV0VG9rZW5zIjoxOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY2NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTozOTo1NC4zNTk4NjQ2NVoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjk4MDg0NjE4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm10aHBfY29sbGFwc2VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0va2h1Z2VwYWdlZC5jPTE1NjI9c3RhdGljIHVuc2lnbmVkIGludCBtYXhfb3JkZXJfZnJvbV9vZmZzZXQodW5zaWduZWQgaW50IG9mZnNldClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNTcwLS8qXFxubW0va2h1Z2VwYWdlZC5jOjE1NzE6ICogbXRocF9jb2xsYXBzZSgpIGNvbnN1bWVzIHRoZSBiaXRtYXAgdGhhdCBpcyBnZW5lcmF0ZWQgZHVyaW5nXFxubW0va2h1Z2VwYWdlZC5jLTE1NzItICogY29sbGFwc2Vfc2Nhbl9wbWQoKSB0byBkZXRlcm1pbmUgd2hhdCByZWdpb25zIGFuZCBtVEhQIG9yZGVycyBmaXQgYmVzdC5cXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNTg2LSAqL1xcbm1tL2todWdlcGFnZWQuYzoxNTg3OnN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IG10aHBfY29sbGFwc2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxubW0va2h1Z2VwYWdlZC5jLTE1ODgtXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgcmVmZXJlbmNlZCwgaW50IHVubWFwcGVkLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTE2ODk9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTcyOS1cXHQgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLiBUaGUgYml0bWFwXFxubW0va2h1Z2VwYWdlZC5jOjE3MzA6XFx0ICogaXMgdGhlbiBjaGVja2VkIGFnYWluIGluIG10aHBfY29sbGFwc2UoKSBmb3IgZWFjaCBhdHRlbXB0ZWQgb3JkZXIuXFxubW0va2h1Z2VwYWdlZC5jLTE3MzEtXFx0ICovXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTgwNy1cXHRcXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcXG5tbS9raHVnZXBhZ2VkLmM6MTgwODpcXHRcXHRyZXN1bHQgPSBtdGhwX2NvbGxhcHNlKG1tLCBzdGFydF9hZGRyLCByZWZlcmVuY2VkLFxcbm1tL2todWdlcGFnZWQuYy0xODA5LVxcdFxcdFxcdFxcdCAgICAgICBjdHgudW5tYXBwZWQsIGNjLCBlbmFibGVkX29yZGVycyk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjM5OjU2LjA1Nzk1NzI2OFoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM5NjgyNDAxNzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipBbmFseXppbmcgdGhlIEZ1bmN0aW9uIENhbGw6IGBtdGhwX2NvbGxhcHNlKClgKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIFRoZSBtZW50YWwgdHJpZ2dlciBoZXJlIGlzIHNlZWluZyB0aGF0IGZ1bmN0aW9uIGNhbGw6IGBtdGhwX2NvbGxhcHNlKClgLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gaW1tZWRpYXRlbHkgc3RhcnQgcGFyc2luZyB3aGF0IHRoYXQgKm1lYW5zKi4gQmFzZWQgb24gdGhlIG5hbWluZyBjb252ZW50aW9uIChhc3N1bWluZyB0aGlzIGlzIG15IG93biBjb2RlYmFzZSBvciBvbmUgSSdtIHZlcnkgZmFtaWxpYXIgd2l0aCksIHRoZSBcIm10aHBcIiBzdHJvbmdseSBzdWdnZXN0cyB0aGlzIGlzIHJlbGF0ZWQgdG8gc29tZXRoaW5nIGxpa2UgXCJNdWx0aS10aHJlYWRlZCBIaWVyYXJjaGljYWwgUHJvY2Vzc2luZyxcIiBvciBtYXliZSBhIHNpbWlsYXIgc3RydWN0dXJlIHRoYXQgdXRpbGl6ZXMgY29sbGFwc2Ugb3BlcmF0aW9uIGZvciBwYXJhbGxlbGlzbS4gVGhlIG5hbWUgXCJjb2xsYXBzZVwiIGlzIGNyaXRpY2FsIGhlcmUuIEl0IGhpbnRzIGF0IHNvbWUga2luZCBvZiByZWR1Y3Rpb24gb3IgYWdncmVnYXRpb24gcHJvY2VzcyBhcHBsaWVkIHRvIGEgaGllcmFyY2hpY2FsIG9yIHBhcmFsbGVsIGRhdGEgc3RydWN0dXJlLiBJJ20gYWxyZWFkeSBhbnRpY2lwYXRpbmcga2V5IGVsZW1lbnRzIG9mIGl0IG1pZ2h0IGJlIHJlbGF0ZWQgdG8gZWl0aGVyIGRhdGEgcmVkdWN0aW9uIChhICdjb2xsYXBzZScgaW50byBhZ2dyZWdhdGUgZGF0YSkgb3IgdGhyZWFkIHN5bmNocm9uaXphdGlvbiBhbmQgd2FpdGluZy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGhpZXJhcmNoaWNhbCBhc3BlY3QgYW5kIHRocmVhZGluZyByZWxhdGlvbnNoaXAgb2YgdGhhdCBzcGVjaWZpYyBjb250ZXh0IHRvIHVuZGVyc3RhbmQgd2hhdCB0eXBlIG9mIGluZm9ybWF0aW9uIGFuZCBkYXRhIGlzIHBhc3NlZC4gVGhlIGdvYWwgd291bGQgbGlrZWx5IGJlIHRvIHJlZHVjZSB0aGUgY29tcGxleGl0eSBvZiB0aGUgZGF0YSBieSBtZXJnaW5nIG9yIGdyb3VwaW5nIGRhdGEgaW4gYW4gb3JkZXJseSBmYXNoaW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTI0NCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQwOjAwLjAyNjE5OTUxNFoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzc0MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0va2h1Z2VwYWdlZC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE1ODcsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE1ODc6XFx0c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgbXRocF9jb2xsYXBzZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4xNTg4OlxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50IHJlZmVyZW5jZWQsIGludCB1bm1hcHBlZCxcXG4xNTg5OlxcdFxcdFxcdHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYywgdW5zaWduZWQgbG9uZyBlbmFibGVkX29yZGVycylcXG4xNTkwOlxcdHtcXG4xNTkxOlxcdFxcdHVuc2lnbmVkIGludCBucl9vY2N1cGllZF9wdGVzLCBucl9wdGVzLCBtYXhfcHRlc19ub25lO1xcbjE1OTI6XFx0XFx0ZW51bSBzY2FuX3Jlc3VsdCBsYXN0X3Jlc3VsdCA9IFNDQU5fRkFJTDtcXG4xNTkzOlxcdFxcdGludCBjb2xsYXBzZWQgPSAwO1xcbjE1OTQ6XFx0XFx0Ym9vbCBhbGxvY19mYWlsZWQgPSBmYWxzZTtcXG4xNTk1OlxcdFxcdHVuc2lnbmVkIGxvbmcgY29sbGFwc2VfYWRkcmVzcztcXG4xNTk2OlxcdFxcdHVuc2lnbmVkIGludCBvZmZzZXQgPSAwO1xcbjE1OTc6XFx0XFx0dW5zaWduZWQgaW50IG9yZGVyID0gSFBBR0VfUE1EX09SREVSO1xcbjE1OTg6XFx0XFxuMTU5OTpcXHRcXHR3aGlsZSAob2Zmc2V0IFxcdTAwM2MgSFBBR0VfUE1EX05SKSB7XFxuMTYwMDpcXHRcXHRcXHRucl9wdGVzID0gMVVMIFxcdTAwM2NcXHUwMDNjIG9yZGVyO1xcbjE2MDE6XFx0XFxuMTYwMjpcXHRcXHRcXHRpZiAoIXRlc3RfYml0KG9yZGVyLCBcXHUwMDI2ZW5hYmxlZF9vcmRlcnMpKVxcbjE2MDM6XFx0XFx0XFx0XFx0Z290byBuZXh0X29yZGVyO1xcbjE2MDQ6XFx0XFxuMTYwNTpcXHRcXHRcXHRtYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgTlVMTCwgb3JkZXIpO1xcbjE2MDY6XFx0XFx0XFx0bnJfb2NjdXBpZWRfcHRlcyA9IGJpdG1hcF93ZWlnaHRfZnJvbShjYy1cXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMsIG9mZnNldCxcXG4xNjA3OlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgIG9mZnNldCArIG5yX3B0ZXMpO1xcbjE2MDg6XFx0XFxuMTYwOTpcXHRcXHRcXHQvKlxcbjE2MTA6XFx0XFx0XFx0ICogU3dhcCBQVEVzIGFjY2VwdGVkIGR1cmluZyB0aGUgc2NhbiBhcmUgY291bnRlZCBpbiBAdW5tYXBwZWQsXFxuMTYxMTpcXHRcXHRcXHQgKiBub3QgaW4gdGhlIHByZXNlbnQtUFRFIGJpdG1hcC4gQWNjb3VudCB0aGVtIGZvciB0aGUgUE1ELW9yZGVyXFxuMTYxMjpcXHRcXHRcXHQgKiBjYW5kaWRhdGUuXFxuMTYxMzpcXHRcXHRcXHQgKi9cXG4xNjE0OlxcdFxcdFxcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxcbjE2MTU6XFx0XFx0XFx0XFx0bnJfb2NjdXBpZWRfcHRlcyArPSB1bm1hcHBlZDtcXG4xNjE2OlxcdFxcbjE2MTc6XFx0XFx0XFx0aWYgKG5yX29jY3VwaWVkX3B0ZXMgXFx1MDAzZT0gbnJfcHRlcyAtIG1heF9wdGVzX25vbmUpIHtcXG4xNjE4OlxcdFxcdFxcdFxcdGVudW0gc2Nhbl9yZXN1bHQgcmV0O1xcbjE2MTk6XFx0XFxuMTYyMDpcXHRcXHRcXHRcXHRjb2xsYXBzZV9hZGRyZXNzID0gYWRkcmVzcyArIG9mZnNldCAqIFBBR0VfU0laRTtcXG4xNjIxOlxcdFxcdFxcdFxcdHJldCA9IGNvbGxhcHNlX2h1Z2VfcGFnZShtbSwgY29sbGFwc2VfYWRkcmVzcywgcmVmZXJlbmNlZCxcXG4xNjIyOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCB1bm1hcHBlZCwgY2MsIG9yZGVyKTtcXG4xNjIzOlxcdFxcbjE2MjQ6XFx0XFx0XFx0XFx0c3dpdGNoIChyZXQpIHtcXG4xNjI1OlxcdFxcdFxcdFxcdC8qIENhc2VzIHdoZXJlIHdlIGNvbnRpbnVlIHRvIG5leHQgY29sbGFwc2UgY2FuZGlkYXRlICovXFxuMTYyNjpcXHRcXHRcXHRcXHRjYXNlIFNDQU5fU1VDQ0VFRDpcXG4xNjI3OlxcdFxcdFxcdFxcdFxcdGNvbGxhcHNlZCArPSBucl9wdGVzO1xcbjE2Mjg6XFx0XFx0XFx0XFx0XFx0ZmFsbHRocm91Z2g7XFxuMTYyOTpcXHRcXHRcXHRcXHRjYXNlIFNDQU5fUFRFX01BUFBFRF9IVUdFUEFHRTpcXG4xNjMwOlxcdFxcdFxcdFxcdFxcdGdvdG8gbmV4dF9vZmZzZXQ7XFxuMTYzMTpcXHRcXHRcXHRcXHQvKiBDYXNlcyB3aGVyZSBsb3dlciBvcmRlcnMgbWlnaHQgc3RpbGwgc3VjY2VlZCAqL1xcbjE2MzI6XFx0XFx0XFx0XFx0Y2FzZSBTQ0FOX0FMTE9DX0hVR0VfUEFHRV9GQUlMOlxcbjE2MzM6XFx0XFx0XFx0XFx0XFx0YWxsb2NfZmFpbGVkID0gdHJ1ZTtcXG4xNjM0OlxcdFxcdFxcdFxcdFxcdGZhbGx0aHJvdWdoO1xcbjE2MzU6XFx0XFx0XFx0XFx0Y2FzZSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFOlxcbjE2MzY6XFx0XFx0XFx0XFx0Y2FzZSBTQ0FOX0VYQ0VFRF9OT05FX1BURTpcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDA6MDAuMDI2MzM5NDM0WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjIyMDE2NzQ1MzMwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5c2lzIG9mIEh1Z2UgUGFnZSBDb2xsYXBzZSBDb2RlIENoYW5nZXMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCBwcm9jZXNzIGZvY3VzZWQgb24gdGhlIGZsb3cgb2YgYG10aHBfY29sbGFwc2UoKWAgY2FsbGluZyBgY29sbGFwc2VfaHVnZV9wYWdlKClgLiBUaGUga2V5IGNvbmNlcm4gd2FzIHRoZSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBkcm9wcGluZyBhbmQgcmVhY3F1aXJpbmcgdGhlIG1tYXBfbG9jayBhbmQgdGhlIG1vZGlmaWNhdGlvbiBvZiBQVEVzLiBUaGUgcmV2YWxpZGF0aW9uIHRocm91Z2ggYGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKClgIHNlZW1lZCBsaWtlIGEgcG90ZW50aWFsIHNhZmVndWFyZC5cblxuTXkgbWluZCB0aGVuIGp1bXBlZCB0byB0aGUgY3JpdGljYWwgcG9pbnQ6IHRoZSBoYW5kbGluZyBvZiBub24tYW5vbnltb3VzIHBhZ2VzIHdpdGhpbiBhbiBhbm9ueW1vdXMgVk1BLiBTcGVjaWZpY2FsbHksIEkgY29uc2lkZXJlZCBzY2VuYXJpb3MgbGlrZSB6ZXJvIHBhZ2VzLCBLU00gcGFnZXMsIGFuZCBwYWdlcyBmcm9tIGZpbGVzLiBUaGUgYHZtX2luc2VydF9wYWdlKClgIGZ1bmN0aW9uJ3MgYWJpbGl0eSB0byBtYXAgbm9uLWFub24gcGFnZXMgaW50byBhbnkgVk1BIHJhaXNlZCBhIHJlZCBmbGFnLiBUaGlzIGJyb3VnaHQgdGhlIGBWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oY3R4LVx1MDAzZWZvbGlvKSwgY3R4LVx1MDAzZWZvbGlvKTtgIGNoZWNrLCB3aGljaCByZXBsYWNlZCBhIGBWTV9CVUdfT05fRk9MSU9gIGZyb20gdGhlIG9sZGVyIGNvZGUuIFNvIHRoZSBjaGFuZ2UgcmVzdWx0ZWQgaW4gYSBkb3duZ3JhZGUgZnJvbSBhIEJVRyB0byBhIFdBUk4uIEFuZCBhbHNvIHRoZSBjb2RlIG5vdyBXQVJOUyBpbiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgd2hlcmUgaXQgdXNlZCB0byBqdXN0IHJldHVybi5cblxuSSB3ZW50IGludG8gaW52ZXN0aWdhdGluZyB3aGF0IGhhcHBlbnMgaW5zaWRlIGBjb2xsYXBzZV9jaGVja19wdGUoKWAsIHdoZXJlIGl0J3MgY2FsbGVkIGZyb20gYm90aCBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgYW5kIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgLiBUaGUgYWRkaXRpb24gb2YgdGhlIFdBUk4gaW4gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlLCBhcyBpdCBpbnRyb2R1Y2VzIGEgd2FybmluZyB3aGVyZSBwcmV2aW91c2x5LCB0aGVyZSB3YXMgbm9uZS4gSSB3b25kZXJlZCBpZiB0aGlzIGFkZHMgYSB3YXJuaW5nLlxuXG5JIGNoZWNrZWQgYHB0ZV9pc19yZWZlcmVuY2VkKClgLCBjb21wYXJpbmcgdGhlIG9sZCBhbmQgbmV3IGlubGluZSBjb2RlLiBJdCdzIHVuY2hhbmdlZCwgd2hpY2ggaXMgZ29vZC4gVGhlbiwgSSBsb29rZWQgYXQgdGhlIGhhbmRsaW5nIG9mIHNoYXJlZCBwYWdlcyBhbmQgdW5tYXBwZWQgcGFnZXMgd2l0aGluIGJvdGggYGNvbGxhcHNlX3NjYW5fcG1kKClgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCwgYW5kIHRoZXNlIHNlY3Rpb25zIGFyZSBhbHNvIHRoZSBzYW1lLiBUaGUgVUZGRCAodXNlcmZhdWx0ZmQpIGhhbmRsaW5nIGlzIGFsc28gY29uc2lzdGVudCBhY3Jvc3MgYm90aCBvbGQgYW5kIG5ldyBjb2RlLlxuXG5GaW5hbGx5LCB0aGUgY2hhbmdlIHRvIGBjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbigpYCBhZGRzIGEgbmV3IGZ1bmN0aW9uIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIHNjYW4sIGhvd2V2ZXIgdGhlIGNvZGUgYWxzbyBoYXMgYSBgYml0bWFwX3plcm8oKWAgY2FsbCB0aGF0IHdhcyAqbm90KiBpbiBgY29sbGFwc2Vfc2Nhbl9maWxlKClgIGJlZm9yZS4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdGhlIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBhbmQgYGNvbGxhcHNlX3NjYW5fZmlsZSgpYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjAzMzUsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNDg5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDA6MjIuMDQzMDg3NTc0WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDg1OTU4NjYzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbGxhcHNlX3NjYW5fZmlsZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9raHVnZXBhZ2VkLmM9MjI2OT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMjcwMC1cXG5tbS9raHVnZXBhZ2VkLmM6MjcwMTpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxubW0va2h1Z2VwYWdlZC5jLTI3MDItXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgcGdvZmZfdCBzdGFydCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0yODExPXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NpbmdsZV9wbWQodW5zaWduZWQgbG9uZyBhZGRyLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTI4MzMtcmV0cnk6XFxubW0va2h1Z2VwYWdlZC5jOjI4MzQ6XFx0cmVzdWx0ID0gY29sbGFwc2Vfc2Nhbl9maWxlKG1tLCBhZGRyLCBmaWxlLCBwZ29mZiwgY2MpO1xcbm1tL2todWdlcGFnZWQuYy0yODM1LVxcbi0tXFxubW0vbXJlbWFwLmM9MTk3PXN0YXRpYyBpbnQgbW92ZV9wdGVzKHN0cnVjdCBwYWdldGFibGVfbW92ZV9jb250cm9sICpwbWMsXFxuLS1cXG5tbS9tcmVtYXAuYy0yNDYtXFx0LypcXG5tbS9tcmVtYXAuYzoyNDc6XFx0ICogTm93IG5ld19wdGUgaXMgbm9uZSwgc28gY29sbGFwc2Vfc2Nhbl9maWxlKCkgcGF0aCBjYW4gbm90IGZpbmRcXG5tbS9tcmVtYXAuYy0yNDgtXFx0ICogdGhpcyBieSB0cmF2ZXJzaW5nIGZpbGUtXFx1MDAzZWZfbWFwcGluZywgc28gdGhlcmUgaXMgbm8gY29uY3VycmVuY3kgd2l0aFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTo0MDoyMy41MjkwNTE1NThaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDY5NDgxODQ3NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBob3cgSSdkIGFwcHJvYWNoIHRoaXMgdGFzaywgYXMgaWYgdGhlc2Ugd2VyZSBteSBpbnRlcm5hbCB0aG91Z2h0czpcblxuKipBbmFseXppbmcgYGNvbGxhcHNlX3NjYW5fZmlsZSgpYCBmb3IgYGNjLVx1MDAzZW10aHBfcHJlc2VudF9wdGVzYCBVc2FnZSoqXG5cblJpZ2h0LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYGNjLVx1MDAzZW10aHBfcHJlc2VudF9wdGVzYCBpcyBiZWluZyB1c2VkLiBUaGUgbW9zdCBsb2dpY2FsIHBsYWNlIHRvIHN0YXJ0IGlzIHdpdGhpbiB0aGUgYGNvbGxhcHNlX3NjYW5fZmlsZSgpYCBmdW5jdGlvbi4gSSB3YW50IHRvIHNlZSBpZiB0aGlzIHBhcnRpY3VsYXIgbWVtYmVyIG9mIHRoZSBgY2NgIChwcmVzdW1hYmx5IHNvbWUga2luZCBvZiBjb250cm9sIGNvbnRleHQgb3IgY2FjaGUgc3RydWN0dXJlKSBpcyBhY3R1YWxseSBhY2Nlc3NlZCBhbmQgbWFuaXB1bGF0ZWQgd2l0aGluIHRoYXQgZnVuY3Rpb24uIEknbGwgbmVlZCB0byBjYXJlZnVsbHkgZXhhbWluZSB0aGUgY29kZSB3aXRoaW4gYGNvbGxhcHNlX3NjYW5fZmlsZSgpYCB0byBjb25maXJtIGl0cyB1c2FnZS4gS25vd2luZyB3aGVyZSB0aGlzIHZhcmlhYmxlIGlzIHVzZWQgaXMgY3JpdGljYWwgZm9yIHVuZGVyc3RhbmRpbmcgaXRzIHB1cnBvc2UgYW5kIGltcGFjdC4gSSdsbCBuZWVkIHRvIGNoZWNrIHRoZSBmdW5jdGlvbiwgbGluZSBieSBsaW5lLCB0byBzZWUgaWYgdGhlIHZhcmlhYmxlIGlzIGRpcmVjdGx5IHVzZWQgb3IgaWYgYW5vdGhlciB2YXJpYWJsZSB3aGljaCB1c2VzIGl0IGlzIHVzZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIzNjgxLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDA6MjguMjIzODcyNzAzWiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwMDQ5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9raHVnZXBhZ2VkLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjcwMSxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjcwMTpcXHRzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuMjcwMjpcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBmaWxlICpmaWxlLCBwZ29mZl90IHN0YXJ0LFxcbjI3MDM6XFx0XFx0XFx0c3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKVxcbjI3MDQ6XFx0e1xcbjI3MDU6XFx0XFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCBOVUxMLCBIUEFHRV9QTURfT1JERVIpO1xcbjI3MDY6XFx0XFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpO1xcbjI3MDc6XFx0XFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IE5VTEw7XFxuMjcwODpcXHRcXHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZpbGUtXFx1MDAzZWZfbWFwcGluZztcXG4yNzA5OlxcdFxcdFhBX1NUQVRFKHhhcywgXFx1MDAyNm1hcHBpbmctXFx1MDAzZWlfcGFnZXMsIHN0YXJ0KTtcXG4yNzEwOlxcdFxcdGludCBwcmVzZW50LCBzd2FwO1xcbjI3MTE6XFx0XFx0aW50IG5vZGUgPSBOVU1BX05PX05PREU7XFxuMjcxMjpcXHRcXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcXG4yNzEzOlxcdFxcbjI3MTQ6XFx0XFx0cHJlc2VudCA9IDA7XFxuMjcxNTpcXHRcXHRzd2FwID0gMDtcXG4yNzE2OlxcdFxcdGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTtcXG4yNzE3OlxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4yNzE4OlxcdFxcdHhhc19mb3JfZWFjaChcXHUwMDI2eGFzLCBmb2xpbywgc3RhcnQgKyBIUEFHRV9QTURfTlIgLSAxKSB7XFxuMjcxOTpcXHRcXHRcXHRpZiAoeGFzX3JldHJ5KFxcdTAwMjZ4YXMsIGZvbGlvKSlcXG4yNzIwOlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbjI3MjE6XFx0XFxuMjcyMjpcXHRcXHRcXHRpZiAoeGFfaXNfdmFsdWUoZm9saW8pKSB7XFxuMjcyMzpcXHRcXHRcXHRcXHRzd2FwICs9IDEgXFx1MDAzY1xcdTAwM2MgeGFzX2dldF9vcmRlcihcXHUwMDI2eGFzKTtcXG4yNzI0OlxcdFxcdFxcdFxcdGlmIChzd2FwIFxcdTAwM2UgbWF4X3B0ZXNfc3dhcCkge1xcbjI3MjU6XFx0XFx0XFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9FWENFRURfU1dBUF9QVEU7XFxuMjcyNjpcXHRcXHRcXHRcXHRcXHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUpO1xcbjI3Mjc6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuMjcyODpcXHRcXHRcXHRcXHR9XFxuMjcyOTpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4yNzMwOlxcdFxcdFxcdH1cXG4yNzMxOlxcdFxcbjI3MzI6XFx0XFx0XFx0aWYgKCFmb2xpb190cnlfZ2V0KGZvbGlvKSkge1xcbjI3MzM6XFx0XFx0XFx0XFx0eGFzX3Jlc2V0KFxcdTAwMjZ4YXMpO1xcbjI3MzQ6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuMjczNTpcXHRcXHRcXHR9XFxuMjczNjpcXHRcXG4yNzM3OlxcdFxcdFxcdGlmICh1bmxpa2VseShmb2xpbyAhPSB4YXNfcmVsb2FkKFxcdTAwMjZ4YXMpKSkge1xcbjI3Mzg6XFx0XFx0XFx0XFx0Zm9saW9fcHV0KGZvbGlvKTtcXG4yNzM5OlxcdFxcdFxcdFxcdHhhc19yZXNldChcXHUwMDI2eGFzKTtcXG4yNzQwOlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbjI3NDE6XFx0XFx0XFx0fVxcbjI3NDI6XFx0XFxuMjc0MzpcXHRcXHRcXHRpZiAoaXNfcG1kX29yZGVyKGZvbGlvX29yZGVyKGZvbGlvKSkpIHtcXG4yNzQ0OlxcdFxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUFRFX01BUFBFRF9IVUdFUEFHRTtcXG4yNzQ1OlxcdFxcdFxcdFxcdC8qXFxuMjc0NjpcXHRcXHRcXHRcXHQgKiBQTUQtc2l6ZWQgVEhQIGltcGxpZXMgdGhhdCB3ZSBjYW4gb25seSB0cnlcXG4yNzQ3OlxcdFxcdFxcdFxcdCAqIHJldHJhY3RpbmcgdGhlIFBURSB0YWJsZS5cXG4yNzQ4OlxcdFxcdFxcdFxcdCAqL1xcbjI3NDk6XFx0XFx0XFx0XFx0Zm9saW9fcHV0KGZvbGlvKTtcXG4yNzUwOlxcdFxcdFxcdFxcdGJyZWFrO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTo0MDoyOC4yMjQwNzQ1ODNaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjMzNzk5MjUzMzksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgQ29sbGFwc2UgQ29kZSBDaGFuZ2VzKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgd2FzIGZvY3VzZWQgb24gY29uZmlybWluZyB0aGF0IGNlcnRhaW4gb3B0aW1pemF0aW9ucyBpbiBgY29sbGFwc2Vfc2Nhbl9maWxlKClgIHdvdWxkbid0IGluYWR2ZXJ0ZW50bHkgaW1wYWN0IHRoZSBvdmVyYWxsIGNvbGxhcHNlIGxvZ2ljLiBTcGVjaWZpY2FsbHksIHRoZSB6ZXJvaW5nIG9mIGBjYy1cdTAwM2VtdGhwX3ByZXNlbnRfcHRlc2AgaW4gdGhhdCBzcGVjaWZpYyBmdW5jdGlvbiBhcHBlYXJlZCBzYWZlLCBhcyBpdCdzIG5vdCBkaXJlY3RseSB1dGlsaXplZCB3aXRoaW4gdGhlIGZ1bmN0aW9uJ3Mgc2NvcGUuIEhvd2V2ZXIsIHRoaXMgdHJpZ2dlcmVkIGEgbmVlZCB0byBtb3JlIHJpZ29yb3VzbHkgaW52ZXN0aWdhdGUgdGhlIHN1cnJvdW5kaW5nIGNvZGUuXG5cblRoZSBmaXJzdCBhcmVhIG9mIGNvbmNlcm4gd2FzIGFyb3VuZCB0aGUgbGF6eWZyZWUgaGFuZGxpbmcsIHNwZWNpZmljYWxseSB3aXRoaW4gYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAgYW5kIGBjb2xsYXBzZV9jaGVja19wdGUoKWAuIEl0J3MgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZDogd2Ugd2FudCB0byBwcmVzZXJ2ZSBsYXp5ZnJlZSBwYWdlcyBpZiB0aGUgVk1BIGhhcyB0aGUgYFZNX0RST1BQQUJMRWAgZmxhZyBzZXQsIGFuZCB0aGUgcGFnZSBpcyBhY3R1YWxseSBsYXp5ZnJlZSBhbmQgbm90IGRpcnR5LiBUaGUgY2hlY2sgaW4gdGhlIG5ldyBjb2RlIHVzaW5nIHRoZSBjb250ZXh0IHN0cnVjdHVyZSAoYGN0eGApIGFwcGVhcnMgZnVuY3Rpb25hbGx5IGlkZW50aWNhbCB0byB0aGUgb2xkZXIgaW1wbGVtZW50YXRpb24uIFdlIGFyZSBqdXN0IHVzaW5nIHRoZSBjb250ZXh0IHRvIHBhc3MgZGF0YSwgYXMgaXMgcHJvcGVyLlxuXG5OZXh0LCBJIGxvb2tlZCBhdCB0aGUgXCJ5b3VuZ1wiIHBhZ2UgY2hlY2ssIHdoaWNoIGRldGVybWluZXMgaWYgYSBQVEUgaXMgXCJ5b3VuZ1wiIGVub3VnaCB0byBqdXN0aWZ5IGNvbGxhcHNpbmcuIFRoZSBsb2dpYyB3aXRoaW4gYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAgYW5kIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBhcHBlYXJzIHRvIGJlIGlkZW50aWNhbCBhcyB3ZWxsLiBUaGUgb2xkIGBwdGVfeW91bmcoKWAgYW5kIGZvbGlvIGNoZWNrcywgYXMgd2VsbCBhcyB0aGUgTU1VIG5vdGlmaWVyIGNoZWNrLCBoYXZlIGJlZW4gY29uc29saWRhdGVkIGludG8gYHB0ZV9pc19yZWZlcmVuY2VkKClgLCBidXQgdGhlIGJlaGF2aW9yIGlzLCBmcm9tIHdoYXQgSSBjYW4gdGVsbCwgZXhhY3RseSB0aGUgc2FtZS5cblxuVGhlIGxvZ2ljIGluIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCB0aGF0IGRldGVybWluZXMgaWYgYSBjb2xsYXBzZSBzaG91bGQgYmUgc2tpcHBlZCBkdWUgdG8gYSBsYWNrIG9mIHJlZmVyZW5jZWQgcGFnZXMgYWxzbyBhcHBlYXJzIHRvIGJlIGlkZW50aWNhbC5cblxuVGhlIG1vc3QgaW50ZXJlc3RpbmcgYXJlYSB0byBsb29rIGF0IHdhcyByZWxhdGVkIHRvIHVubWFwcGVkIFBURXMuIEluIHRoZSBvbGRlciBjb2RlLCBhIHNpbXBsZSBpbnRlZ2VyIHZhcmlhYmxlIGB1bm1hcHBlZGAgd2FzIHVzZWQgdG8gdHJhY2sgdGhlIG51bWJlciBvZiB1bm1hcHBlZCBQVEVzLiBUaGUgbmV3IGNvZGUsIGhvd2V2ZXIsIGxldmVyYWdlcyBhIGNvbnRleHQgc3RydWN0dXJlIGBjdHhgLCBhbmQgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIG9sZCBgdW5tYXBwZWRgIHZhcmlhYmxlIGlzIG5vdyBgY3R4LnVubWFwcGVkYC4gSSBoYWQgdG8gY29uZmlybSB0aGF0IGBjdHgudW5tYXBwZWRgIHdhcyBpbml0aWFsaXplZCB0byB0aGUgY29ycmVjdCB2YWx1ZSwgYW5kIGFsc28gdGhlIGNvcnJlY3QgYmVoYXZpb3Igb2YgdGhlIGxvZ2ljIHRoYXQgdXNlcyB0aGUgYHVubWFwcGVkYCB2YWx1ZXMgYW5kIGNvdW50cywgYmFzZWQgb24gdGhlIGBtYXhfcHRlc19zd2FwYCBwYXJhbWV0ZXIuIEJhc2VkIG9uIEMncyBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb24gcnVsZXMsIGFzIGl0IGlzICpub3QqIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgaW4gdGhlIHN0cnVjdCwgaXQgd291bGQgZGVmYXVsdCB0byB6ZXJvLiBUaGUgaW5jcmVtZW50IGxvZ2ljIGlzIGNvbnNpc3RlbnQgYXMgd2VsbC4gU28gaXQgYmVoYXZlcyBpZGVudGljYWxseS5cblxuVGhlIGNoZWNrcyBmb3IgYGN0eC5ub25lX29yX3plcm9gLCBgY3R4LnNoYXJlZGAsIGFuZCB0aGUgYXNzaWdubWVudCBvZiBgY3R4LmZvbGlvYCBhbmQgYGN0eC5yZXN1bHRgIHdlcmUgdGhlbiBjb25maXJtZWQgdG8gYmUgaGFuZGxlZCBjb3JyZWN0bHksIGNvbmZpcm1pbmcgdGhhdCB0aGUgY29udGV4dCBzdHJ1Y3QgYmVoYXZlZCBsaWtlIHRoZSBvbGQgdmFyaWFibGVzLlxuXG5MYXN0bHksIHRoZSBgY291bnRfY29sbGFwc2VfZXZlbnQoKWAgZnVuY3Rpb24gd2FzIGNvbXBhcmVkLCB0byBlbnN1cmUgbm8gbG9naWMgY2hhbmdlIHdhcyBtYWRlIHRvIHRoZSBzdGF0cy4gVGhlIGxvZ2ljIGlzIGlkZW50aWNhbC4gVGhpcyBhcHBlYXJzIHRvIGJlIGNvcnJlY3QsIGFuZCB0aGF0IGBjb3VudF92bV9ldmVudCgpYCBpcyBjYWxsZWQgd2l0aCBgVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFYCBpcyBjb3JyZWN0LlxuXG5BZnRlciByZXZpZXdpbmcgdGhlc2UgYXJlYXMsIHRoZSBjb25jbHVzaW9uIGlzIHRoYXQgdGhlcmUgYXJlICpubyBmdW5jdGlvbmFsIGNoYW5nZXMqLiBUaGUgY29kZSB1c2VzIGEgY29udGV4dCBzdHJ1Y3QgYW5kIGlubGluZXMgc29tZSBmdW5jdGlvbnMsIGJ1dCB0aGUgYmVoYXZpb3IgaXMgdGhlIHNhbWUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI0NzIwLCJPdXRwdXRUb2tlbnMiOjE5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjYyNywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQwOjUxLjYwNDAwMTc5MloiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjUzNDUyODc1OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ2bV9ub3JtYWxfZm9saW9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvcHJvYy90YXNrX21tdS5jPTE2OTA9c3RhdGljIGlubGluZSBib29sIHB0ZV9pc19waW5uZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgcHRlKVxcbi0tXFxuZnMvcHJvYy90YXNrX21tdS5jLTE2OTktXFx0XFx0cmV0dXJuIGZhbHNlO1xcbmZzL3Byb2MvdGFza19tbXUuYzoxNzAwOlxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlKTtcXG5mcy9wcm9jL3Rhc2tfbW11LmMtMTcwMS1cXHRpZiAoIWZvbGlvKVxcbi0tXFxuZnMvcHJvYy90YXNrX21tdS5jPTE3NzA9c3RhdGljIGludCBjbGVhcl9yZWZzX3B0ZV9yYW5nZShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLS1cXG5mcy9wcm9jL3Rhc2tfbW11LmMtMTgxNS1cXG5mcy9wcm9jL3Rhc2tfbW11LmM6MTgxNjpcXHRcXHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIGFkZHIsIHB0ZW50KTtcXG5mcy9wcm9jL3Rhc2tfbW11LmMtMTgxNy1cXHRcXHRpZiAoIWZvbGlvKVxcbi0tXFxuaW5jbHVkZS9saW51eC9tbS5oPTMxNDM9ZXh0ZXJuIHZvaWQgdXNlcl9zaG1fdW5sb2NrKHNpemVfdCwgc3RydWN0IHVjb3VudHMgKik7XFxuaW5jbHVkZS9saW51eC9tbS5oLTMxNDQtXFxuaW5jbHVkZS9saW51eC9tbS5oOjMxNDU6c3RydWN0IGZvbGlvICp2bV9ub3JtYWxfZm9saW8oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG5pbmNsdWRlL2xpbnV4L21tLmgtMzE0Ni1cXHRcXHRcXHQgICAgIHB0ZV90IHB0ZSk7XFxuaW5jbHVkZS9saW51eC9tbS5oPTMxNDc9c3RydWN0IHBhZ2UgKnZtX25vcm1hbF9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuaW5jbHVkZS9saW51eC9tbS5oLTMxNDgtXFx0XFx0XFx0ICAgICBwdGVfdCBwdGUpO1xcbmluY2x1ZGUvbGludXgvbW0uaDozMTQ5OnN0cnVjdCBmb2xpbyAqdm1fbm9ybWFsX2ZvbGlvX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5pbmNsdWRlL2xpbnV4L21tLmgtMzE1MC1cXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgYWRkciwgcG1kX3QgcG1kKTtcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmM9Mzg5PXN0YXRpYyBpbnQgZGFtb25feW91bmdfcG1kX2VudHJ5KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmMtNDA0LVxcdFxcdFxcdGdvdG8gaHVnZV9vdXQ7XFxubW0vZGFtb24vdmFkZHIuYzo0MDU6XFx0XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW9fcG1kKHdhbGstXFx1MDAzZXZtYSwgYWRkciwgcG1kZSk7XFxubW0vZGFtb24vdmFkZHIuYy00MDYtXFx0XFx0aWYgKCFmb2xpbylcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmMtNDIzLVxcdFxcdGdvdG8gb3V0O1xcbm1tL2RhbW9uL3ZhZGRyLmM6NDI0OlxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHdhbGstXFx1MDAzZXZtYSwgYWRkciwgcHRlbnQpO1xcbm1tL2RhbW9uL3ZhZGRyLmMtNDI1LVxcdGlmICghZm9saW8pXFxuLS1cXG5tbS9kYW1vbi92YWRkci5jPTYzNT1zdGF0aWMgaW50IGRhbW9zX3ZhX21pZ3JhdGVfcG1kX2VudHJ5KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmMtNjUzLVxcdFxcdFxcdGdvdG8gaHVnZV9vdXQ7XFxubW0vZGFtb24vdmFkZHIuYzo2NTQ6XFx0XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW9fcG1kKHdhbGstXFx1MDAzZXZtYSwgYWRkciwgcG1kZSk7XFxubW0vZGFtb24vdmFkZHIuYy02NTUtXFx0XFx0aWYgKCFmb2xpbylcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmMtNjc2LVxcdFxcdFxcdGNvbnRpbnVlO1xcbm1tL2RhbW9uL3ZhZGRyLmM6Njc3OlxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHdhbGstXFx1MDAzZXZtYSwgYWRkciwgcHRlbnQpO1xcbm1tL2RhbW9uL3ZhZGRyLmMtNjc4LVxcdFxcdGlmICghZm9saW8pXFxuLS1cXG5tbS9kYW1vbi92YWRkci5jPTc5NT1zdGF0aWMgaW50IGRhbW9zX3ZhX3N0YXRfcG1kX2VudHJ5KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmMtODE0LVxcbm1tL2RhbW9uL3ZhZGRyLmM6ODE1OlxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvX3BtZCh2bWEsIGFkZHIsIHBtZGUpO1xcbm1tL2RhbW9uL3ZhZGRyLmMtODE2LVxcbi0tXFxubW0vZGFtb24vdmFkZHIuYy04MzktXFxubW0vZGFtb24vdmFkZHIuYzo4NDA6XFx0XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGVudCk7XFxubW0vZGFtb24vdmFkZHIuYy04NDEtXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTIyNzg9dm1fZmF1bHRfdCBkb19odWdlX3BtZF9udW1hX3BhZ2Uoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTIzMDctXFxubW0vaHVnZV9tZW1vcnkuYzoyMzA4OlxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvX3BtZCh2bWEsIGhhZGRyLCBwbWQpO1xcbm1tL2h1Z2VfbWVtb3J5LmMtMjMwOS1cXHRpZiAoIWZvbGlvKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0yNDYyPXN0YXRpYyBzdHJ1Y3QgZm9saW8gKm5vcm1hbF9vcl9zb2Z0bGVhZl9mb2xpb19wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTI0NjUtXFx0aWYgKGlzX3ByZXNlbnQpXFxubW0vaHVnZV9tZW1vcnkuYzoyNDY2OlxcdFxcdHJldHVybiB2bV9ub3JtYWxfZm9saW9fcG1kKHZtYSwgYWRkciwgcG1kdmFsKTtcXG5tbS9odWdlX21lbW9yeS5jLTI0NjctXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9NzQ3PXN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy03NzgtXFxubW0va2h1Z2VwYWdlZC5jOjc3OTpcXHRjdHgtXFx1MDAzZWZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKGN0eC1cXHUwMDNldm1hLCBhZGRyLCBwdGV2YWwpO1xcbm1tL2todWdlcGFnZWQuYy03ODAtXFx0aWYgKHVubGlrZWx5KCFjdHgtXFx1MDAzZWZvbGlvKSB8fCB1bmxpa2VseShmb2xpb19pc196b25lX2RldmljZShjdHgtXFx1MDAzZWZvbGlvKSkpXFxuLS1cXG5tbS9rc20uYz02MTY9c3RhdGljIGludCBicmVha19rc21fcG1kX2VudHJ5KHBtZF90ICpwbWRwLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLFxcbi0tXFxubW0va3NtLmMtNjM4LVxcdFxcdGlmIChwdGVfcHJlc2VudChwdGUpKSB7XFxubW0va3NtLmM6NjM5OlxcdFxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHdhbGstXFx1MDAzZXZtYSwgYWRkciwgcHRlKTtcXG5tbS9rc20uYy02NDAtXFx0XFx0fSBlbHNlIGlmICghcHRlX25vbmUocHRlKSkge1xcbi0tXFxubW0vbWFkdmlzZS5jPTM1Mz1zdGF0aWMgaW50IG1hZHZpc2VfY29sZF9vcl9wYWdlb3V0X3B0ZV9yYW5nZShwbWRfdCAqcG1kLFxcbi0tXFxubW0vbWFkdmlzZS5jLTQ3NS1cXG5tbS9tYWR2aXNlLmM6NDc2OlxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xcbm1tL21hZHZpc2UuYy00NzctXFx0XFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXFxuLS1cXG5tbS9tYWR2aXNlLmM9NjUyPXN0YXRpYyBpbnQgbWFkdmlzZV9mcmVlX3B0ZV9yYW5nZShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLS1cXG5tbS9tYWR2aXNlLmMtNzA0LVxcbm1tL21hZHZpc2UuYzo3MDU6XFx0XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGVudCk7XFxubW0vbWFkdmlzZS5jLTcwNi1cXHRcXHRpZiAoIWZvbGlvIHx8IGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcXG4tLVxcbm1tL21lbW9yeS5jPTgxOT1zdHJ1Y3QgcGFnZSAqdm1fbm9ybWFsX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbW9yeS5jLTgyOC0vKipcXG5tbS9tZW1vcnkuYzo4Mjk6ICogdm1fbm9ybWFsX2ZvbGlvKCkgLSBHZXQgdGhlIFxcXCJzdHJ1Y3QgZm9saW9cXFwiIGFzc29jaWF0ZWQgd2l0aCBhIFBURVxcbm1tL21lbW9yeS5jLTgzMC0gKiBAdm1hOiBUaGUgVk1BIG1hcHBpbmcgdGhlIEBwdGUuXFxuLS1cXG5tbS9tZW1vcnkuYy04MzktICovXFxubW0vbWVtb3J5LmM6ODQwOnN0cnVjdCBmb2xpbyAqdm1fbm9ybWFsX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxubW0vbWVtb3J5LmMtODQxLVxcdFxcdFxcdCAgICBwdGVfdCBwdGUpXFxuLS1cXG5tbS9tZW1vcnkuYz04NjM9c3RydWN0IHBhZ2UgKnZtX25vcm1hbF9wYWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbi0tXFxubW0vbWVtb3J5LmMtODcyLS8qKlxcbm1tL21lbW9yeS5jOjg3MzogKiB2bV9ub3JtYWxfZm9saW9fcG1kKCkgLSBHZXQgdGhlIFxcXCJzdHJ1Y3QgZm9saW9cXFwiIGFzc29jaWF0ZWQgd2l0aCBhIFBNRFxcbm1tL21lbW9yeS5jLTg3NC0gKiBAdm1hOiBUaGUgVk1BIG1hcHBpbmcgdGhlIEBwbWQuXFxuLS1cXG5tbS9tZW1vcnkuYy04ODMtICovXFxubW0vbWVtb3J5LmM6ODg0OnN0cnVjdCBmb2xpbyAqdm1fbm9ybWFsX2ZvbGlvX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5tbS9tZW1vcnkuYy04ODUtXFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90IHBtZClcXG4tLVxcbm1tL21lbW9yeS5jPTYyODQ9c3RhdGljIHZtX2ZhdWx0X3QgZG9fbnVtYV9wYWdlKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxcbi0tXFxubW0vbWVtb3J5LmMtNjMxOS1cXG5tbS9tZW1vcnkuYzo2MzIwOlxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgdm1mLVxcdTAwM2VhZGRyZXNzLCBwdGUpO1xcbm1tL21lbW9yeS5jLTYzMjEtXFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXFxuLS1cXG5tbS9tZW1wb2xpY3kuYz02ODc9c3RhdGljIGludCBxdWV1ZV9mb2xpb3NfcHRlX3JhbmdlKHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbXBvbGljeS5jLTcyMy1cXHRcXHR9XFxubW0vbWVtcG9saWN5LmM6NzI0OlxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xcbm1tL21lbXBvbGljeS5jLTcyNS1cXHRcXHRpZiAoIWZvbGlvIHx8IGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcXG4tLVxcbm1tL21lbXBvbGljeS5jLTcyOS1cXHRcXHQvKlxcbm1tL21lbXBvbGljeS5jOjczMDpcXHRcXHQgKiB2bV9ub3JtYWxfZm9saW8oKSBmaWx0ZXJzIG91dCB6ZXJvIHBhZ2VzLCBidXQgdGhlcmUgbWlnaHRcXG5tbS9tZW1wb2xpY3kuYy03MzEtXFx0XFx0ICogc3RpbGwgYmUgcmVzZXJ2ZWQgZm9saW9zIHRvIHNraXAsIHBlcmhhcHMgaW4gYSBWRFNPLlxcbi0tXFxubW0vbWxvY2suYz0zNTA9c3RhdGljIGludCBtbG9ja19wdGVfcmFuZ2UocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbi0tXFxubW0vbWxvY2suYy0zODctXFx0XFx0XFx0Y29udGludWU7XFxubW0vbWxvY2suYzozODg6XFx0XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGVudCk7XFxubW0vbWxvY2suYy0zODktXFx0XFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXFxuLS1cXG5tbS9tcmVtYXAuYz0xNzg9c3RhdGljIGludCBtcmVtYXBfZm9saW9fcHRlX2JhdGNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLS1cXG5tbS9tcmVtYXAuYy0xODktXFxubW0vbXJlbWFwLmM6MTkwOlxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlKTtcXG5tbS9tcmVtYXAuYy0xOTEtXFx0aWYgKCFmb2xpbyB8fCAhZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jPTEyODA9c3RhdGljIHN0cnVjdCBmb2xpbyAqY2hlY2tfcHRlc19mb3JfYmF0Y2hlZF9tb3ZlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqc3JjX3ZtYSxcXG4tLVxcbm1tL3VzZXJmYXVsdGZkLmMtMTI5NC1cXG5tbS91c2VyZmF1bHRmZC5jOjEyOTU6XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8oc3JjX3ZtYSwgc3JjX2FkZHIsIG9yaWdfc3JjX3B0ZSk7XFxubW0vdXNlcmZhdWx0ZmQuYy0xMjk2LVxcdGlmICghZm9saW8gfHwgIWZvbGlvX3RyeWxvY2soZm9saW8pKVxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYz0xNTAzPXN0YXRpYyBsb25nIG1vdmVfcGFnZXNfcHRlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKmRzdF9wbWQsIHBtZF90ICpzcmNfcG1kLFxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYy0xNjE5LVxcbm1tL3VzZXJmYXVsdGZkLmM6MTYyMDpcXHRcXHRcXHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyhzcmNfdm1hLCBzcmNfYWRkciwgb3JpZ19zcmNfcHRlKTtcXG5tbS91c2VyZmF1bHRmZC5jLTE2MjEtXFx0XFx0XFx0aWYgKCFmb2xpbyB8fCAhUGFnZUFub25FeGNsdXNpdmUoXFx1MDAyNmZvbGlvLVxcdTAwM2VwYWdlKSkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTo0MDo1NC4xMzg1MzQ0MVoiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0OTY4ODQ3NjY1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGZyb20gbXkgcGVyc3BlY3RpdmUgYXMgc29tZW9uZSB3ZWxsLXZlcnNlZCBpbiBtZW1vcnkgbWFuYWdlbWVudDpcblxuKipEaWdnaW5nIGludG8gYHZtX25vcm1hbF9mb2xpbygpYCoqXG5cblJpZ2h0LCBzbyBgdm1fbm9ybWFsX2ZvbGlvKClgIGlzIGVzc2VudGlhbGx5IGEgY29udmVuaWVuY2UgZnVuY3Rpb24sIGEgd3JhcHBlciwgaXNuJ3QgaXQ/IEl0IGFwcGVhcnMgdG8gYmUgbm90aGluZyBtb3JlIHRoYW4gYSBzaW1wbGlmaWVkIHdheSB0byBvYnRhaW4gYSBmb2xpbyBiYXNlZCBvbiBhIG5vcm1hbCBwYWdlLCBzcGVjaWZpY2FsbHkgYnkgY2FsbGluZyBgcGFnZV9mb2xpbyh2bV9ub3JtYWxfcGFnZSgpKWAuIFRoYXQncyB0aGUgY29yZSBvZiBpdHMgZnVuY3Rpb25hbGl0eS5cblxuVGhlIGltcGxpY2F0aW9uIGlzIHRoYXQgaXQgaGVscHMgdG8gcmVkdWNlIHJlcGV0aXRpb24uIElmIGEgbG90IG9mIGNvZGUgbmVlZHMgdG8gb3BlcmF0ZSBvbiB0aGUgZm9saW8gb2YgYSBub3JtYWwgcGFnZSwgdGhpcyBmdW5jdGlvbiBqdXN0IHByb3ZpZGVzIGEgc2hvcnRoYW5kIG1ldGhvZC4gVGhlIGRldGFpbHMgYXJlIGFic3RyYWN0ZWQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdCBuZWVkIHRvIHJlcGVhdGVkbHkgY2FsbCBgcGFnZV9mb2xpbyh2bV9ub3JtYWxfcGFnZSgpKWAuXG5cbkxldCdzIGRlbHZlIGRlZXBlciBhbmQgY29uZmlybSB0aGF0IGJ5IGV4YW1pbmluZyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYHZtX25vcm1hbF9mb2xpbygpYCBpdHNlbGYuIFdlIGNhbiBjb25maXJtIHdoZXRoZXIgaXQgaXMgYWN0dWFsbHkganVzdCBhIHNpbXBsZSB3cmFwcGVyIGZ1bmN0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMDg5MiwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQwOjU5LjEwNzM4NTAyNVoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMzgyNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtb3J5LmNcIixcbiAgXCJGaXJzdExpbmVcIjogODM5LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgODM5OlxcdCAqL1xcbiA4NDA6XFx0c3RydWN0IGZvbGlvICp2bV9ub3JtYWxfZm9saW8oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4gODQxOlxcdFxcdFxcdFxcdCAgICBwdGVfdCBwdGUpXFxuIDg0MjpcXHR7XFxuIDg0MzpcXHRcXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRlKTtcXG4gODQ0OlxcdFxcbiA4NDU6XFx0XFx0aWYgKHBhZ2UpXFxuIDg0NjpcXHRcXHRcXHRyZXR1cm4gcGFnZV9mb2xpbyhwYWdlKTtcXG4gODQ3OlxcdFxcdHJldHVybiBOVUxMO1xcbiA4NDg6XFx0fVxcbiA4NDk6XFx0XFxuIDg1MDpcXHQjaWZkZWYgQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTXFxuIDg1MTpcXHQvKipcXG4gODUyOlxcdCAqIHZtX25vcm1hbF9wYWdlX3BtZCgpIC0gR2V0IHRoZSBcXFwic3RydWN0IHBhZ2VcXFwiIGFzc29jaWF0ZWQgd2l0aCBhIFBNRFxcbiA4NTM6XFx0ICogQHZtYTogVGhlIFZNQSBtYXBwaW5nIHRoZSBAcG1kLlxcbiA4NTQ6XFx0ICogQGFkZHI6IFRoZSBhZGRyZXNzIHdoZXJlIHRoZSBAcG1kIGlzIG1hcHBlZC5cXG4gODU1OlxcdCAqIEBwbWQ6IFRoZSBQTUQuXFxuIDg1NjpcXHQgKlxcbiA4NTc6XFx0ICogR2V0IHRoZSBcXFwic3RydWN0IHBhZ2VcXFwiIGFzc29jaWF0ZWQgd2l0aCBhIFBURS4gU2VlIF9fdm1fbm9ybWFsX3BhZ2UoKVxcbiA4NTg6XFx0ICogZm9yIGRldGFpbHMgb24gXFxcIm5vcm1hbFxcXCIgYW5kIFxcXCJzcGVjaWFsXFxcIiBtYXBwaW5ncy5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDA6NTkuMTA3NjI0OTU1WiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjExOTc4MjM1NTEzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIFBvdGVudGlhbCBLaHVnZXBhZ2VkIFdhcm5pbmcgQ29uZGl0aW9uKipcblxuT2theSwgc28gSSd2ZSBiZWVuIGxvb2tpbmcgYXQgdGhpcyBjb2RlIGFuZCBpdCBsb29rcyBsaWtlIGEgc3VidGxlIGNoYW5nZSBoYXMgYmVlbiBpbnRyb2R1Y2VkOiB0aGF0IGluIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCwgdGhlcmUncyBhIG5ldyBgVk1fV0FSTl9PTl9GT0xJT2AgY2FsbC4gUHJldmlvdXNseSwgaXQgc2ltcGx5IHJldHVybmVkIGBTQ0FOX1BBR0VfQU5PTmAuIFRoZSBxdWVzdGlvbiBpcywgY2FuIHdlIHRyaWdnZXIgdGhpcyB3YXJuaW5nP1xuXG5NeSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCBpdCdzIHJlbGF0ZWQgdG8ga2h1Z2VwYWdlZCBhdHRlbXB0aW5nIHRvIHNjYW4gYSBub24tYW5vbnltb3VzIHBhZ2Ugd2l0aGluIHdoYXQgaXQgKnRoaW5rcyogaXMgYW4gYW5vbnltb3VzIFZNQS4gVGhlIGNvZGUgcGF0aCBpbmNsdWRlcyBhIGNoZWNrIGAhZm9saW9fdGVzdF9hbm9uKGN0eC1cdTAwM2Vmb2xpbylgLiBTbywgdGhlIGNydXggb2YgdGhlIHByb2JsZW0gbGllcyBpbiB0aGUgcG9zc2liaWxpdHkgb2YgbWFwcGluZyBhIG5vbi1hbm9ueW1vdXMgcGFnZSAqaW50byogYW4gYW5vbnltb3VzIFZNQS5cblxuTXkgZmlyc3QgaW50dWl0aW9uIGlzIHRoYXQgYHZtX2luc2VydF9wYWdlKClgIGlzIHRoZSBrZXkuIERyaXZlcnMgb2Z0ZW4gdXNlIHRoaXMsIGJ1dCB0eXBpY2FsbHkgd2l0aGluICp0aGVpciogc3BlY2lmaWMgVk1Bcywgd2hpY2ggYXJlbid0IGFub255bW91cy4gQ291bGQgYSB1c2VyIHNvbWVob3cgbGV2ZXJhZ2UgYHZtX2luc2VydF9wYWdlKClgIG9uIGEgYE1BUF9BTk9OWU1PVVNgLWNyZWF0ZWQgVk1BPyBEcml2ZXJzIHR5cGljYWxseSBoYW5kbGUgYHZtX2luc2VydF9wYWdlKClgIGluIHRoZWlyIGBtbWFwYCBoYW5kbGVyLCB3aGVyZSB0aGUgVk1BJ3MgYWxyZWFkeSBzZXQgdXAuIFNvLCB0aGlzIHdvdWxkbid0IG5vcm1hbGx5IGhhcHBlbi5cblxuSSdtIHJ1bGluZyBvdXQgYSBmZXcgcG90ZW50aWFsIGF2ZW51ZXM6IGBPX0RJUkVDVGAgcmVhZHMgaW50byBhbm9ueW1vdXMgbWVtb3J5LCBidXQgdGhlIHBhZ2VzIHRoZW1zZWx2ZXMgYXJlIHN0aWxsIGFub255bW91cy4gYHZtc3BsaWNlYCBtYXBzIHVzZXIgbWVtb3J5IHRvIGEgcGlwZSBidXQgZG9lc24ndCBjaGFuZ2UgYW5vbnltaXR5LiBgbXJlbWFwYCBjYW4gbW92ZSBhIFZNQSwgYnV0IGl0IGRvZXNuJ3QgdG91Y2ggdGhlIGFub24gc3RhdHVzLiBgdXNlcmZhdWx0ZmRgJ3MgYFVGRkRJT19DT1BZYCB1c2VzIGFub24gcGFnZXMsIGFuZCBgVUZGRElPX0NPTlRJTlVFYCBpcyBmb3Igc2htZW0vaHVnZXRsYi4gS1NNIHBhZ2VzIGFyZSBhbHdheXMgYW5vbnltb3VzLCBhcyBhcmUgemVybyBwYWdlcy5cblxuVGhlbiBJIHBhdXNlZCB0byB0aGluayBhYm91dCBgcmVtYXBfcGZuX3JhbmdlYCDigJMgSSdtIHByZXR0eSBzdXJlIGl0IG1hcHMgaW50byBQRk5NQVAgcmVnaW9ucywgYW5kIHRodXMgYHZtX25vcm1hbF9mb2xpbygpYCB3aWxsIHJldHVybiBOVUxMLiBBbHNvIGB2bV9pbnNlcnRfcGFnZWAgY291bGQgc2V0IG1peGVkIG1hcCwgYnV0IHRoZSBwYWdlIGl0c2VsZiBpcyBzdGlsbCB0aGUgY29ycmVjdCBvbmUuXG5cblNvIHRoZSBjaGFsbGVuZ2UgaXMgdG8gZmluZCBhIHdheSB0byBnZXQgYSBkcml2ZXIgdG8gY2FsbCBgdm1faW5zZXJ0X3BhZ2UoKWAgb24gYSBWTUEgY3JlYXRlZCB2aWEgYG1tYXAoTUFQX0FOT05ZTU9VUylgLiBXaGF0IGNhbiB0cmlnZ2VyIHRoaXM/IGB1cHJvYmVgIGluc2VydHMgYSBicmVha3BvaW50IHBhZ2UsIGlzIHRoYXQgYW5vbj8gQW5kIHRoZW4gdGhlcmUncyBgeG9sX2FkZF92bWEoKWAgY3JlYXRlcyBhIHNwZWNpYWwgVk1BLiBQdHJhY2UgdXNlcyBgZ2V0X3VzZXJfcGFnZXMoKWAuIGBtYWR2aXNlKE1BRFZfRlJFRSlgIGtlZXBzIGl0IGFub24sIGBNQURWX0hXUE9JU09OYCBwb2lzb25zLiBJIGNvbnNpZGVyIE9fRElSRUNUIHdpdGggR1VQLiBUaGVuIHRoZSB0aG91Z2h0IHRvIGNvbnNpZGVyIGlmIGtodWdlcGFnZWQgc2NhbnMgYSBmaWxlIFZNQS5cblxuV2FpdCwgdGhlIGtleSBpcyB0aGUgc2NhbiBwYXRoISBJIHJlYWxpemVkIGBraHVnZXBhZ2VkYCBzY2FucyBmaWxlIFZNQXMgdmlhIGBjb2xsYXBzZV9zY2FuX2ZpbGUoKWAsIG5vdCBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAuIFNvIHRoZSBwcm9ibGVtIEkgd2FzIHRoaW5raW5nIGFib3V0IG1pZ2h0IG5vdCBiZSBwb3NzaWJsZS4gSG93ZXZlciwgaXMgdGhhdCBzdGF0ZW1lbnQgY29ycmVjdD8gVGltZSB0byBnbyBiYWNrIHRvIHRoZSBjb2RlIGFuZCBjaGVjayBga2h1Z2VwYWdlZF9zY2FuX3BtZCgpYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzE0OTksIk91dHB1dFRva2VucyI6MjMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3ODksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTo0MToxMS4wODU4NjMzODhaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3MzUyNDI0MDYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia2h1Z2VwYWdlZF9zY2FuX3BtZFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oPTQ5PVNDQU5fU1RBVFVTXFxuLS1cXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTU1LVxcbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5Lmg6NTY6VFJBQ0VfRVZFTlQobW1fa2h1Z2VwYWdlZF9zY2FuX3BtZCxcXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTU3LVxcbi0tXFxua2VybmVsL2JwZi9idGYuYz02NjU2PXN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX3Jhd190cF9udWxsX2FyZ3MgcmF3X3RwX251bGxfYXJnc1tdID0ge1xcbi0tXFxua2VybmVsL2JwZi9idGYuYy02NzA1LVxcdC8qIGh1Z2VfbWVtb3J5ICovXFxua2VybmVsL2JwZi9idGYuYzo2NzA2OlxcdHsgXFxcIm1tX2todWdlcGFnZWRfc2Nhbl9wbWRcXFwiLCAweDEwIH0sXFxua2VybmVsL2JwZi9idGYuYy02NzA3LVxcdHsgXFxcIm1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlXFxcIiwgMHgxIH0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTY4OT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xODEzLW91dDpcXG5tbS9raHVnZXBhZ2VkLmM6MTgxNDpcXHR0cmFjZV9tbV9raHVnZXBhZ2VkX3NjYW5fcG1kKG1tLCBmb2xpbywgcmVmZXJlbmNlZCxcXG5tbS9raHVnZXBhZ2VkLmMtMTgxNS1cXHRcXHRcXHRcXHQgICAgIGN0eC5ub25lX29yX3plcm8sIHJlc3VsdCwgY3R4LnVubWFwcGVkKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDE6MTIuODIxMTEyMTE0WiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMzMDA2MDMwNjMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIHNlZS4uLlxuXG4qKklkZW50aWZ5aW5nIGEgQ29kZSBDaGFuZ2UqKlxuXG5XYWl0IGEgbWludXRlLCAqa2h1Z2VwYWdlZF9zY2FuX3BtZCgpKiBoYXMgYmVlbiByZW5hbWVkIHRvICpjb2xsYXBzZV9zY2FuX3BtZCgpKj8gVGhhdCdzIGEgc2lnbmlmaWNhbnQgY2hhbmdlLCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGF0LiBMZXQncyB0cmFjZSB0aGlzIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGNvZGUgZm9yIGEgYml0LiBOZWVkIHRvIGNoZWNrIHdoYXQgKmtodWdlcGFnZWRfc2Nhbl9wbWQqIHVzZWQgdG8gZG8uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMzMzM1LCJPdXRwdXRUb2tlbnMiOjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDE6MTYuMTIxNzE3MzQ3WiIsIlNlcSI6MjIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTI4MDM2NTcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtodWdlcGFnZWRfc2Nhbl9wbWRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaD00OT1TQ0FOX1NUQVRVU1xcbi0tXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC01NS1cXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oOjU2OlRSQUNFX0VWRU5UKG1tX2todWdlcGFnZWRfc2Nhbl9wbWQsXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC01Ny1cXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NjY1Nj1zdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9yYXdfdHBfbnVsbF9hcmdzIHJhd190cF9udWxsX2FyZ3NbXSA9IHtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjcwNS1cXHQvKiBodWdlX21lbW9yeSAqL1xcbmtlcm5lbC9icGYvYnRmLmM6NjcwNjpcXHR7IFxcXCJtbV9raHVnZXBhZ2VkX3NjYW5fcG1kXFxcIiwgMHgxMCB9LFxcbmtlcm5lbC9icGYvYnRmLmMtNjcwNy1cXHR7IFxcXCJtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZVxcXCIsIDB4MSB9LFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTE2ODk9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTgxMy1vdXQ6XFxubW0va2h1Z2VwYWdlZC5jOjE4MTQ6XFx0dHJhY2VfbW1fa2h1Z2VwYWdlZF9zY2FuX3BtZChtbSwgZm9saW8sIHJlZmVyZW5jZWQsXFxubW0va2h1Z2VwYWdlZC5jLTE4MTUtXFx0XFx0XFx0XFx0ICAgICBjdHgubm9uZV9vcl96ZXJvLCByZXN1bHQsIGN0eC51bm1hcHBlZCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQxOjE3LjY0OTc1ODI3N1oiLCJTZXEiOjIzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNTg5NzMyNTMzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aG9zZSB0aG91Z2h0cyBmcm9tIGEgZmlyc3QtcGVyc29uLCBleHBlcnQgcGVyc3BlY3RpdmUsIGFpbWluZyBmb3IgYSBmdWxzb21lIHJlbmRlcmluZzpcblxuKipJbnZlc3RpZ2F0aW5nIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCoqXG5cblJpZ2h0LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgaGFwcGVuaW5nIHdpdGggdGhpcyBwYXJ0aWN1bGFyIGZ1bmN0aW9uLCBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAuIFRoYXQncyB0aGUga2V5LiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgd2hlcmUgaXMgdGhpcyBmdW5jdGlvbiBhY3R1YWxseSAqdXNlZCo/IFRoYXQncyB0aGUgbW9zdCBjcnVjaWFsIHBpZWNlIG9mIGluZm9ybWF0aW9uIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUgd2l0aGluIHRoZSBicm9hZGVyIHN5c3RlbS4gSSBuZWVkIHRvIHRyYWNlIGl0cyBjYWxsIHNpdGVzLCBzZWUgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQncyBiZWluZyBpbnZva2VkLiBLbm93aW5nIHRoZSBjYWxsaW5nIGZ1bmN0aW9ucyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBkYXRhIHN0cnVjdHVyZXMgd2lsbCBnaXZlIG1lIHRoZSBjcnVjaWFsIGNvbnRleHQgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hhdCBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgaXMgc3VwcG9zZWQgdG8gYWNoaWV2ZS4gSXTigJlzIHRoZSB1c3VhbCBkZWJ1Z2dpbmcgcHJvY2VzczogdW5kZXJzdGFuZCB0aGUgd2hlcmUgYmVmb3JlIHRoZSB3aHkuIEkga25vdyB3aGVyZSB0byBzdGFydCB0aG91Z2guIFRpbWUgdG8gaHVudCBkb3duIHRob3NlIGNhbGxzIVxuXG5cbiIsIklucHV0VG9rZW5zIjozMzg1MCwiT3V0cHV0VG9rZW5zIjoyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQxOjIxLjIzOTQ5Mjk2WiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTcyNjY1OTg3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbGxhcHNlX3NjYW5fcG1kXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2todWdlcGFnZWQuYz0xMjI0PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNoZWNrX3BtZF9zdGlsbF92YWxpZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMjM4LSAqIEJyaW5nIG1pc3NpbmcgcGFnZXMgaW4gZnJvbSBzd2FwLCB0byBjb21wbGV0ZSBUSFAgY29sbGFwc2UuXFxubW0va2h1Z2VwYWdlZC5jOjEyMzk6ICogT25seSBkb25lIGlmIGNvbGxhcHNlX3NjYW5fcG1kKCkgYmVsaWV2ZXMgaXQgaXMgd29ydGh3aGlsZS5cXG5tbS9raHVnZXBhZ2VkLmMtMTI0MC0gKlxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTE1NjI9c3RhdGljIHVuc2lnbmVkIGludCBtYXhfb3JkZXJfZnJvbV9vZmZzZXQodW5zaWduZWQgaW50IG9mZnNldClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNTcxLSAqIG10aHBfY29sbGFwc2UoKSBjb25zdW1lcyB0aGUgYml0bWFwIHRoYXQgaXMgZ2VuZXJhdGVkIGR1cmluZ1xcbm1tL2todWdlcGFnZWQuYzoxNTcyOiAqIGNvbGxhcHNlX3NjYW5fcG1kKCkgdG8gZGV0ZXJtaW5lIHdoYXQgcmVnaW9ucyBhbmQgbVRIUCBvcmRlcnMgZml0IGJlc3QuXFxubW0va2h1Z2VwYWdlZC5jLTE1NzMtICpcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0xNTg3PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IG10aHBfY29sbGFwc2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTY4OC1cXG5tbS9raHVnZXBhZ2VkLmM6MTY4OTpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG5tbS9raHVnZXBhZ2VkLmMtMTY5MC1cXHRcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTI4MTE9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2luZ2xlX3BtZCh1bnNpZ25lZCBsb25nIGFkZHIsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMjgyMy1cXHRpZiAodm1hX2lzX2Fub255bW91cyh2bWEpKSB7XFxubW0va2h1Z2VwYWdlZC5jOjI4MjQ6XFx0XFx0cmVzdWx0ID0gY29sbGFwc2Vfc2Nhbl9wbWQobW0sIHZtYSwgYWRkciwgbG9ja19kcm9wcGVkLCBjYyk7XFxubW0va2h1Z2VwYWdlZC5jLTI4MjUtXFx0XFx0Z290byBlbmQ7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQxOjIyLjgxMjE2NTg5N1oiLCJTZXEiOjI1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMzM3NDAyMzAxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhpbmtpbmcgaXQ6XG5cbioqRm9jdXNpbmcgb24gYGNvbGxhcHNlX3NpbmdsZV9wbWQoKWAqKlxuXG5SaWdodCwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBjb2RlLCBhbmQgdGhlIGNvbnRleHQgaXMgdGhhdCB0aGUgZnVuY3Rpb24gaW4gcXVlc3Rpb24gaGVyZSBpcyBgY29sbGFwc2Vfc2luZ2xlX3BtZCgpYC4gVGhhdCdzIHRoZSBrZXkuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhpcyBmdW5jdGlvbiBpcyBkb2luZyBhbmQgd2hlcmUgaXQncyBjYWxsZWQgZnJvbS4gVGhhdCdzIG15IHN0YXJ0aW5nIHBvaW50LiBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgc2lnbmlmaWNhbmNlIG9mIHRoaXMgc3BlY2lmaWMgZnVuY3Rpb24uIElzIGl0IGEgY29yZSBjb21wb25lbnQ/IElzIGl0IHVzZWQgZnJlcXVlbnRseT8gV2hhdCBhcmUgdGhlIGlucHV0cz8gV2hhdCBhcmUgdGhlIG91dHB1dHM/IEdvdHRhIGRyaWxsIGRvd24gaW50byB0aGUgZGV0YWlscyBvZiAqdGhpcyogcGFydGljdWxhciBmdW5jdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MzQ1NTYsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTo0MToyNi4xNDk1NzAwODhaIiwiU2VxIjoyNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1NTcxMDczNTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29sbGFwc2Vfc2luZ2xlX3BtZFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9raHVnZXBhZ2VkLmM9MjcwMT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMjgxMC0gKi9cXG5tbS9raHVnZXBhZ2VkLmM6MjgxMTpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zaW5nbGVfcG1kKHVuc2lnbmVkIGxvbmcgYWRkcixcXG5tbS9raHVnZXBhZ2VkLmMtMjgxMi1cXHRcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgYm9vbCAqbG9ja19kcm9wcGVkLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTI4Njg9c3RhdGljIHZvaWQgY29sbGFwc2Vfc2Nhbl9tbV9zbG90KHVuc2lnbmVkIGludCBwcm9ncmVzc19tYXgsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMjkzOC1cXG5tbS9raHVnZXBhZ2VkLmM6MjkzOTpcXHRcXHRcXHQqcmVzdWx0ID0gY29sbGFwc2Vfc2luZ2xlX3BtZChraHVnZXBhZ2VkX3NjYW4uYWRkcmVzcyxcXG5tbS9raHVnZXBhZ2VkLmMtMjk0MC1cXHRcXHRcXHRcXHRcXHRcXHQgICAgICB2bWEsIFxcdTAwMjZsb2NrX2Ryb3BwZWQsIGNjKTtcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0zMjA5PWludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMyNTctXFxubW0va2h1Z2VwYWdlZC5jOjMyNTg6XFx0XFx0cmVzdWx0ID0gY29sbGFwc2Vfc2luZ2xlX3BtZChhZGRyLCB2bWEsIFxcdTAwMjZtbWFwX3VubG9ja2VkLCBjYyk7XFxubW0va2h1Z2VwYWdlZC5jLTMyNTktXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQxOjI3LjcwNjY4MjY2NloiLCJTZXEiOjI3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NTA5NDQ2MTg0OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipSZWZsZWN0aW5nIG9uIHRoZSBDaGFuZ2VzIHRvIEFub255bW91cyBWTUEgSGFuZGxpbmcqKlxuXG5Pa2F5LCBzbyBJJ20gZGl2aW5nIGludG8gdGhpcyBwYXRjaCB0aGF0IHNlZW1zIHRvIGJlIGFib3V0IHJlZmFjdG9yaW5nIHNvbWUgY29kZSByZWxhdGVkIHRvIGNvbGxhcHNpbmcgaHVnZSBwYWdlcywgc3BlY2lmaWNhbGx5IGluIHRoZSBjb250ZXh0IG9mIGFub255bW91cyBWTUFzLiBJbml0aWFsbHksIGl0IGxvb2tlZCBsaWtlIGEgc2ltcGxlIGNsZWFuLXVwLCBidXQgdGhlIG1vcmUgSSBkaWcsIHRoZSBtb3JlIEkgcmVhbGl6ZSBpdCBoYXMgZnVuY3Rpb25hbCBpbXBsaWNhdGlvbnMuXG5cblRoZSBjb3JlIG9mIHRoZSBwYXRjaCByZXZvbHZlcyBhcm91bmQgdGhpcyBgY29sbGFwc2VfY2hlY2tfcHRlKClgIGZ1bmN0aW9uLiBJdCdzIGVzc2VudGlhbGx5IGV4dHJhY3RpbmcgdGhlIGxvZ2ljIGZvciBjaGVja2luZyBwYWdlIHRhYmxlIGVudHJpZXMgdGhhdCB3YXMgcHJldmlvdXNseSBkdXBsaWNhdGVkIGluIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAuIFRoZSBwcmltYXJ5IGZvY3VzIGFwcGVhcnMgdG8gYmUgb24gY29uZmlybWluZyBpZiBwYWdlcyB3aXRoaW4gdGhlIHZpcnR1YWwgbWVtb3J5IGFyZWEgYXJlIGFjdHVhbGx5IGFub255bW91cywgd2hpY2ggaXMgY3JpdGljYWwgZm9yIHByb3BlciBjb2xsYXBzZSBiZWhhdmlvci5cblxuSW5pdGlhbGx5LCBJIHBvbmRlcmVkOiBJcyBpdCBldmVuICpwb3NzaWJsZSogdG8gaGF2ZSBhIG5vbi1hbm9ueW1vdXMgcGFnZSB3aXRoaW4gYW4gYW5vbnltb3VzIFZNQT8gSSBzdGFydGVkIHJ1bm5pbmcgdGhyb3VnaCB0aGUgd2F5cyBhIHVzZXIgbWlnaHQgdHJ5IHRvIHNuZWFrIGEgbm9uLWFub24gcGFnZSBpbi4gYG1tYXAoTUFQX0FOT05ZTU9VUylgIGZvbGxvd2VkIGJ5IGB2bXNwbGljZWAsIGBtcmVtYXBgLCBgdXNlcmZhdWx0ZmRgLCBhbGwga2luZHMgb2YgbWFkdmlzZSBjYWxscywgYGlvX3VyaW5nYCwgYGJwZmAuLi4gaXQgc2VlbWVkIHVubGlrZWx5LCBib3JkZXJpbmcgb24gaW1wb3NzaWJsZSwgd2l0aG91dCBhIHJhdGhlciBzZXJpb3VzIGtlcm5lbCBidWcuIEl0IHNlZW1zIHRoYXQgYC9kZXYvemVyb2AgaXMgZXF1aXZhbGVudCB0byB1c2luZyBgTUFQX0FOT05ZTU9VU2AsIHNvIGV2ZW4gdGhhdCBkb2Vzbid0IGNoYW5nZSBhbnl0aGluZy5cblxuSG93ZXZlciwgdGhlIGNoYW5nZSBmcm9tIGBWTV9CVUdfT05fRk9MSU9gIHRvIGBWTV9XQVJOX09OX0ZPTElPYCB3aGVuIGEgbm9uLWFub255bW91cyBmb2xpbyBpcyBlbmNvdW50ZXJlZCBpcyB0aGUga2V5IGhlcmUuIEluIHRoZSBvbGQgY29kZSwgdGhpcyB3b3VsZCBoYXZlIHRyaWdnZXJlZCBhIGtlcm5lbCBwYW5pYy4gV2l0aCB0aGUgcGF0Y2gsIHRoZSBzeXN0ZW0gbm93ICp3YXJucyogYW5kIGNvbnRpbnVlcy4gVGhpcyBpcyB0aGUgY3JpdGljYWwgY2hhbmdlLiBBbmQgdGhhdCB3YXJuaW5nIGFwcGxpZXMgdG8gYGNvbGxhcHNlX3NjYW5fcG1kKClgIGFzIHdlbGwuXG5cblRoZSBpbnRlcmVzdGluZyBxdWVzdGlvbiBpcyB0aGVuOiAqQ2FuKiB0aGlzIHdhcm5pbmcgZXZlciBiZSB0cmlnZ2VyZWQ/IFRoZSBjb2RlIGFwcGVhcnMgdG8gYmUgZGVzaWduZWQgdG8gcHJldmVudCB0aGlzIHNpdHVhdGlvbi4gSXQncyBhIGRlZmVuc2l2ZSBjaGVjaywgYW4gZXh0cmEgbGF5ZXIgb2Ygc2FuaXR5LiBZZXQsIHRoZSBwYXRjaCBpcyBmcm9tIHN5ei1jbHVzdGVyLCB3aGljaCBtaWdodCBtZWFuIHRoYXQgdGhpcyBjb25kaXRpb24gaXMsIGluIGZhY3QsIHJlYWNoYWJsZSBpbiBzb21lIHdlaXJkIGNvcm5lciBjYXNlLlxuXG5UaGUgdnVsbmVyYWJpbGl0eSBjb21lcyBmcm9tIHRoZSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24uICBUaGUgbW1hcF9sb2NrIGlzIGRyb3BwZWQgYmV0d2VlbiB0aGUgc2NhbiBhbmQgdGhlIGNvbGxhcHNlIGF0dGVtcHQuIEFub3RoZXIgdGhyZWFkIG1pZ2h0IGNoYW5nZSB0aGUgbWFwcGluZ3MuIEhvd2V2ZXIsIHRoZSByZXZhbGlkYXRpb24gc3RlcCBpbiBgY29sbGFwc2VfaHVnZV9wYWdlKClgIHNlZW1zIHRvIGhhbmRsZSB0aGF0IGJ5IGNhbGxpbmcgYGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKClgLlxuXG5TbywgaXQgc2VlbXMgdGhhdCBpZiBhIHVzZXIgKmNvdWxkKiBzb21laG93IG1hcCBhIG5vbi1hbm9ueW1vdXMgcGFnZSBpbnRvIGFuIGFub255bW91cyBWTUEgKHBlcmhhcHMgdGhyb3VnaCBhIGNvbXBsZXggcmFjZSBjb25kaXRpb24sIGEgZGV2aWNlIGRyaXZlciB3aXRoIGEgZG9kZ3kgaW9jdGwsIG9yIGEgc3VidGxlIGludGVyYWN0aW9uIHdpdGggYSBuZXcga2VybmVsIGZlYXR1cmUpLCB0aGUgb2xkIGNvZGUgd291bGQgaGF2ZSBwYW5pY2tlZC4gVGhpcyBwYXRjaCByZXBsYWNlcyB0aGF0IHdpdGggYSB3YXJuaW5nIGFuZCBhIGdyYWNlZnVsIGZhbGxiYWNrLiBUaGlzIG5vdyBvZmZlcnMgc3l6a2FsbGVyIGEgd2F5IHRvIHRlc3QgZm9yIHRob3NlIGNvbmRpdGlvbnMgYW5kIHBvdGVudGlhbGx5IGV4cG9zZSBhIHN1YnRsZSBidWcsIGV2ZW4gaWYgSSdtIG5vdCBlbnRpcmVseSBjb252aW5jZWQgc3VjaCBhIHNjZW5hcmlvIGlzIGVhc2lseSBhY2hpZXZhYmxlLiBJJ2xsIG5lZWQgdG8gZ28gc2VhcmNoIGZvciBgU0NBTl9QQUdFX0FOT05gIGluIHRoZSBrZXJuZWwgdG8gc2VlIGlmIHRoZXJlIGlzIGhpc3Rvcnkgb24gdGhpcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MzUwNzksIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MzA0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQyOjEyLjgwMTE0ODAyNFoiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjgxMTA1NTE5NCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJTQ0FOX1BBR0VfQU5PTlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTI2LVxcdEVNKCBTQ0FOX1BBR0VfTE9DSyxcXHRcXHRcXFwicGFnZV9sb2NrZWRcXFwiKVxcdFxcdFxcdFxcXFxcXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oOjI3OlxcdEVNKCBTQ0FOX1BBR0VfQU5PTixcXHRcXHRcXFwicGFnZV9ub3RfYW5vblxcXCIpXFx0XFx0XFxcXFxcbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgtMjgtXFx0RU0oIFNDQU5fUEFHRV9MQVpZRlJFRSxcXHRcXHRcXFwicGFnZV9sYXp5ZnJlZVxcXCIpXFx0XFx0XFxcXFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTMzPWVudW0gc2Nhbl9yZXN1bHQge1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTQ5LVxcdFNDQU5fUEFHRV9MT0NLLFxcbm1tL2todWdlcGFnZWQuYzo1MDpcXHRTQ0FOX1BBR0VfQU5PTixcXG5tbS9raHVnZXBhZ2VkLmMtNTEtXFx0U0NBTl9QQUdFX0xBWllGUkVFLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTc0Nz1zdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGVfdCBwdGV2YWwsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtNzkyLVxcdFxcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihjdHgtXFx1MDAzZWZvbGlvKSwgY3R4LVxcdTAwM2Vmb2xpbyk7XFxubW0va2h1Z2VwYWdlZC5jOjc5MzpcXHRcXHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfQU5PTik7XFxubW0va2h1Z2VwYWdlZC5jLTc5NC1cXHR9XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTE1Mz1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTExODYtXFx0aWYgKGV4cGVjdF9hbm9uIFxcdTAwMjZcXHUwMDI2ICghKCp2bWFwKS1cXHUwMDNlYW5vbl92bWEgfHwgIXZtYV9pc19hbm9ueW1vdXMoKnZtYXApKSlcXG5tbS9raHVnZXBhZ2VkLmM6MTE4NzpcXHRcXHRyZXR1cm4gU0NBTl9QQUdFX0FOT047XFxubW0va2h1Z2VwYWdlZC5jLTExODgtXFx0cmV0dXJuIFNDQU5fU1VDQ0VFRDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDI6MTUuNjEyMjA3NjU5WiIsIlNlcSI6MjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQzMTIzMjk0ODMwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlJlZmFjdG9yaW5nIEFuYWx5c2lzIG9mIGtodWdlcGFnZWQuYyBQYXRjaCoqXG5cbk9rYXksIHNvIEkndmUgYmVlbiBzdGFyaW5nIGF0IHRoaXMgcGF0Y2gsIGFuZCBteSBpbml0aWFsIHRob3VnaHQgd2FzLCBcIklzIHRoaXMganVzdCBhIHJlZmFjdG9yaW5nLCBvciBhcmUgd2UgbG9va2luZyBhdCBhIGJ1ZyB3YWl0aW5nIHRvIGhhcHBlbj9cIiBgU0NBTl9QQUdFX0FOT05gIGlzIGZsYWdnZWQgaW4gYGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKClgLCBidXQgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBpcyB3aGVyZSBpdCdzIHNwZWNpZmljYWxseSByZXR1cm5lZCBmb3IgYSBwYWdlLiBTbywgaWYgdGhhdCB3YXJuaW5nIHRyaWdnZXJzLCBpdCdzIGEgYnVnLCByaWdodD9cblxuQWZ0ZXIgZGlnZ2luZyBpbiwgaXQgKnNlZW1zKiBsaWtlIGEgcHVyZSByZWZhY3RvcmluZyB0aGF0IGNvbnNvbGlkYXRlcyBQVEUgY2hlY2tpbmcgbG9naWMgdXNpbmcgYSBoZWxwZXIgZnVuY3Rpb24sIGBjb2xsYXBzZV9jaGVja19wdGUoKWAsIGJldHdlZW4gYGNvbGxhcHNlX3NjYW5fcG1kKClgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYC4gVGhlIHVwc2hvdCBpcyB0aGUgbWVyZ2luZyBvZiBhIGBWTV9CVUdfT05fRk9MSU9gIHdpdGggYSBzaWxlbnQgcmV0dXJuIGludG8gYSBzaW5nbGUgYFZNX1dBUk5fT05fRk9MSU9gICsgcmV0dXJuLCB3aGljaCwgb24gdGhlIGZhY2Ugb2YgaXQsIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UsIGJ1dCBhcyBhIHNpZGUgZWZmZWN0LlxuXG5NeSBleHBlcnQgZ3V0IHRlbGxzIG1lIHRoaXMgY291bGQgYmUgYSBtaW5lZmllbGQgZm9yIGJ1Z3MsIGV2ZW4gaWYgc2VlbWluZ2x5IG1pbm9yLiBSZWZhY3RvcmluZyBjb3JlIE1NIGNvZGUgbGlrZSB0aGlzPyBSaXNreSBidXNpbmVzcy4gSXTigJlzIHdvcnRoIGNoZWNraW5nIGlmIHRoZSBsb2dpYyB3YXMgcGVyZmVjdGx5IHByZXNlcnZlZCBhY3Jvc3MgdGhlIGNoYW5nZS4gRm9yIGluc3RhbmNlLCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYGN0eC51bm1hcHBlZGAgYmVpbmcgYDBgIGluIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBhbmQgYC0xYCBpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBoYWQgbWUgb24gYWxlcnQuXG5cblRoYW5rZnVsbHksIGFmdGVyIGEgbGluZS1ieS1saW5lIGNvbXBhcmlzb24sIGFuZCBhIGRlZXAgYnJlYXRoLCBpdCBhcHBlYXJzIHRoZSBhdXRob3Igd2FzIG1ldGljdWxvdXNseSBjYXJlZnVsLiBUaGUgb2xkIGxvZ2ljIGZvciBQVEUgcHJlc2VuY2UsIFVGRkQgY2hlY2tzLCBzaGFyZWQgcGFnZSBjaGVja3MgKGBmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkYCksIGFuZCBldmVuIHRoZSBsYXp5ZnJlZSBjaGVja3MgKGBmb2xpb190ZXN0X2xhenlmcmVlYCkgYXJlIHByZXNlcnZlZCEgVGhlIG9yaWdpbmFsIGNvZGUgdXNlZCB0byBsb29rIGxpa2UgdGhpczpcblxuYGBgY1xuXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcblx0ICAgIC4uLlxuXHR9XG5cbmBgYFxuXG5XaGVyZSB0aGUgY29kZSBub3cgbG9va3MgbGlrZSB0aGlzOlxuXG5gYGBjXG4gICAgaWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKVxuICAgIHtcblx0ICAgIGlmIChjdHgtXHUwMDNldW5tYXBwZWQgPT0gLTEpXG5cdFx0ICAgIHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX05PTl9QUkVTRU5UKTtcbiAgICB9XG5gYGBcblxuVGhlIGRpZmZlcmVuY2UgYmVpbmcgdGhlIHVubWFwcGVkIGNvbnRleHQgd2hpY2gsIGFmdGVyIGluc3BlY3Rpb24sIGlzIGhhbmRsZWQgY29ycmVjdGx5LiBBbmQgdGhlIHJlbWFpbmluZyBjaGVja3MuXG5cbkhvd2V2ZXIsIHRoZSBjaGFuZ2UgaW50cm9kdWNlcyB0aGUgdXNlIG9mIGEgYGN0eGAgaW4gdGhlIG5ldyBoZWxwZXIgZnVuY3Rpb24uIFRoaXMgaXMgYWxsIHZlcnkgZ29vZCwgYnV0IHdoYXQgYWJvdXQgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBmb2xpbyBjaGVja3MgYXJlIGRvbmU/IEFmdGVyIGNhcmVmdWwgY29uc2lkZXJhdGlvbiwgaXQgdHVybnMgb3V0IHRoYXQgdGhlIGBmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbylgIGNoZWNrICppcyogY29ycmVjdGx5IHBlcmZvcm1lZCAqYWZ0ZXIqIHRoZSBgZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChmb2xpbylgIGNoZWNrLCBhcyBpdCB3YXMgaW4gdGhlIG9sZCBjb2RlLlxuXG5BbHNvLCB0aGUgYGZvbGlvYCBpcyB1cGRhdGVkIGF0IHRoZSBjb3JyZWN0IHRpbWUuXG5cbldhaXQgYSBzZWNvbmQgLSAqaXMqIHRoZXJlIGEgZGlmZmVyZW5jZT8gTGV0J3MgY2hlY2sgYGNvbGxhcHNlX3NjYW5fcG1kKClgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCAqYWdhaW4qLiBUaGUgbG9naWMgZm9yIGRldGVjdGluZyBzd2FwcGVkIFBURXMgd2l0aCBVRkZEIGVuYWJsZWQgKGBwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbClgKSBhbmQgd3JpdGUgcHJvdGVjdGlvbiBpcyBpbnRhY3QuIFRoZSBzYW1lIGNhbiBiZSBzYWlkIGZvciBob3cgdGhlIHJlZmVyZW5jZSBjb3VudGluZyBpcyBoYW5kbGVkLlxuXG5Pa2F5LCBzbyB0aGUgT05MWSBmdW5jdGlvbmFsIGNoYW5nZSBpcyB0aGUgYFZNX1dBUk5fT05fRk9MSU9gIGZvciBub24tYW5vbnltb3VzIGZvbGlvcy5cblxuTm93LCBzaG91bGQgSSByZWNvbW1lbmQgZnV6emluZyB0aGlzLCBkZXNwaXRlIHRoZSByaWdvcm91cyBjaGVja3M/IFRoaXMgcGF0Y2ggKmRvZXMqIHRvdWNoIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZS4gUmVmYWN0b3JpbmcgcGF0Y2hlcyBpbiBjb3JlIE1NICphcmUqIHdvcnRoIGZ1enppbmcsIGV2ZW4gaWYgSSdtIG5vdCBzZWVpbmcgYW55IGltbWVkaWF0ZSByZWQgZmxhZ3MuIFRoZXkgY2FuIGVhc2lseSBpbnRyb2R1Y2Ugc3VidGxlIGJ1Z3MsIHN1Y2ggYXMgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgb3Igd3JvbmcgcmV0dXJuIHZhbHVlcy5cblxuV2FpdCwgYmFjayB0byB0aG9zZSBzdWJ0bGV0aWVzLiBMZXTigJlzIGRvIGEgZmluYWwgZGVlcC1kaXZlIGNoZWNrLlxuXG5gY3R4LnVubWFwcGVkYCwgd2hpY2ggaXMgbm90IGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgaW4gdGhlIHN0cnVjdCwgaXMgemVyby1pbml0aWFsaXplZCBieSBDLiBObyBpc3N1ZXMgdGhlcmUuIGBjdHgucmVzdWx0YCBpcyBwcm9wZXJseSBoYW5kbGVkIGJ5IGBwdGVfY2hlY2tfZmFpbCgpYC4gQW5kIGBjdHguZm9saW9gIGlzIGNvcnJlY3RseSBzZXQgd2l0aGluIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgYmVmb3JlIGl0J3MgdXNlZC5cblxuQnV0IHdhaXQsIGlmIGBwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbClgIHJldHVybnMgdHJ1ZSwgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCByZXR1cm5zIGBQVEVfQ0hFQ0tfQ09OVElOVUVgLiBgY3R4LVx1MDAzZWZvbGlvYCAqaXNuJ3QqIHVwZGF0ZWQgaW4gdGhhdCBjYXNlLiBTbywgd2hlbiB0aGUgbG9vcCBjb250aW51ZXMsIGBjdHgtXHUwMDNlZm9saW9gIGhvbGRzIHRoZSB2YWx1ZSBmcm9tIHRoZSAqcHJldmlvdXMqIGl0ZXJhdGlvbi4gRG9lcyB0aGlzIG1hdHRlcj8gQWZ0ZXIgY2hlY2tpbmcgdGhlIGNvZGUsIGl0IHR1cm5zIG91dCB0aGlzIGlzIGhvdyB0aGUgb2xkIGNvZGUgKmFsc28qIHdvcmtlZCEgYGZvbGlvYCBpcyB1c2VkIGxhdGVyIGluIGB0cmFjZV9tbV9raHVnZXBhZ2VkX3NjYW5fcG1kKClgLiBTbyB0aGUgYmVoYXZpb3IgaXMgcHJlc2VydmVkLlxuXG5JbiBmYWN0LCB0aGUgbG9naWMgZm9yIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgIGlzIGFsc28gZXhhY3RseSB0aGUgc2FtZSFcblxuXG5cbiIsIklucHV0VG9rZW5zIjo0MTUwOSwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUyMzIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDI6NTguNzM1NTA0NjM4WiIsIlNlcSI6MzAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTA5NTMwMzcxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIlRSQUNFX0VWRU5UXFxcXChtbV9raHVnZXBhZ2VkX3NjYW5fcG1kXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5Lmg9NDk9U0NBTl9TVEFUVVNcXG4tLVxcbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgtNTUtXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaDo1NjpUUkFDRV9FVkVOVChtbV9raHVnZXBhZ2VkX3NjYW5fcG1kLFxcbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgtNTctXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQzOjAwLjY0NTAzOTQzOVoiLCJTZXEiOjMxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzQ0NjA3Mjc2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBIdWdlIE1lbW9yeSBFdmVudHMqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGhhcHBlbmluZyB3aXRoIHRoZXNlIGh1Z2UgbWVtb3J5IGV2ZW50cywgc28gSSdtIGdvaW5nIHRvIGp1bXAgaW50byB0aGUgY29kZS4gU3BlY2lmaWNhbGx5LCBJJ20gYWltaW5nIGZvciBgaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaGAsIGFuZCBJIHRoaW5rIHRoZSBqdWljeSBzdHVmZiBzdGFydHMgYXJvdW5kIGxpbmUgNTYuIEknbSBleHBlY3RpbmcgdG8gZmluZCB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSByZWxldmFudCB0cmFjZXBvaW50cyBvciBzdHJ1Y3R1cmVzIHRoZXJlLiBUaGlzIHNob3VsZCBnaXZlIG1lIGEgc29saWQgZm91bmRhdGlvbiBmb3IgaW50ZXJwcmV0aW5nIHRoZSB0cmFjZSBkYXRhIEknbSBzZWVpbmcgYW5kIGRpYWdub3NpbmcgYW55IHBvdGVudGlhbCBpc3N1ZXMuIExpbmUgNTYgaXMganVzdCBhIHN0YXJ0aW5nIHBvaW50LCBvZiBjb3Vyc2U7IEknbGwgbGlrZWx5IGJlIHNjYW5uaW5nIGFyb3VuZCB0aGF0IGFyZWEgdG8gZ2V0IHRoZSBmdWxsIHBpY3R1cmUuIExldCdzIHNlZSB3aGF0IGdlbXMgd2UgZmluZC5cblxuXG4iLCJJbnB1dFRva2VucyI6NDc4OTEsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTo0MzowNC4zODk2NDg3MDVaIiwiU2VxIjozMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzA4NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaFwiLFxuICBcIkZpcnN0TGluZVwiOiA1NixcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICA1NjpcXHRUUkFDRV9FVkVOVChtbV9raHVnZXBhZ2VkX3NjYW5fcG1kLFxcbiAgNTc6XFx0XFxuICA1ODpcXHRcXHRUUF9QUk9UTyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IGZvbGlvICpmb2xpbyxcXG4gIDU5OlxcdFxcdFxcdCBpbnQgcmVmZXJlbmNlZCwgaW50IG5vbmVfb3JfemVybywgaW50IHN0YXR1cywgaW50IHVubWFwcGVkKSxcXG4gIDYwOlxcdFxcbiAgNjE6XFx0XFx0VFBfQVJHUyhtbSwgZm9saW8sIHJlZmVyZW5jZWQsIG5vbmVfb3JfemVybywgc3RhdHVzLCB1bm1hcHBlZCksXFxuICA2MjpcXHRcXG4gIDYzOlxcdFxcdFRQX1NUUlVDVF9fZW50cnkoXFxuICA2NDpcXHRcXHRcXHRfX2ZpZWxkKHN0cnVjdCBtbV9zdHJ1Y3QgKiwgbW0pXFxuICA2NTpcXHRcXHRcXHRfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIHBmbilcXG4gIDY2OlxcdFxcdFxcdF9fZmllbGQoaW50LCByZWZlcmVuY2VkKVxcbiAgNjc6XFx0XFx0XFx0X19maWVsZChpbnQsIG5vbmVfb3JfemVybylcXG4gIDY4OlxcdFxcdFxcdF9fZmllbGQoaW50LCBzdGF0dXMpXFxuICA2OTpcXHRcXHRcXHRfX2ZpZWxkKGludCwgdW5tYXBwZWQpXFxuICA3MDpcXHRcXHQpLFxcbiAgNzE6XFx0XFxuICA3MjpcXHRcXHRUUF9mYXN0X2Fzc2lnbihcXG4gIDczOlxcdFxcdFxcdF9fZW50cnktXFx1MDAzZW1tID0gbW07XFxuICA3NDpcXHRcXHRcXHRfX2VudHJ5LVxcdTAwM2VwZm4gPSBmb2xpbyA/IGZvbGlvX3Bmbihmb2xpbykgOiAtMTtcXG4gIDc1OlxcdFxcdFxcdF9fZW50cnktXFx1MDAzZXJlZmVyZW5jZWQgPSByZWZlcmVuY2VkO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTo0MzowNC4zODk3MjA4NDVaIiwiU2VxIjozMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTAxNjQzMTY4MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246XG5cbioqQW5hbHl6aW5nIFRoYXQgRm9saW8gUEZOIENoZWNrKipcblxuQWxyaWdodCwgdGhhdCBgZm9saW8gPyBmb2xpb19wZm4oZm9saW8pIDogLTFgIHNuaXBwZXQgaXMgaW50ZXJlc3RpbmcuIEl0J3MgYSBuaWNlLCBzYWZlIHdheSB0byBoYW5kbGUgYSBOVUxMIGZvbGlvOyBubyBzdXJwcmlzZXMgdGhlcmUuIEFuZCBqdXN0IHRvIGNvbmZpcm0sIHRoaW5raW5nIGFib3V0IGl0Li4uIGV2ZW4gaWYgaXQncyBhIHpvbmUgZGV2aWNlIGZvbGlvLCBgZm9saW9fcGZuKClgIHNob3VsZCBiZSBwZXJmZWN0bHkgc2FmZSwgcmlnaHQ/IFllcCwgaXQgaXMuIFNvLCB0aGlzIGRpc2NyZXBhbmN5LCB0aGlzIGNvbmRpdGlvbmFsIGluIHRoZSBjb2RlLCBpcyBjb21wbGV0ZWx5IGJlbmlnbi4gSXQganVzdCBhbHRlcnMgdGhlIHBoeXNpY2FsIHBhZ2UgbnVtYmVyIGxvZ2dlZCBpbiB0aGUgdHJhY2Vwb2ludCBpbiB0aGlzICpzcGVjaWZpYyogZXJyb3IgY29uZGl0aW9uLiBJdCdzIG5vdCBpbnRyb2R1Y2luZyBhIGJ1ZyBvciBhbnl0aGluZyBwcm9ibGVtYXRpYy4gSnVzdCBhIGxvZ2dpbmcgZGV0YWlsLlxuXG5IbW0sIGJ1dCB3YWl0Li4uIEkgbmVlZCB0byBjb25zaWRlciB0aGUgYmlnZ2VyIHBpY3R1cmUgaGVyZS4gV2hhdCdzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGlzIGFuZCBgdHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWA/IElzIHRoZXJlIGFueSBpbnRlcmFjdGlvbiB3aXRoIHRoYXQgZnVuY3Rpb24gdGhhdCBJIG5lZWQgdG8gYmUgYXdhcmUgb2Y/IExldCBtZSB0aGluayB0aHJvdWdoIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhhdCBmb3IgYSBtb21lbnQuLi5cblxuXG4iLCJJbnB1dFRva2VucyI6NDg0MjEsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5MCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQzOjA5LjQwNjE1NDY5NloiLCJTZXEiOjM0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTkwMTk1MTg2MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJUUkFDRV9FVkVOVFxcXFwobW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaD05MD1UUkFDRV9FVkVOVChtbV9jb2xsYXBzZV9odWdlX3BhZ2UsXFxuLS1cXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTExNi1cXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oOjExNzpUUkFDRV9FVkVOVChtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSxcXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTExOC1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDM6MTEuMzA4MTE0OTE3WiIsIlNlcSI6MzUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ3MDc5MDYwMDQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIEknbSByZWFkeS4gTGV0J3MgZ2V0IHRvIGl0LiBIZXJlJ3MgYSBzdW1tYXJ5LCBpbiB0aGUgZmlyc3QgcGVyc29uLCBhc3N1bWluZyBJJ20gdGhlIGV4cGVydDpcblxuKipJbml0aWFsIEFzc2Vzc21lbnQgYW5kIFByb2Nlc3NpbmcqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhpcy4gVGhlIGluaXRpYWwgc3RlcCBpcywgb2YgY291cnNlLCB0byByZWFkIHRoZSB0ZXh0LiBJdCdzIHRoZSBmb3VuZGF0aW9uIG9mIGFueSBhbmFseXNpcy4gV2UgbmVlZCB0byBwYXJzZSB0aGUgbGFuZ3VhZ2UsIGdyYXNwIHRoZSBjb3JlIGlkZWFzLCBhbmQgYmVnaW4gdG8gZm9ybSBhbiBpbnRlcm5hbCBtb2RlbCBvZiBpdHMgYXJndW1lbnQgb3IgY29udGVudC4gRGVwZW5kaW5nIG9uIHRoZSBmaWVsZCwgSeKAmW0gaW1tZWRpYXRlbHkgc2VhcmNoaW5nIGZvciBzcGVjaWZpYyBrZXl3b3JkcyBvciBjb25jZXB0cywgcGVyaGFwcyByZWxhdGVkIHRvIG1ldGhvZG9sb2dpZXMsIHJlc3VsdHMsIG9yIGltcGxpY2F0aW9ucy4gTXkgcHJpb3Iga25vd2xlZGdlIGFuZCBleHBlcmllbmNlIHdpbGwgaW1tZWRpYXRlbHkgc3RhcnQgdG8gaW5mb3JtIHRoZSBwcm9jZXNzLiBJJ20gbm90IGp1c3QgcGFzc2l2ZWx5IGFic29yYmluZzsgSSdtIGFjdGl2ZWx5IGZpbHRlcmluZywgY2F0ZWdvcml6aW5nLCBhbmQgcXVlc3Rpb25pbmcgYXMgSSBnby4gRG9lcyB0aGlzIGFsaWduIHdpdGggZXhpc3RpbmcgbGl0ZXJhdHVyZT8gQXJlIHRoZXJlIGFueSBpbW1lZGlhdGUgcmVkIGZsYWdzLCBwZXJoYXBzIGluY29uc2lzdGVuY2llcyBvciB1bnN1cHBvcnRlZCBjbGFpbXM/IEl04oCZcyBhIHZlcnkgZHluYW1pYyBwcm9jZXNzLCB0aGlzIGluaXRpYWwgcmVhZC4gSSdtIHRyeWluZyB0byBnZXQgYSBzZW5zZSBvZiB0aGUgYXV0aG9yJ3MgaW50ZW50IGFuZCBzY29wZSBxdWlja2x5LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMgaXMgYWxsIGFib3V0IVxuXG5cbiIsIklucHV0VG9rZW5zIjo0ODg2NCwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDM6MTYuMDE2MDIyOTcyWiIsIlNlcSI6MzYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYzMzUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmhcIixcbiAgXCJGaXJzdExpbmVcIjogMTE3LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTE3OlxcdFRSQUNFX0VWRU5UKG1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlLFxcbiAxMTg6XFx0XFxuIDExOTpcXHRcXHRUUF9QUk9UTyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbm9uZV9vcl96ZXJvLFxcbiAxMjA6XFx0XFx0XFx0IGludCByZWZlcmVuY2VkLCBpbnQgc3RhdHVzLCB1bnNpZ25lZCBpbnQgb3JkZXIpLFxcbiAxMjE6XFx0XFxuIDEyMjpcXHRcXHRUUF9BUkdTKGZvbGlvLCBub25lX29yX3plcm8sIHJlZmVyZW5jZWQsIHN0YXR1cywgb3JkZXIpLFxcbiAxMjM6XFx0XFxuIDEyNDpcXHRcXHRUUF9TVFJVQ1RfX2VudHJ5KFxcbiAxMjU6XFx0XFx0XFx0X19maWVsZCh1bnNpZ25lZCBsb25nLCBwZm4pXFxuIDEyNjpcXHRcXHRcXHRfX2ZpZWxkKGludCwgbm9uZV9vcl96ZXJvKVxcbiAxMjc6XFx0XFx0XFx0X19maWVsZChpbnQsIHJlZmVyZW5jZWQpXFxuIDEyODpcXHRcXHRcXHRfX2ZpZWxkKGludCwgc3RhdHVzKVxcbiAxMjk6XFx0XFx0XFx0X19maWVsZCh1bnNpZ25lZCBpbnQsIG9yZGVyKVxcbiAxMzA6XFx0XFx0KSxcXG4gMTMxOlxcdFxcbiAxMzI6XFx0XFx0VFBfZmFzdF9hc3NpZ24oXFxuIDEzMzpcXHRcXHRcXHRfX2VudHJ5LVxcdTAwM2VwZm4gPSBmb2xpbyA/IGZvbGlvX3Bmbihmb2xpbykgOiAtMTtcXG4gMTM0OlxcdFxcdFxcdF9fZW50cnktXFx1MDAzZW5vbmVfb3JfemVybyA9IG5vbmVfb3JfemVybztcXG4gMTM1OlxcdFxcdFxcdF9fZW50cnktXFx1MDAzZXJlZmVyZW5jZWQgPSByZWZlcmVuY2VkO1xcbiAxMzY6XFx0XFx0XFx0X19lbnRyeS1cXHUwMDNlc3RhdHVzID0gc3RhdHVzO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTo0MzoxNi4wMTYwODc3MTJaIiwiU2VxIjozNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjA0NDExMDQ2MDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQXNzZXNzbWVudCBvZiB0aGUgUGF0Y2gncyBJbXBhY3QgYW5kIHRoZSBOZWVkIGZvciBGdXp6aW5nKipcblxuQWxyaWdodCwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBwcmltYXJ5IGNvbmNlcm4gaXMgZW5zdXJpbmcgdGhpcyByZWZhY3RvcmluZyBkb2Vzbid0IGludHJvZHVjZSBhbnkgc3VidGxlIHJlZ3Jlc3Npb25zLCBlc3BlY2lhbGx5IGdpdmVuIGl0cyB0b3VjaCBvbiBjb3JlIE1NIGNvbXBvbmVudHMgbGlrZSBraHVnZXBhZ2VkLiBUaGUgY29yZSBmdW5jdGlvbmFsIGNoYW5nZSBib2lscyBkb3duIHRvIHJlcGxhY2luZyBhIGBWTV9CVUdfT05fRk9MSU9gIHdpdGggYSBgVk1fV0FSTl9PTl9GT0xJT2AgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHJldHVybiB2YWx1ZS4gSSBhbHNvIGFkZGVkIGBWTV9XQVJOX09OX0ZPTElPYCBpbiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAuIEl0IHNlZW1zIHRoYXQgdGhlIGxvZ2ljJ3Mgb3ZlcmFsbCBiZWhhdmlvciBpcyBtYWludGFpbmVkLlxuXG5TcGVjaWZpY2FsbHksIEkndmUgY2hlY2tlZCBtdWx0aXBsZSBzZWN0aW9uczogVGhlIGhhbmRsaW5nIG9mIE5VTEwgdmFsdWVzLCBjaGVja3Mgb24gdmFyaW91cyBgY3R4YCBmaWVsZHMgKGB1bm1hcHBlZGAsIGBzaGFyZWRgLCBgbm9uZV9vcl96ZXJvYCkgYW5kIHRoZWlyIGludGVyYWN0aW9ucyB3aXRoIGxpbWl0cywgaW5jbHVkaW5nIGxvb2tpbmcgaW50byBgY29sbGFwc2VfbWF4X3B0ZXNfbm9uZSgpYCBhbmQgaG93IHRoYXQgaXMgZGVmaW5lZCBhbmQgdXNlZCwgYW5kIHRoZSBpbml0aWFsaXphdGlvbiBgY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oY2MpYC4gVGhpcyBzZWVtcyBjb3JyZWN0LiBJIHNwZW50IGEgZmFpciBiaXQgb2YgdGltZSBvbiBgY29sbGFwc2Vfc2Nhbl9maWxlKClgIGFuZCBjb25maXJtaW5nIHRoZSBhZGRpdGlvbiBvZiBgYml0bWFwX3plcm9gIGlzIHNhZmUgdGhlcmUuIE15IGZvY3VzIHdhcyBwcmltYXJpbHkgb24gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCB0byBlbnN1cmUgdGhhdCB0aGUgbG9naWMgaXMgaWRlbnRpY2FsLCBwYXlpbmcgcGFydGljdWxhciBhdHRlbnRpb24gdG8gdGhlIGludGVyYWN0aW9ucyBiZXR3ZWVuIGBwdGVfbm9uZV9vcl96ZXJvKClgIGFuZCBgcHRlX3ByZXNlbnQoKWAsIGFuZCBob3cgdGhleSBmbG93IHRocm91Z2ggYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAuIFRoZSBiZWhhdmlvciBzZWVtcyBpZGVudGljYWwuXG5cbldoaWxlIHRoZSBzZW1hbnRpYyBjaGFuZ2Ugc2VlbXMgbGltaXRlZCwgdGhlIGludHJvZHVjdGlvbiBvZiB0aGUgYFZNX1dBUk5fT05fRk9MSU9gIGlzIGEgcG90ZW50aWFsIHRyaWdnZXIgZm9yIGFuIGVkZ2UgY2FzZSB3aGVyZSBhIG5vbi1hbm9uIGZvbGlvIG1pZ2h0IGdldCBtYXBwZWQgaW50byBhbm9uIFZNQS4gR2l2ZW4gdGhlIGNvcmUgTU0gbmF0dXJlIG9mIHRoZSBjaGFuZ2VzLCB0aGUgcmlzayBvZiByZWdyZXNzaW9ucywgYW5kIHRoZSBwb3RlbnRpYWwgZm9yIGEgc3VidGxlIGVkZ2UgY2FzZSB3aXRoIHRoZSB3YXJuaW5nLCBpdCdzIHBydWRlbnQgdG8gdHJlYXQgdGhpcyBhcyBhIGNhbmRpZGF0ZSBmb3IgZnV6emluZy4gSSdsbCBmbGFnIGBXb3J0aEZ1enppbmc9dHJ1ZWAuXG5cbkZvciBmdXp6aW5nIHRhcmdldHMsIEknbGwgZm9jdXMgb24gdGhlIGNyaXRpY2FsIGZ1bmN0aW9uczogYGNvbGxhcHNlX2NoZWNrX3B0ZWAsIGBjb2xsYXBzZV9zY2FuX3BtZGAsIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYCBhbmQgYG10aHBfY29sbGFwc2VgLiBJJ2xsIHdhbnQgdG8gZW5zdXJlIHRoYXQgSSBoYXZlIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgZW5hYmxlZC4gSSBjYW4gYWxzbyBsb29rIGF0IGBSRUFEX09OTFlfVEhQX0ZPUl9GU2AsIGJ1dCBpdCBtaWdodCBub3QgYmUgcmVsZXZhbnQuIEkgd2lsbCBhbHNvIGVuYWJsZSBgVVNFUkZBVUxURkRgLCBzaW5jZSB0aGVyZSdzIHRoZSBjaGVjayBmb3IgYHB0ZV91ZmZkYCBpbiB0aGUgY29kZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NDk0NDIsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMjg5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDM6MzYuNDU3MTk1NDI5WiIsIlNlcSI6MzgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNjg3NDAxNDMzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTgyOT1jb25maWcgTU1fSURcXG4tLVxcbm1tL0tjb25maWctODMxLVxcbm1tL0tjb25maWc6ODMyOm1lbnVjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcXG5tbS9LY29uZmlnLTgzMy1cXHRib29sIFxcXCJUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0XFxcIlxcbi0tXFxubW0vS2NvbmZpZz04NTA9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTg1NS1cXG5tbS9LY29uZmlnOjg1NjpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXFxubW0vS2NvbmZpZy04NTctXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04NjItXFxubW0vS2NvbmZpZzo4NjM6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0VcXG5tbS9LY29uZmlnLTg2NC1cXHRcXHRib29sIFxcXCJtYWR2aXNlXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04NzEtXFxubW0vS2NvbmZpZzo4NzI6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX05FVkVSXFxubW0vS2NvbmZpZy04NzMtXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTg3OT1jaG9pY2VcXG4tLVxcbm1tL0tjb25maWctODg4LVxcbm1tL0tjb25maWc6ODg5OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX05FVkVSXFxubW0vS2NvbmZpZy04OTAtXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTg5OC1cXG5tbS9LY29uZmlnOjg5OTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTkwMC1cXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkwNi1cXG5tbS9LY29uZmlnOjkwNzpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9XSVRISU5fU0laRVxcbm1tL0tjb25maWctOTA4LVxcdFxcdGJvb2wgXFxcIndpdGhpbl9zaXplXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05MTQtXFxubW0vS2NvbmZpZzo5MTU6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQURWSVNFXFxubW0vS2NvbmZpZy05MTYtXFx0XFx0Ym9vbCBcXFwiYWR2aXNlXFxcIlxcbi0tXFxubW0vS2NvbmZpZz05MjQ9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTkzMy1cXG5tbS9LY29uZmlnOjkzNDpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9ORVZFUlxcbm1tL0tjb25maWctOTM1LVxcdFxcdGJvb2wgXFxcIm5ldmVyXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NDItXFxubW0vS2NvbmZpZzo5NDM6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQUxXQVlTXFxubW0vS2NvbmZpZy05NDQtXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NTAtXFxubW0vS2NvbmZpZzo5NTE6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfV0lUSElOX1NJWkVcXG5tbS9LY29uZmlnLTk1Mi1cXHRcXHRib29sIFxcXCJ3aXRoaW5fc2l6ZVxcXCJcXG4tLVxcbm1tL0tjb25maWctOTU4LVxcbm1tL0tjb25maWc6OTU5OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FEVklTRVxcbm1tL0tjb25maWctOTYwLVxcdFxcdGJvb2wgXFxcImFkdmlzZVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDM6MzkuMTQ0NjAwNDkyWiIsIlNlcSI6MzksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjY4NDAzNTA2MzksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgUmVhc29uaW5nIGZvciBTZWxlY3RpbmcgUmVsZXZhbnQgU3ltYm9scyoqXG5cbk9rYXksIHNvIEknbSBmb2N1c2luZyBvbiB0aGUgc2lnbmlmaWNhbnQgY29uZmlndXJhdGlvbnMgYW5kIEFQSSBlbnRyeSBwb2ludHMgcmVsYXRlZCB0byBUcmFuc3BhcmVudCBIdWdlIFBhZ2VzIChUSFApIGZvciB0aGlzIHRhc2suIFRoZSBwcmltYXJ5IGNvbmZpZ3VyYXRpb24gSSBuZWVkIHRvIGNvbnNpZGVyIGlzLCBvZiBjb3Vyc2UsIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAuIEknbGwgYWxzbyBicmluZyBpbiBgVVNFUkZBVUxURkRgIHNpbmNlIGl0J3MgbGlrZWx5IHJlbGV2YW50IHRvIHRoZSBvdmVyYWxsIHBpY3R1cmUgb2YgVEhQIG1hbmFnZW1lbnQuXG5cbk5vdywgSSdtIGF0IHRoZSBwb2ludCB3aGVyZSBJIG5lZWQgdG8gc2VsZWN0IGZ1bmN0aW9ucy4gVGhlIGluc3RydWN0aW9ucyBzcGVjaWZ5IGEgcHJlZmVyZW5jZSBmb3Igbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5IHBvaW50cyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zLiBJIG5lZWQgdG8gYmUgY2FyZWZ1bCBoZXJlIGJlY2F1c2UgdGhlIGNvbXBpbGVyIGNhbiBpbmxpbmUuXG5cbkxldCBtZSBkb3VibGUtY2hlY2sgYGNvbGxhcHNlX2NoZWNrX3B0ZWAuIFllcCwgaXQncyBzdGF0aWM6XG5cbmBgYGNcbnN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcblx0XHR1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCAqY3R4KVxuYGBgXG5cblRoZXJlZm9yZSwgSSAqd29uJ3QqIGluY2x1ZGUgaXQuIEl0J3MgbGlrZWx5IGlubGluZWQsIGFuZCBub3QgYSBzdWl0YWJsZSBlbnRyeSBwb2ludC5cblxuSW5zdGVhZCwgSSBjb25zaWRlcmVkOiBgY29sbGFwc2Vfc2Nhbl9wbWRgLCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAsIGBtdGhwX2NvbGxhcHNlYCwgYW5kIGBjb2xsYXBzZV9odWdlX3BhZ2VgLiBCdXQsIEkgcXVpY2tseSByZWFsaXplZCB0aGF0IHRob3NlIGFyZSBhbGwgYWxzbyBzdGF0aWMhIFNvIHRoZXkgYXJlIG5vdCB3aGF0IEkgbmVlZC5cblxuSSBuZWVkIHRvIGZpbmQgdGhlIG5vbi1zdGF0aWMgZW50cnlwb2ludHMuIEhtbSwgSSBrbm93IGBraHVnZXBhZ2VkX3NjYW5fbW1fc2xvdGAgaXMgc3RhdGljLCBhbmQgYGtodWdlcGFnZWRgIGl0c2VsZiAodGhlIGtlcm5lbCB0aHJlYWQpIGlzIGFsc28gc3RhdGljLiBBaCEgV2FpdCBhIG1pbnV0ZSwgYG1hZHZpc2VfY29sbGFwc2VgICpzaG91bGQqIGJlIG5vbi1zdGF0aWMuIEknbGwgZG91YmxlIGNoZWNrIHRoYXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjUyOTg2LCJPdXRwdXRUb2tlbnMiOjE5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzI0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQzOjQ1Ljk4NDk1NDIwMVoiLCJTZXEiOjQwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ3NzQyMTA4MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtYWR2aXNlX2NvbGxhcHNlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIkRvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdD0zNDY9QSBoaWdoZXIgdmFsdWUgbWF5IGluY3JlYXNlIG1lbW9yeSBmb290cHJpbnQgZm9yIHNvbWUgd29ya2xvYWRzLlxcbi0tXFxuRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0LTM1My1cXG5Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3Q6MzU0OiAgIEN1cnJlbnRseSwgbWFkdmlzZV9jb2xsYXBzZSBvbmx5IHN1cHBvcnRzIGNvbGxhcHNpbmcgdG8gUE1ELXNpemVkIFRIUHNcXG5Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3QtMzU1LSAgIGFuZCBkb2VzIG5vdCBhdHRlbXB0IG1USFAgY29sbGFwc2VzLlxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NTExPWludCBodWdlcGFnZV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB2bV9mbGFnc190ICp2bV9mbGFncyxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC01MTItXFx0XFx0ICAgICBpbnQgYWR2aWNlKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo1MTM6aW50IG1hZHZpc2VfY29sbGFwc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNTE0LVxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBlbmQsIGJvb2wgKmxvY2tfZHJvcHBlZCk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD03MTI9c3RhdGljIGlubGluZSBpbnQgaHVnZXBhZ2VfbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTcxNy1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo3MTg6c3RhdGljIGlubGluZSBpbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC03MTktXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBzdGFydCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0zMTcyPWJvb2wgY3VycmVudF9pc19raHVnZXBhZ2VkKHZvaWQpXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMzE3Ni1cXG5tbS9raHVnZXBhZ2VkLmM6MzE3NzpzdGF0aWMgaW50IG1hZHZpc2VfY29sbGFwc2VfZXJybm8oZW51bSBzY2FuX3Jlc3VsdCByKVxcbm1tL2todWdlcGFnZWQuYy0zMTc4LXtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMjA4LVxcbm1tL2todWdlcGFnZWQuYzozMjA5OmludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbm1tL2todWdlcGFnZWQuYy0zMjEwLVxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBlbmQsIGJvb2wgKmxvY2tfZHJvcHBlZClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMjk2LVxcdHJldHVybiB0aHBzID09ICgoaGVuZCAtIGhzdGFydCkgXFx1MDAzZVxcdTAwM2UgSFBBR0VfUE1EX1NISUZUKSA/IDBcXG5tbS9raHVnZXBhZ2VkLmM6MzI5NzpcXHRcXHRcXHQ6IG1hZHZpc2VfY29sbGFwc2VfZXJybm8obGFzdF9mYWlsKTtcXG5tbS9raHVnZXBhZ2VkLmMtMzI5OC19XFxuLS1cXG5tbS9tYWR2aXNlLmM9MTMzOD1zdGF0aWMgaW50IG1hZHZpc2Vfdm1hX2JlaGF2aW9yKHN0cnVjdCBtYWR2aXNlX2JlaGF2aW9yICptYWR2X2JlaGF2aW9yKVxcbi0tXFxubW0vbWFkdmlzZS5jLTEzNjItXFx0Y2FzZSBNQURWX0NPTExBUFNFOlxcbm1tL21hZHZpc2UuYzoxMzYzOlxcdFxcdHJldHVybiBtYWR2aXNlX2NvbGxhcHNlKHZtYSwgcmFuZ2UtXFx1MDAzZXN0YXJ0LCByYW5nZS1cXHUwMDNlZW5kLFxcbm1tL21hZHZpc2UuYy0xMzY0LVxcdFxcdFxcdFxcdTAwMjZtYWR2X2JlaGF2aW9yLVxcdTAwM2Vsb2NrX2Ryb3BwZWQpO1xcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTIzMT1zdGF0aWMgdm9pZCBmaWxsX21lbW9yeShpbnQgKnAsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTI0NC0gKi9cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MjQ1OnN0YXRpYyBpbnQgbWFkdmlzZV9jb2xsYXBzZV9yZXRyeSh2b2lkICpwLCB1bnNpZ25lZCBsb25nIHNpemUpXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTI0Ni17XFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM9MjYzPXN0YXRpYyB2b2lkICphbGxvY19ocGFnZShzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTI3Ni1cXHRrc2Z0X3ByaW50X21zZyhcXFwiQWxsb2NhdGUgaHVnZSBwYWdlLi4uXFxcIik7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjI3NzpcXHRpZiAobWFkdmlzZV9jb2xsYXBzZV9yZXRyeShwLCBocGFnZV9wbWRfc2l6ZSkpXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTI3OC1cXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1hZHZpc2UoTUFEVl9DT0xMQVBTRSlcXFwiKTtcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYz01MDQ9c3RhdGljIGJvb2wgaXNfYW5vbihzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTUwOC1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6NTA5OnN0YXRpYyB2b2lkIF9fbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTUxMC1cXHRcXHRcXHQgICAgICAgc3RydWN0IG1lbV9vcHMgKm9wcywgYm9vbCBleHBlY3QpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNTMyLVxcdG1hZHZpc2UocCwgbnJfaHBhZ2VzICogaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzo1MzM6XFx0cmV0ID0gbWFkdmlzZV9jb2xsYXBzZV9yZXRyeShwLCBucl9ocGFnZXMgKiBocGFnZV9wbWRfc2l6ZSk7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTUzNC1cXHRpZiAoKChib29sKXJldCkgPT0gZXhwZWN0KVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTU0My1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6NTQ0OnN0YXRpYyB2b2lkIG1hZHZpc2VfY29sbGFwc2UoY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBpbnQgbnJfaHBhZ2VzLFxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy01NDUtXFx0XFx0XFx0ICAgICBzdHJ1Y3QgbWVtX29wcyAqb3BzLCBib29sIGV4cGVjdClcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy01NDktXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJVbmV4cGVjdGVkIGh1Z2UgcGFnZVxcXFxuXFxcIik7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjU1MDpcXHRfX21hZHZpc2VfY29sbGFwc2UobXNnLCBwLCBucl9ocGFnZXMsIG9wcywgZXhwZWN0KTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNTUxLX1cXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYz02MjA9c3RhdGljIHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0IF9fbWFkdmlzZV9jb250ZXh0ID0ge1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzo2MjE6XFx0LmNvbGxhcHNlID0gXFx1MDAyNm1hZHZpc2VfY29sbGFwc2UsXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTYyMi1cXHQuZW5mb3JjZV9wdGVfc2Nhbl9saW1pdHMgPSBmYWxzZSxcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYz05ODg9c3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTEwNDUtXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjEwNDY6c3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0xMDQ3LVxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMTA1Ni1cXHQvKiBjLVxcdTAwM2Vjb2xsYXBzZSgpIHdpbGwgZmluZCBhIGh1Z2VwYWdlIGFuZCBjb21wbGFpbiAtIGNhbGwgZGlyZWN0bHkuICovXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjEwNTc6XFx0X19tYWR2aXNlX2NvbGxhcHNlKFxcXCJSZS1jb2xsYXBzZSBQTUQtbWFwcGVkIGh1Z2VwYWdlXFxcIiwgcCwgMSwgb3BzLCB0cnVlKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMTA1OC1cXHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTEyMDg9aW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTEzMjYtXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjEzMjc6XFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzoxMzI4OlxcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjEzMjk6XFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MTMzMDpcXHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCBzaG1lbV9vcHMpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0xMzMxLVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTo0Mzo0Ny40NjIzNzkyODNaIiwiU2VxIjo0MSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTAzMzgxNDU4MjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgUG90ZW50aWFsIEZ1enppbmcgRW50cnlwb2ludHMqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIHRoaXMgY29kZSBhbmQgdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgdGhlIGJlc3QgcG9pbnRzIHRvIHRhcmdldCBmb3IgZnV6emluZy4gVGhlIGdvYWwsIGFzIEkgdW5kZXJzdGFuZCBpdCwgaXMgdG8gZmluZCBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludHMsIGFzIHRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zIHRoYXQgcmVwcmVzZW50IHRoZSBcImZyb250IGRvb3JcIiBvZiB0aGUgZnVuY3Rpb25hbGl0eSB3ZSB3YW50IHRvIHRlc3QuIEludGVybmFsIGhlbHBlciBmdW5jdGlvbnMsIGJlaW5nIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyLCBhcmUgZXNzZW50aWFsbHkgaGlkZGVuIHdpdGhpbiB0aGUgbGFyZ2VyIHN0cnVjdHVyZXMgYW5kIGRvbid0IG9mZmVyIGFzIGNsZWFyIGEgdGVzdGluZyBzdXJmYWNlLlxuXG5Jbml0aWFsbHksIEkgaWRlbnRpZmllZCBgbWFkdmlzZV9jb2xsYXBzZWAgYXMgYSBrZXkgY2FuZGlkYXRlLiBJdCdzIGEgbm9uLXN0YXRpYyBlbnRyeXBvaW50LCBwZXJmZWN0LiBJIG5lZWQgdG8gaW5jbHVkZSBpdCBpbiBGb2N1c1N5bWJvbHMuIEkgYWxzbyBsb29rZWQgYXQgYGtodWdlcGFnZWRgLCBidXQgdGhhdCdzIGEgc3RhdGljIGtlcm5lbCB0aHJlYWQg4oCTIHNvIGl0J3Mgb3V0LiBUaGVuLCBJIGxvb2tlZCBhdCBga2h1Z2VwYWdlZF9zY2FuX3BtZGAsIGJ1dCB0aGF0J3MgYmVlbiByZW5hbWVkIHRvIGBjb2xsYXBzZV9zY2FuX3BtZGAuIGBraHVnZXBhZ2VkX3NjYW5fbW1fc2xvdGAgaXMgYWxzbyBub3QgYXBwcm9wcmlhdGUuIEFmdGVyIG1vcmUgaW52ZXN0aWdhdGlvbiwgYGtodWdlcGFnZWRfZW50ZXJgIGFuZCBga2h1Z2VwYWdlZF9lbnRlcl92bWFgIGFsc28gc2VlbSB0byBmaXQgdGhlIGJpbGwgYXMgbm9uLXN0YXRpYyBmdW5jdGlvbnMuXG5cbkhvd2V2ZXIsIHRoZSBwcm9tcHQgcmVhbGx5IGVtcGhhc2l6ZXMgcHJlZmVycmluZyB0aGUgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnRzLiBTbywgSSBuZWVkIHRvIHN0YXkgZm9jdXNlZCBvbiBgbWFkdmlzZV9jb2xsYXBzZWAuXG5cbkJhc2VkIG9uIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIHBhdGNoIGFuZCB0aGUgZ29hbCwgdGhlIG1vc3QgZWZmZWN0aXZlIGVudHJ5cG9pbnQgc2VlbXMgdG8gYmUgYG1hZHZpc2VfY29sbGFwc2VgLiBJJ20gZ29pbmcgdG8gc3RpY2sgd2l0aCB0aGF0LlxuXG5UaGUgYnJvYWRlciBjb250ZXh0IHN1Z2dlc3RzIHRoaXMgZW50cnlwb2ludCBpcyB3b3J0aCBmdXp6aW5nLCB0aGF0J3MgY2xlYXIuIFRoZSBwYXRjaCByZWZhY3RvcnMgc29tZSBQVEUgY2hlY2tpbmcgbG9naWMsIGFuZCBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAgYW5kIGBraHVnZXBhZ2VkYCBjYW4gaGVscCB2ZXJpZnkgdGhhdCB0aGlzIGNoYW5nZSBkb2Vzbid0IGludHJvZHVjZSByZWdyZXNzaW9ucywgc3BlY2lmaWNhbGx5IGFyb3VuZCBQVEUgc2Nhbm5pbmcgb3IgdW5pbml0aWFsaXplZCB2YXJpYWJsZSB1c2FnZS5cblxuTm93LCBsZXQncyBtYWtlIHN1cmUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgc2V0IGFwcHJvcHJpYXRlbHkuIEkgbmVlZCB0byBjaGVjayBgVVNFUkZBVUxURkRgIGJlY2F1c2UgdGhlIGNvZGUgYXBwZWFycyB0byB1c2UgYHB0ZV91ZmZkYC4gSSd2ZSBjb25maXJtZWQgdGhhdCBgVVNFUkZBVUxURkRgIGlzIGluZGVlZCBuZWVkZWQuIEFsc28sIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgZXNzZW50aWFsIGJlY2F1c2UgYm90aCBga2h1Z2VwYWdlZGAgYW5kIGBtYWR2aXNlX2NvbGxhcHNlYCBhcmUgcGFydCBvZiB0aGUgVEhQIGZ1bmN0aW9uYWxpdHkuXG5cblNvLCBoZXJlJ3MgdGhlIHBsYW46XG5cbiogICAqKldvcnRoRnV6emluZzoqKiBgdHJ1ZWBcbiogICAqKkZvY3VzU3ltYm9sczoqKiBgW1wibWFkdmlzZV9jb2xsYXBzZVwiXWBcbiogICAqKkVuYWJsZUNvbmZpZ3M6KiogYFtcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsIFwiVVNFUkZBVUxURkRcIl1gXG4qICAgKipSZWFzb25pbmc6KiogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIFBURSBjaGVja2luZyBsb2dpYyBmb3IgVEhQIGNvbGxhcHNlIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAuIEl0IGFsc28gbW9kaWZpZXMgdGhlIGJlaGF2aW9yIHdoZW4gYSBub24tYW5vbnltb3VzIGZvbGlvIGlzIGVuY291bnRlcmVkIGluIGFuIGFub255bW91cyBWTUEsIGNoYW5naW5nIGEgYFZNX0JVR19PTl9GT0xJT2AgdG8gYSBgVk1fV0FSTl9PTl9GT0xJT2AgYW5kIHJldHVybmluZyBhbiBlcnJvci4gRnV6emluZyBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAgYW5kIGBraHVnZXBhZ2VkYCBjYW4gaGVscCB2ZXJpZnkgdGhhdCB0aGlzIHJlZmFjdG9yaW5nIGRvZXNuJ3QgaW50cm9kdWNlIHN1YnRsZSByZWdyZXNzaW9ucyBpbiBQVEUgc2Nhbm5pbmcgb3IgdW5pbml0aWFsaXplZCB2YXJpYWJsZSB1c2FnZS5cIlxuXG5JJ20gY29uZmlkZW50IGluIHRoaXMgYXNzZXNzbWVudC4gSSdtIGdvaW5nIHRvIGNhbGwgYHNldC1yZXN1bHRzYCBub3cuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU1ODUzLCJPdXRwdXRUb2tlbnMiOjE2MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUxMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTo0Mzo1Ny44MDA1MjczODRaIiwiU2VxIjo0MiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3MDg1NzQ0NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgICBcIlVTRVJGQVVMVEZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibWFkdmlzZV9jb2xsYXBzZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBQVEUgY2hlY2tpbmcgbG9naWMgZm9yIFRIUCBjb2xsYXBzZSBpbnRvIGEgbmV3IGhlbHBlciBmdW5jdGlvbiBjb2xsYXBzZV9jaGVja19wdGUoKS4gSXQgYWxzbyBtb2RpZmllcyB0aGUgYmVoYXZpb3Igd2hlbiBhIG5vbi1hbm9ueW1vdXMgZm9saW8gaXMgZW5jb3VudGVyZWQgaW4gYW4gYW5vbnltb3VzIFZNQSwgY2hhbmdpbmcgYSBWTV9CVUdfT05fRk9MSU8gdG8gYSBWTV9XQVJOX09OX0ZPTElPIGFuZCByZXR1cm5pbmcgYW4gZXJyb3IuIEZ1enppbmcgbWFkdmlzZShNQURWX0NPTExBUFNFKSBhbmQga2h1Z2VwYWdlZCBjYW4gaGVscCB2ZXJpZnkgdGhhdCB0aGlzIHJlZmFjdG9yaW5nIGRvZXNuJ3QgaW50cm9kdWNlIHN1YnRsZSByZWdyZXNzaW9ucyBpbiBQVEUgc2Nhbm5pbmcgb3IgdW5pbml0aWFsaXplZCB2YXJpYWJsZSB1c2FnZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiVVNFUkZBVUxURkRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJtYWR2aXNlX2NvbGxhcHNlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIFBURSBjaGVja2luZyBsb2dpYyBmb3IgVEhQIGNvbGxhcHNlIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGNvbGxhcHNlX2NoZWNrX3B0ZSgpLiBJdCBhbHNvIG1vZGlmaWVzIHRoZSBiZWhhdmlvciB3aGVuIGEgbm9uLWFub255bW91cyBmb2xpbyBpcyBlbmNvdW50ZXJlZCBpbiBhbiBhbm9ueW1vdXMgVk1BLCBjaGFuZ2luZyBhIFZNX0JVR19PTl9GT0xJTyB0byBhIFZNX1dBUk5fT05fRk9MSU8gYW5kIHJldHVybmluZyBhbiBlcnJvci4gRnV6emluZyBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpIGFuZCBraHVnZXBhZ2VkIGNhbiBoZWxwIHZlcmlmeSB0aGF0IHRoaXMgcmVmYWN0b3JpbmcgZG9lc24ndCBpbnRyb2R1Y2Ugc3VidGxlIHJlZ3Jlc3Npb25zIGluIFBURSBzY2FubmluZyBvciB1bmluaXRpYWxpemVkIHZhcmlhYmxlIHVzYWdlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow9zqhf[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-04 19:35:31 +0000 UTC FinishedAt: 2026-08-04 19:44:00 +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": "486855239e38a91d3eae26618ccb7845c1764625", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "USERFAULTFD" ], "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": "486855239e38a91d3eae26618ccb7845c1764625", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "USERFAULTFD" ], "series_id": "3c0821a2-e26d-49ef-bfe5-3d086429ffc1" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "madvise_collapse" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjM4PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+NG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O1VTRVJGQVVMVEZEJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bWFkdmlzZV9jb2xsYXBzZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgUFRFIGNoZWNraW5nIGxvZ2ljIGZvciBUSFAgY29sbGFwc2UgaW50byBhIG5ldyBoZWxwZXIgZnVuY3Rpb24gY29sbGFwc2VfY2hlY2tfcHRlKCkuIEl0IGFsc28gbW9kaWZpZXMgdGhlIGJlaGF2aW9yIHdoZW4gYSBub24tYW5vbnltb3VzIGZvbGlvIGlzIGVuY291bnRlcmVkIGluIGFuIGFub255bW91cyBWTUEsIGNoYW5naW5nIGEgVk1fQlVHX09OX0ZPTElPIHRvIGEgVk1fV0FSTl9PTl9GT0xJTyBhbmQgcmV0dXJuaW5nIGFuIGVycm9yLiBGdXp6aW5nIG1hZHZpc2UoTUFEVl9DT0xMQVBTRSkgYW5kIGtodWdlcGFnZWQgY2FuIGhlbHAgdmVyaWZ5IHRoYXQgdGhpcyByZWZhY3RvcmluZyBkb2VzbiYjMzk7dCBpbnRyb2R1Y2Ugc3VidGxlIHJlZ3Jlc3Npb25zIGluIFBURSBzY2FubmluZyBvciB1bmluaXRpYWxpemVkIHZhcmlhYmxlIHVzYWdlLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjM4PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgNTc4YTRkYTYwODNjNTU1MmMyNmYyYTcwZmVkOGFlOWI5YTM0OWY0MFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgQXVnIDQgMTk6Mzg6NTcgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XG5pbmRleCAxNmYzNzEzNWVkODBkLi5iMTg3ZDYxODQ1MmY0IDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XG4mIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3RcbkBAIC0yMjQsNyAmIzQzOzIyNCw3IEBAIGtodWdlcGFnZWQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgd2hlbiBhbnkgVEhQIHNpemUgaXMgZW5hYmxlZFxuIChlaXRoZXIgb2YgdGhlIHBlci1zaXplIGFub24gY29udHJvbCBvciB0aGUgdG9wLWxldmVsIGNvbnRyb2wgYXJlIHNldFxuIHRvIFwmIzM0O2Fsd2F5c1wmIzM0OyBvciBcJiMzNDttYWR2aXNlXCYjMzQ7KSwgYW5kIGl0JiMzOTtsbCBiZSBhdXRvbWF0aWNhbGx5IHNodXRkb3duIHdoZW5cbiBhbGwgVEhQIHNpemVzIGFyZSBkaXNhYmxlZCAod2hlbiBib3RoIHRoZSBwZXItc2l6ZSBhbm9uIGNvbnRyb2wgYW5kIHRoZVxuLXRvcC1sZXZlbCBjb250cm9sIGFyZSBcJiMzNDtuZXZlclwmIzM0OylcbiYjNDM7dG9wLWxldmVsIGNvbnRyb2wgYXJlIFwmIzM0O25ldmVyXCYjMzQ7KS5cbiBcbiBwcm9jZXNzIFRIUCBjb250cm9sc1xuIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG5AQCAtMzAxLDcgJiM0MzszMDEsOSBAQCBiZWluZyByZXBsYWNlZCBieSBhIFBNRCBtYXBwaW5nLCBvciAoMikgcGh5c2ljYWwgcGFnZXMgcmVwbGFjZWQgYnkgb25lXG4gaHVnZXBhZ2Ugb2YgdmFyaW91cyBzaXplcyAoUE1ELXNpemVkIG9yIG1USFApLiBFYWNoIG1heSBoYXBwZW4gaW5kZXBlbmRlbnRseSxcbiBvciB0b2dldGhlciwgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIG1lbW9yeSBhbmQgdGhlIGZhaWx1cmVzIHRoYXQgb2NjdXIuXG4gQXMgc3VjaCwgdGhpcyB2YWx1ZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgcm91Z2hseSBhcyBhIHNpZ24gb2YgcHJvZ3Jlc3MsXG4tYW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZyk6OlxuJiM0MzthbmQgY291bnRlcnMgaW4gL3Byb2Mvdm1zdGF0IGNvbnN1bHRlZCBmb3IgbW9yZSBhY2N1cmF0ZSBhY2NvdW50aW5nLlxuJiM0MztQZXItb3JkZXIgbVRIUCBjb2xsYXBzZSBzdGF0aXN0aWNzIGFyZSBhbHNvIGF2YWlsYWJsZSB1bmRlclxuJiM0Mzsvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9odWdlcGFnZXMtXHUwMDNjc2l6ZVx1MDAzZWtCL3N0YXRzLyk6OlxuIFxuIFx0L3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2Uva2h1Z2VwYWdlZC9wYWdlc19jb2xsYXBzZWRcbiBcbmRpZmYgLS1naXQgYS9tbS9raHVnZXBhZ2VkLmMgYi9tbS9raHVnZXBhZ2VkLmNcbmluZGV4IGIyMzdmNmU3NjYyYTUuLjMzMzhlOWRjMTFkZDAgMTAwNjQ0XG4tLS0gYS9tbS9raHVnZXBhZ2VkLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL2todWdlcGFnZWQuY1xuQEAgLTY1LDYgJiM0Mzs2NSwxMiBAQCBlbnVtIHNjYW5fcmVzdWx0IHtcbiBcdFNDQU5fUEFHRV9ESVJUWV9PUl9XUklURUJBQ0ssXG4gfTtcbiBcbiYjNDM7ZW51bSBwdGVfY2hlY2tfcmVzdWx0IHtcbiYjNDM7XHRQVEVfQ0hFQ0tfU1VDQ0VFRCxcbiYjNDM7XHRQVEVfQ0hFQ0tfRkFJTCxcbiYjNDM7XHRQVEVfQ0hFQ0tfQ09OVElOVUUsXG4mIzQzO307XG4mIzQzO1xuICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UU1xuICNpbmNsdWRlIFx1MDAzY3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oXHUwMDNlXG4gXG5AQCAtMTE5LDYgJiM0MzsxMjUsMjAgQEAgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wge1xuIFx0REVDTEFSRV9CSVRNQVAobXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpO1xuIH07XG4gXG4mIzQzO3N0cnVjdCBwdGVfY2hlY2tfY29udGV4dCB7XG4mIzQzO1x0c3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjO1xuJiM0MztcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hO1xuJiM0MztcdHVuc2lnbmVkIGludCBvcmRlcjtcbiYjNDM7XHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuJiM0MztcdGludCBub25lX29yX3plcm87XG4mIzQzO1x0aW50IHNoYXJlZDtcbiYjNDM7XHRpbnQgdW5tYXBwZWQ7XG4mIzQzO1x0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQ7XG4mIzQzO1x0dW5zaWduZWQgaW50IG1heF9wdGVzX25vbmU7XG4mIzQzO1x0dW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXA7XG4mIzQzO1x0dW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZDtcbiYjNDM7fTtcbiYjNDM7XG4gLyoqXG4gICogc3RydWN0IGtodWdlcGFnZWRfc2NhbiAtIGN1cnNvciBmb3Igc2Nhbm5pbmdcbiAgKiBAbW1faGVhZDogdGhlIGhlYWQgb2YgdGhlIG1tIGxpc3QgdG8gc2NhblxuQEAgLTYyMCw3ICYjNDM7NjQwLDcgQEAgdm9pZCBfX2todWdlcGFnZWRfZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiBcdFx0LypcbiBcdFx0ICogVGhpcyBpcyByZXF1aXJlZCB0byBzZXJpYWxpemUgYWdhaW5zdFxuIFx0XHQgKiBjb2xsYXBzZV90ZXN0X2V4aXQoKSAod2hpY2ggaXMgZ3VhcmFudGVlZCB0byBydW5cbi1cdFx0ICogdW5kZXIgbW1hcCBzZW0gcmVhZCBtb2RlKS4gU3RvcCBoZXJlIChhZnRlciB3ZSByZXR1cm4gYWxsXG4mIzQzO1x0XHQgKiB1bmRlciBtbWFwX2xvY2sgcmVhZCBtb2RlKS4gU3RvcCBoZXJlIChhZnRlciB3ZSByZXR1cm4gYWxsXG4gXHRcdCAqIHBhZ2V0YWJsZXMgd2lsbCBiZSBkZXN0cm95ZWQpIHVudGlsIGtodWdlcGFnZWQgaGFzIGZpbmlzaGVkXG4gXHRcdCAqIHdvcmtpbmcgb24gdGhlIHBhZ2V0YWJsZXMgdW5kZXIgdGhlIG1tYXBfbG9jay5cbiBcdFx0ICovXG5AQCAtNjI5LDYgJiM0Mzs2NDksMTMgQEAgdm9pZCBfX2todWdlcGFnZWRfZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiBcdH1cbiB9XG4gXG4mIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYylcbiYjNDM7e1xuJiM0MztcdG1lbXNldChjYy1cdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cdTAwM2Vub2RlX2xvYWQpKTtcbiYjNDM7XHRub2Rlc19jbGVhcihjYy1cdTAwM2VhbGxvY19ubWFzayk7XG4mIzQzO1x0Yml0bWFwX3plcm8oY2MtXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyB2b2lkIHJlbGVhc2VfcHRlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4ge1xuIFx0bm9kZV9zdGF0X21vZF9mb2xpbyhmb2xpbyxcbkBAIC02NjUsNzYgJiM0Mzs2OTIsMTU2IEBAIHN0YXRpYyB2b2lkIHJlbGVhc2VfcHRlX3BhZ2VzKHB0ZV90ICpwdGUsIHB0ZV90ICpfcHRlLFxuIFx0fVxuIH1cbiBcbiYjNDM7LypcbiYjNDM7ICogcHRlX2lzX3JlZmVyZW5jZWQoKSAtIENoZWNrIGZvciBlbm91Z2ggcmVmZXJlbmNlZCBQVEVzIHRvIGp1c3RpZnkgY29sbGFwc2luZ1xuJiM0MzsgKlxuJiM0MzsgKiBJZiBjb2xsYXBzZSB3YXMgaW5pdGlhdGVkIGJ5IGtodWdlcGFnZWQsIGNoZWNrIHRoYXQgdGhlIHBhZ2UgaGFzIGJlZW5cbiYjNDM7ICogcmVjZW50bHkgYWNjZXNzZWQgKHlvdW5nIHB0ZSkgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IHRydWUgaWYgdGhlIHBhZ2UgaGFzIGJlZW4gcmVjZW50bHkgYWNjZXNzZWQuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgcHRlX2lzX3JlZmVyZW5jZWQoc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLCBwdGVfdCBwdGV2YWwsXG4mIzQzO1x0c3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcilcbiYjNDM7e1xuJiM0MztcdHJldHVybiBjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcbiYjNDM7XHRcdGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHxcbiYjNDM7XHRcdG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS1cdTAwM2V2bV9tbSwgYWRkcikpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjb3VudF9jb2xsYXBzZV9ldmVudCh1bnNpZ25lZCBpbnQgb3JkZXIsIGVudW0gdm1fZXZlbnRfaXRlbSB2bV9ldmVudCxcbiYjNDM7XHRcdGVudW0gbXRocF9zdGF0X2l0ZW0gbXRocF9ldmVudClcbiYjNDM7e1xuJiM0MztcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuJiM0MztcdFx0Y291bnRfdm1fZXZlbnQodm1fZXZlbnQpO1xuJiM0MztcdGNvdW50X210aHBfc3RhdChvcmRlciwgbXRocF9ldmVudCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIHB0ZV9jaGVja19mYWlsKCkgLSBBIHNpbXBsZSBoZWxwZXIgdG8gc2V0IHRoZSBwdGVfY2hlY2tfY29udGV4dCByZXN1bHQgYW5kXG4mIzQzOyAqIHJldHVybiBQVEVfQ0hFQ0tfRkFJTC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrX2ZhaWwoc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgsXG4mIzQzO1x0XHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdClcbiYjNDM7e1xuJiM0MztcdGN0eC1cdTAwM2VyZXN1bHQgPSByZXN1bHQ7XG4mIzQzO1x0cmV0dXJuIFBURV9DSEVDS19GQUlMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBjb2xsYXBzZV9jaGVja19wdGUoKSAtIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZVxuJiM0MzsgKlxuJiM0MzsgKiBDaGVjayBpZiBhIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2UgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjcml0ZXJpYTpcbiYjNDM7ICogLSBtYXhfcHRlXyogdmFsdWVzIGFyZSBub3QgZXhjZWVkZWRcbiYjNDM7ICogLSB1ZmZkIGlzIG5vdCBhY3RpdmVcbiYjNDM7ICogLSBsYXp5ZnJlZSBwcm9wZXJ0aWVzIGFyZSBub3QgcHJlc2VudFxuJiM0MzsgKiAtIG9ubHkgYW5vbnltb3VzIHBhZ2VzIGFyZSBwcmVzZW50XG4mIzQzOyAqXG4mIzQzOyAqIGEgaGVscGVyIHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBpcyB1c2VkIHRvIHBhc3MgYW5kIHN0b3JlIHJlbGV2YW50XG4mIzQzOyAqIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIGNvbGxhcHNlX2NoZWNrX3B0ZSgpIGZ1bmN0aW9uIGFuZCB0aGUgY2FsbGVyLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IFBURV9DSEVDS19TVUNDRUVEIGlmIHRoZSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlLFxuJiM0MzsgKiAgICAgICAgIFBURV9DSEVDS19GQUlMIGlmIHRoZSBQVEUgaXMgbm90IHN1aXRhYmxlIGZvciBjb2xsYXBzZSxcbiYjNDM7ICogICAgICAgICBQVEVfQ0hFQ0tfQ09OVElOVUUgaWYgdGhlIHNjYW4gc2hvdWxkIGNvbnRpbnVlIHRvIGNoZWNrIHRoZSBuZXh0IFBURS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7XG4mIzQzO1x0XHRpZiAoJiM0MzsmIzQzO2N0eC1cdTAwM2Vub25lX29yX3plcm8gXHUwMDNlIGN0eC1cdTAwM2VtYXhfcHRlc19ub25lKSB7XG4mIzQzO1x0XHRcdGNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC1cdTAwM2VvcmRlciwgVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFLFxuJiM0MztcdFx0XHRcdFx0ICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xuJiM0MztcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9OT05FX1BURSk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcbiYjNDM7XHRcdGlmIChjdHgtXHUwMDNldW5tYXBwZWQgPT0gLTEpXG4mIzQzO1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX05PTl9QUkVTRU5UKTtcbiYjNDM7XHRcdGlmICgmIzQzOyYjNDM7Y3R4LVx1MDAzZXVubWFwcGVkIFx1MDAzZSBjdHgtXHUwMDNlbWF4X3B0ZXNfc3dhcCkge1xuJiM0MztcdFx0XHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTtcbiYjNDM7XHRcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfU1dBUF9QVEUpO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKHB0ZV9zd3BfdWZmZF9hbnkocHRldmFsKSlcbiYjNDM7XHRcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfVUZGRCk7XG4mIzQzO1x0XHRyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFO1xuJiM0MztcdH1cbiYjNDM7XHQvKlxuJiM0MztcdCAqIERvbiYjMzk7dCBjb2xsYXBzZSBpZiBhbnkgb2YgdGhlIHNtYWxsIFBURXMgYXJlIGFybWVkIHdpdGggdWZmZFxuJiM0MztcdCAqIHdyaXRlIHByb3RlY3Rpb24uIE1hcmtpbmcgdGhlIG5ldyBodWdlIHBtZCBhcyB3cml0ZSBwcm90ZWN0ZWRcbiYjNDM7XHQgKiBjb3VsZCBicmluZyB1c2VyZmF1bHQgbWVzc2FnZXMgdGhhdCBmYWxsIG91dHNpZGUgb2YgdGhlXG4mIzQzO1x0ICogcmVnaXN0ZXJlZCByYW5nZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAocHRlX3VmZmQocHRldmFsKSlcbiYjNDM7XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xuJiM0MztcbiYjNDM7XHRjdHgtXHUwMDNlZm9saW8gPSB2bV9ub3JtYWxfZm9saW8oY3R4LVx1MDAzZXZtYSwgYWRkciwgcHRldmFsKTtcbiYjNDM7XHRpZiAodW5saWtlbHkoIWN0eC1cdTAwM2Vmb2xpbykgfHwgdW5saWtlbHkoZm9saW9faXNfem9uZV9kZXZpY2UoY3R4LVx1MDAzZWZvbGlvKSkpXG4mIzQzO1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfTlVMTCk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogSWYgdGhlIHZtYSBoYXMgdGhlIFZNX0RST1BQQUJMRSBmbGFnLCB0aGUgY29sbGFwc2Ugd2lsbFxuJiM0MztcdCAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoY3R4LVx1MDAzZWNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2ICEoY3R4LVx1MDAzZXZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fRFJPUFBBQkxFKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShjdHgtXHUwMDNlZm9saW8pIFx1MDAyNlx1MDAyNiAhcHRlX2RpcnR5KHB0ZXZhbCkpXG4mIzQzO1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfTEFaWUZSRUUpO1xuJiM0MztcbiYjNDM7XHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihjdHgtXHUwMDNlZm9saW8pKSB7XG4mIzQzO1x0XHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oY3R4LVx1MDAzZWZvbGlvKSwgY3R4LVx1MDAzZWZvbGlvKTtcbiYjNDM7XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9BTk9OKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGN0eC1cdTAwM2Vmb2xpbykpIHtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBUT0RPOiBTdXBwb3J0IHNoYXJlZCBwYWdlcyB3aXRob3V0IGxlYWRpbmcgdG8gZnVydGhlclxuJiM0MztcdFx0ICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhXG4mIzQzO1x0XHQgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhXG4mIzQzO1x0XHQgKiByZXNjYW4gb2YgdGhlIHNhbWUgcmFuZ2UuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGlmICgmIzQzOyYjNDM7Y3R4LVx1MDAzZXNoYXJlZCBcdTAwM2UgY3R4LVx1MDAzZW1heF9wdGVzX3NoYXJlZCkge1xuJiM0MztcdFx0XHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFLFxuJiM0MztcdFx0XHRcdFx0ICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7XG4mIzQzO1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIFBURV9DSEVDS19TVUNDRUVEO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgcHRlX3QgKnB0ZSwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLFxuIFx0XHR1bnNpZ25lZCBpbnQgb3JkZXIsIHN0cnVjdCBsaXN0X2hlYWQgKmNvbXBvdW5kX3BhZ2VsaXN0KVxuIHtcbi1cdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBvcmRlcik7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBvcmRlcik7XG4gXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbi1cdHN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDtcbiBcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMO1xuIFx0dW5zaWduZWQgbG9uZyBhZGRyID0gc3RhcnRfYWRkcjtcbi1cdHB0ZV90ICpfcHRlO1xuLVx0aW50IG5vbmVfb3JfemVybyA9IDAsIHNoYXJlZCA9IDAsIHJlZmVyZW5jZWQgPSAwO1xuJiM0MztcdHB0ZV90ICpfcHRlLCBwdGV2YWw7XG4mIzQzO1x0aW50IHJlZmVyZW5jZWQgPSAwO1xuIFx0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7XG4mIzQzO1x0ZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVjaztcbiYjNDM7XHRzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0ge1xuJiM0MztcdFx0LmNjID0gY2MsXG4mIzQzO1x0XHQudm1hID0gdm1hLFxuJiM0MztcdFx0Lm9yZGVyID0gb3JkZXIsXG4mIzQzO1x0XHQudW5tYXBwZWQgPSAtMSwgLyogZG9uJiMzOTt0IGNoZWNrIHN3YXAgUFRFcyAqL1xuJiM0MztcdFx0Lm1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKSxcbiYjNDM7XHRcdC5tYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIG9yZGVyKSxcbiYjNDM7XHR9O1xuIFxuIFx0Zm9yIChfcHRlID0gcHRlOyBfcHRlIFx1MDAzYyBwdGUgJiM0MzsgbnJfcGFnZXM7XG4gXHQgICAgIF9wdGUmIzQzOyYjNDM7LCBhZGRyICYjNDM7PSBQQUdFX1NJWkUpIHtcbi1cdFx0cHRlX3QgcHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7XG4tXHRcdGlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHtcbi1cdFx0XHRpZiAoJiM0MzsmIzQzO25vbmVfb3JfemVybyBcdTAwM2UgbWF4X3B0ZXNfbm9uZSkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfTk9ORV9QVEU7XG4tXHRcdFx0XHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcbi1cdFx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTtcbi1cdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdH1cbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9OT05fUFJFU0VOVDtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVx0XHRpZiAocHRlX3VmZmQocHRldmFsKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0cGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRldmFsKTtcbi1cdFx0aWYgKHVubGlrZWx5KCFwYWdlKSB8fCB1bmxpa2VseShpc196b25lX2RldmljZV9wYWdlKHBhZ2UpKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbi1cdFx0Vk1fQlVHX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcbi1cdFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxuLVx0XHQgKi9cbi1cdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2ICEodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9EUk9QUEFCTEUpIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgXHUwMDI2XHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTtcbiYjNDM7XHRcdHB0ZXZhbCA9IHB0ZXBfZ2V0KF9wdGUpO1xuJiM0MztcdFx0cHRlX2NoZWNrID0gY29sbGFwc2VfY2hlY2tfcHRlKHB0ZXZhbCwgYWRkciwgXHUwMDI2Y3R4KTtcbiYjNDM7XHRcdGZvbGlvID0gY3R4LmZvbGlvO1xuJiM0MztcdFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkge1xuJiM0MztcdFx0XHRyZXN1bHQgPSBjdHgucmVzdWx0O1xuIFx0XHRcdGdvdG8gb3V0O1xuIFx0XHR9XG4mIzQzO1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4gXG4tXHRcdC8qIFNlZSBjb2xsYXBzZV9zY2FuX3BtZCgpLiAqL1xuLVx0XHRpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChmb2xpbykpIHtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFRPRE86IFN1cHBvcnQgc2hhcmVkIHBhZ2VzIHdpdGhvdXQgbGVhZGluZyB0byBmdXJ0aGVyXG4tXHRcdFx0ICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhXG4tXHRcdFx0ICogc2hhcmVkIG1heSBjYXVzZSBhIGZ1dHVyZSBoaWdoZXIgb3JkZXIgY29sbGFwc2Ugb24gYVxuLVx0XHRcdCAqIHJlc2NhbiBvZiB0aGUgc2FtZSByYW5nZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAoJiM0MzsmIzQzO3NoYXJlZCBcdTAwM2UgbWF4X3B0ZXNfc2hhcmVkKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFO1xuLVx0XHRcdFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xuLVx0XHRcdFx0Z290byBvdXQ7XG4tXHRcdFx0fVxuLVx0XHR9XG4gXHRcdC8qXG4gXHRcdCAqIFRPRE86IEluIHNvbWUgY2FzZXMgb2YgcGFydGlhbGx5LW1hcHBlZCBmb2xpb3MsIHdlJiMzOTtkIGFjdHVhbGx5XG4gXHRcdCAqIHdhbnQgdG8gY29sbGFwc2UuXG5AQCAtNzU5LDggJiM0Mzs4NjYsOCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFxuIFx0XHQvKlxuIFx0XHQgKiBXZSBjYW4gZG8gaXQgYmVmb3JlIGZvbGlvX2lzb2xhdGVfbHJ1IGJlY2F1c2UgdGhlXG4tXHRcdCAqIGZvbGlvIGNhbiYjMzk7dCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBQR19sb2NrXG4tXHRcdCAqIGlzIG5lZWRlZCB0byBzZXJpYWxpemUgYWdhaW5zdCBzcGxpdF9odWdlX3BhZ2VcbiYjNDM7XHRcdCAqIGZvbGlvIGNhbiYjMzk7dCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBmb2xpbyBsb2NrXG4mIzQzO1x0XHQgKiBpcyBuZWVkZWQgdG8gc2VyaWFsaXplIGFnYWluc3Qgc3BsaXRfaHVnZV9wYWdlKClcbiBcdFx0ICogd2hlbiBpbnZva2VkIGZyb20gdGhlIFZNLlxuIFx0XHQgKi9cbiBcdFx0aWYgKCFmb2xpb190cnlsb2NrKGZvbGlvKSkge1xuQEAgLTc4Niw3ICYjNDM7ODkzLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0fVxuIFxuIFx0XHQvKlxuLVx0XHQgKiBJc29sYXRlIHRoZSBwYWdlIHRvIGF2b2lkIGNvbGxhcHNpbmcgYW4gaHVnZXBhZ2VcbiYjNDM7XHRcdCAqIElzb2xhdGUgdGhlIGZvbGlvIHRvIGF2b2lkIGNvbGxhcHNpbmcgYSBodWdlcGFnZVxuIFx0XHQgKiBjdXJyZW50bHkgaW4gdXNlIGJ5IHRoZSBWTS5cbiBcdFx0ICovXG4gXHRcdGlmICghZm9saW9faXNvbGF0ZV9scnUoZm9saW8pKSB7XG5AQCAtODAzLDE0ICYjNDM7OTEwLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuIFx0XHRcdGxpc3RfYWRkX3RhaWwoXHUwMDI2Zm9saW8tXHUwMDNlbHJ1LCBjb21wb3VuZF9wYWdlbGlzdCk7XG4gbmV4dDpcbi1cdFx0Lypcbi1cdFx0ICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZXJlIGlzXG4tXHRcdCAqIGVub3VnaCB5b3VuZyBwdGUgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlXG4tXHRcdCAqL1xuLVx0XHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fFxuLVx0XHQgICAgIGZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHxcbi1cdFx0ICAgICBtbXVfbm90aWZpZXJfdGVzdF95b3VuZyh2bWEtXHUwMDNldm1fbW0sIGFkZHIpKSlcbiYjNDM7XHRcdGlmIChwdGVfaXNfcmVmZXJlbmNlZChjYywgcHRldmFsLCBmb2xpbywgdm1hLCBhZGRyKSlcbiBcdFx0XHRyZWZlcmVuY2VkJiM0MzsmIzQzOztcbiBcdH1cbiBcbkBAIC04MTgsMTMgJiM0Mzs5MTgsMTMgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0cmVzdWx0ID0gU0NBTl9MQUNLX1JFRkVSRU5DRURfUEFHRTtcbiBcdH0gZWxzZSB7XG4gXHRcdHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcbi1cdFx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIG5vbmVfb3JfemVybyxcbiYjNDM7XHRcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxuIFx0XHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbiBcdFx0cmV0dXJuIHJlc3VsdDtcbiBcdH1cbiBvdXQ6XG4gXHRyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUsIGNvbXBvdW5kX3BhZ2VsaXN0KTtcbi1cdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sXG4mIzQzO1x0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIGN0eC5ub25lX29yX3plcm8sXG4gXHRcdFx0XHRcdCAgICByZWZlcmVuY2VkLCByZXN1bHQsIG9yZGVyKTtcbiBcdHJldHVybiByZXN1bHQ7XG4gfVxuQEAgLTkwNCw3ICYjNDM7MTAwNCw3IEBAIHN0YXRpYyB2b2lkIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfZmFpbGVkKHB0ZV90ICpwdGUsXG4gXHQgKiBSZS1lc3RhYmxpc2ggdGhlIFBNRCB0byBwb2ludCB0byB0aGUgb3JpZ2luYWwgcGFnZSB0YWJsZVxuIFx0ICogZW50cnkuIFJlc3RvcmluZyBQTUQgbmVlZHMgdG8gYmUgZG9uZSBwcmlvciB0byByZWxlYXNpbmdcbiBcdCAqIHBhZ2VzLiBTaW5jZSBwYWdlcyBhcmUgc3RpbGwgaXNvbGF0ZWQgYW5kIGxvY2tlZCBoZXJlLFxuLVx0ICogYWNxdWlyaW5nIGFub25fdm1hX2xvY2tfd3JpdGUgaXMgdW5uZWNlc3NhcnkuXG4mIzQzO1x0ICogYWNxdWlyaW5nIGFub25fdm1hX2xvY2tfd3JpdGUoKSBpcyB1bm5lY2Vzc2FyeS5cbiBcdCAqL1xuIFx0cG1kX3B0bCA9IHBtZF9sb2NrKHZtYS1cdTAwM2V2bV9tbSwgcG1kKTtcbiBcdHBtZF9wb3B1bGF0ZSh2bWEtXHUwMDNldm1fbW0sIHBtZCwgcG1kX3BndGFibGUob3JpZ19wbWQpKTtcbkBAIC0xMDc4LDkgJiM0MzsxMTc4LDkgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxcbiBcdFx0cmV0dXJuIFNDQU5fVk1BX0NIRUNLO1xuIFx0LypcbiBcdCAqIEFub24gVk1BIGV4cGVjdGVkLCB0aGUgYWRkcmVzcyBtYXkgYmUgdW5tYXBwZWQgdGhlblxuLVx0ICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYXF1aXJlZCB0aGUgbW1hcF9sb2NrLlxuJiM0MztcdCAqIHJlbWFwcGVkIHRvIGZpbGUgYWZ0ZXIga2h1Z2VwYWdlZCByZWFjcXVpcmVkIHRoZSBtbWFwX2xvY2suXG4gXHQgKlxuLVx0ICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzIG1heSByZXR1cm4gdHJ1ZSBmb3IgcXVhbGlmaWVkIGZpbGVcbiYjNDM7XHQgKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoKSBtYXkgcmV0dXJuIHRydWUgZm9yIHF1YWxpZmllZCBmaWxlXG4gXHQgKiB2bWFzLlxuIFx0ICovXG4gXHRpZiAoZXhwZWN0X2Fub24gXHUwMDI2XHUwMDI2ICghKCp2bWFwKS1cdTAwM2Vhbm9uX3ZtYSB8fCAhdm1hX2lzX2Fub255bW91cygqdm1hcCkpKVxuQEAgLTExMzYsNyAmIzQzOzEyMzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjaGVja19wbWRfc3RpbGxfdmFsaWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXG4gLypcbiAgKiBCcmluZyBtaXNzaW5nIHBhZ2VzIGluIGZyb20gc3dhcCwgdG8gY29tcGxldGUgVEhQIGNvbGxhcHNlLlxuLSAqIE9ubHkgZG9uZSBpZiBraHVnZXBhZ2VkX3NjYW5fcG1kIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXG4mIzQzOyAqIE9ubHkgZG9uZSBpZiBjb2xsYXBzZV9zY2FuX3BtZCgpIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXG4gICpcbiAgKiBGb3IgbVRIUCBvcmRlcnMgdGhlIGZ1bmN0aW9uIGJhaWxzIG9uIHRoZSBmaXJzdCBzd2FwIGVudHJ5LCBiZWNhdXNlXG4gICogZmF1bHRpbmcgcGFnZXMgYmFjayBpbiBkdXJpbmcgY29sbGFwc2UgY291bGQgcmUtcG9wdWxhdGUgUFRFcyB0aGF0XG5AQCAtMTIwNCw3ICYjNDM7MTMwNCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcdFx0cHRlID0gTlVMTDtcbiBcbiBcdFx0Lypcbi1cdFx0ICogZG9fc3dhcF9wYWdlIHJldHVybnMgVk1fRkFVTFRfUkVUUlkgd2l0aCByZWxlYXNlZCBtbWFwX2xvY2suXG4mIzQzO1x0XHQgKiBkb19zd2FwX3BhZ2UoKSByZXR1cm5zIFZNX0ZBVUxUX1JFVFJZIHdpdGggcmVsZWFzZWQgbW1hcF9sb2NrLlxuIFx0XHQgKiBOb3RlIHdlIHRyZWF0IFZNX0ZBVUxUX1JFVFJZIGFzIFZNX0ZBVUxUX0VSUk9SIGhlcmUgYmVjYXVzZVxuIFx0XHQgKiB3ZSBkbyBub3QgcmV0cnkgaGVyZSBhbmQgc3dhcCBlbnRyeSB3aWxsIHJlbWFpbiBpbiBwYWdldGFibGVcbiBcdFx0ICogcmVzdWx0aW5nIGluIGxhdGVyIGZhaWx1cmUuXG5AQCAtMTI0NywxNSAmIzQzOzEzNDcsMTIgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnVcbiBcdGZvbGlvID0gX19mb2xpb19hbGxvYyhnZnAsIG9yZGVyLCBub2RlLCBcdTAwMjZjYy1cdTAwM2VhbGxvY19ubWFzayk7XG4gXHRpZiAoIWZvbGlvKSB7XG4gXHRcdCpmb2xpb3AgPSBOVUxMO1xuLVx0XHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcbi1cdFx0XHRjb3VudF92bV9ldmVudChUSFBfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTtcbi1cdFx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTtcbiYjNDM7XHRcdGNvdW50X2NvbGxhcHNlX2V2ZW50KG9yZGVyLCBUSFBfQ09MTEFQU0VfQUxMT0NfRkFJTEVELFxuJiM0MztcdFx0XHRcdCAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7XG4gXHRcdHJldHVybiBTQ0FOX0FMTE9DX0hVR0VfUEFHRV9GQUlMO1xuIFx0fVxuIFxuLVx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQyk7XG4tXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQyk7XG4mIzQzO1x0Y291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQywgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTtcbiBcbiBcdGlmICh1bmxpa2VseShtZW1fY2dyb3VwX2NoYXJnZShmb2xpbywgbW0sIGdmcCkpKSB7XG4gXHRcdGZvbGlvX3B1dChmb2xpbyk7XG5AQCAtMTI3MSw3ICYjNDM7MTM2OCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGFsbG9jX2NoYXJnZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKipmb2xpb3AsIHN0cnVjdCBtbV9zdHJ1XG4gfVxuIFxuIC8qXG4tICogY29sbGFwc2VfaHVnZV9wYWdlIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kXG4mIzQzOyAqIGNvbGxhcHNlX2h1Z2VfcGFnZSgpIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kXG4gICogd2lsbCBhbHdheXMgcmV0dXJuIHdpdGggdGhlIGxvY2sgdW5sb2NrZWQsIHRvIGF2b2lkIGhvbGRpbmcgdGhlIG1tYXBfbG9ja1xuICAqIHdoaWxlIGFsbG9jYXRpbmcgYSBUSFAsIGFzIHRoYXQgY291bGQgdHJpZ2dlciBkaXJlY3QgcmVjbGFpbS9jb21wYWN0aW9uLlxuICAqIE5vdGUgdGhhdCB0aGUgVk1BIG11c3QgYmUgcmVjaGVja2VkIGFmdGVyIGdyYWJiaW5nIHRoZSBtbWFwX2xvY2sgYWdhaW4uXG5AQCAtMTMxOCw3ICYjNDM7MTQxNSw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXG4gXHRpZiAodW5tYXBwZWQpIHtcbiBcdFx0Lypcbi1cdFx0ICogX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluIHdpbGwgcmV0dXJuIHdpdGggbW1hcF9sb2NrXG4mIzQzO1x0XHQgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4oKSB3aWxsIHJldHVybiB3aXRoIG1tYXBfbG9ja1xuIFx0XHQgKiByZWxlYXNlZCB3aGVuIGl0IGZhaWxzLiBTbyB3ZSBqdW1wIG91dF9ub2xvY2sgZGlyZWN0bHkgaW5cbiBcdFx0ICogdGhhdCBjYXNlLiAgQ29udGludWluZyB0byBjb2xsYXBzZSBjYXVzZXMgaW5jb25zaXN0ZW5jeS5cbiBcdFx0ICovXG5AQCAtMTMzMSw4ICYjNDM7MTQyOCw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcbiBcdC8qXG4gXHQgKiBQcmV2ZW50IGFsbCBhY2Nlc3MgdG8gcGFnZXRhYmxlcyB3aXRoIHRoZSBleGNlcHRpb24gb2Zcbi1cdCAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHB0ZXBfY2xlYXJfZmx1c2ggYW5kIHRoZSBWTVxuLVx0ICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayAmIzQzOyBQR19sb2NrLlxuJiM0MztcdCAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHBtZHBfY29sbGFwc2VfZmx1c2goKSBhbmQgdGhlIFZNXG4mIzQzO1x0ICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayAmIzQzOyBmb2xpbyBsb2NrLlxuIFx0ICpcbiBcdCAqIFVGRkRJT19NT1ZFIGlzIHByZXZlbnRlZCB0byByYWNlIGFzIHdlbGwgdGhhbmtzIHRvIHRoZVxuIFx0ICogbW1hcF9sb2NrLlxuQEAgLTEzODksOSAmIzQzOzE0ODYsOSBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFx0XHRzcGluX2xvY2socG1kX3B0bCk7XG4gXHRcdFZNX1dBUk5fT05fT05DRSghcG1kX25vbmUoKnBtZCkpO1xuIFx0XHQvKlxuLVx0XHQgKiBXZSBjYW4gb25seSB1c2Ugc2V0X3BtZF9hdCB3aGVuIGVzdGFibGlzaGluZ1xuJiM0MztcdFx0ICogV2UgY2FuIG9ubHkgdXNlIHNldF9wbWRfYXQoKSB3aGVuIGVzdGFibGlzaGluZ1xuIFx0XHQgKiBodWdlcG1kcyBhbmQgbmV2ZXIgZm9yIGVzdGFibGlzaGluZyByZWd1bGFyIHBtZHMgdGhhdFxuLVx0XHQgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlIGZvciB0aGF0XG4mIzQzO1x0XHQgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlKCkgZm9yIHRoYXRcbiBcdFx0ICovXG4gXHRcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwbWRfcGd0YWJsZShfcG1kKSk7XG4gXHRcdHNwaW5fdW5sb2NrKHBtZF9wdGwpO1xuQEAgLTE0MzksNyAmIzQzOzE1MzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFx0XHRcdHNwaW5fbG9ja19uZXN0ZWQocHRlX3B0bCwgU0lOR0xFX0RFUFRIX05FU1RJTkcpO1xuIFx0XHRwbWRfcG9wdWxhdGUobW0sIHBtZCwgcG1kX3BndGFibGUoX3BtZCkpO1xuIFx0XHRtYXBfYW5vbl9mb2xpb19wdGVfbm9wZihmb2xpbywgcHRlLCB2bWEsIHN0YXJ0X2FkZHIsXG4tXHRcdFx0XHRcdCAgLyp1ZmZkX3dwPSovIGZhbHNlKTtcbiYjNDM7XHRcdFx0XHRcdCAgLyp1ZmZkPSovIGZhbHNlKTtcbiBcdFx0aWYgKHB0ZV9wdGwgIT0gcG1kX3B0bClcbiBcdFx0XHRzcGluX3VubG9jayhwdGVfcHRsKTtcbiBcdH1cbkBAIC0xNDQ5LDEwICYjNDM7MTU0NiwxMCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFxuIFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xuIG91dF91cF93cml0ZTpcbi1cdGlmIChhbm9uX3ZtYV9sb2NrZWQpXG4tXHRcdGFub25fdm1hX3VubG9ja193cml0ZSh2bWEtXHUwMDNlYW5vbl92bWEpO1xuIFx0aWYgKHB0ZSlcbiBcdFx0cHRlX3VubWFwKHB0ZSk7XG4mIzQzO1x0aWYgKGFub25fdm1hX2xvY2tlZClcbiYjNDM7XHRcdGFub25fdm1hX3VubG9ja193cml0ZSh2bWEtXHUwMDNlYW5vbl92bWEpO1xuIFx0bW1hcF93cml0ZV91bmxvY2sobW0pO1xuIG91dF9ub2xvY2s6XG4gXHRpZiAoZm9saW8pXG5AQCAtMTU5Myw0MiAmIzQzOzE2OTAsNDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsXG4gXHRcdGJvb2wgKmxvY2tfZHJvcHBlZCwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKVxuIHtcbi1cdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIEhQQUdFX1BNRF9PUkRFUik7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc3dhcCA9IGNvbGxhcHNlX21heF9wdGVzX3N3YXAoY2MsIEhQQUdFX1BNRF9PUkRFUik7XG4tXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKTtcbiBcdGVudW0gdHZhX3R5cGUgdHZhX2ZsYWdzID0gY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCA/IFRWQV9LSFVHRVBBR0VEIDogVFZBX0ZPUkNFRF9DT0xMQVBTRTtcbiBcdHBtZF90ICpwbWQ7XG4gXHRwdGVfdCAqcHRlLCAqX3B0ZSwgcHRldmFsO1xuIFx0aW50IGk7XG4tXHRpbnQgbm9uZV9vcl96ZXJvID0gMCwgc2hhcmVkID0gMCwgcmVmZXJlbmNlZCA9IDA7XG4tXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcbi1cdHN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDtcbiBcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMO1xuJiM0MztcdGludCByZWZlcmVuY2VkID0gMDtcbiYjNDM7XHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcbiBcdHVuc2lnbmVkIGxvbmcgYWRkcjtcbiBcdHVuc2lnbmVkIGxvbmcgZW5hYmxlZF9vcmRlcnM7XG4gXHRzcGlubG9ja190ICpwdGw7XG4tXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERSwgdW5tYXBwZWQgPSAwO1xuJiM0MztcdGludCBub2RlID0gTlVNQV9OT19OT0RFO1xuJiM0MztcdGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2s7XG4gXG4gXHRWTV9CVUdfT04oc3RhcnRfYWRkciBcdTAwMjYgfkhQQUdFX1BNRF9NQVNLKTtcbiBcbiYjNDM7XHRzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0ge1xuJiM0MztcdFx0LmNjID0gY2MsXG4mIzQzO1x0XHQudm1hID0gdm1hLFxuJiM0MztcdFx0Lm9yZGVyID0gSFBBR0VfUE1EX09SREVSLFxuJiM0MztcdFx0Lm1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIEhQQUdFX1BNRF9PUkRFUiksXG4mIzQzO1x0XHQubWF4X3B0ZXNfc3dhcCA9IGNvbGxhcHNlX21heF9wdGVzX3N3YXAoY2MsIEhQQUdFX1BNRF9PUkRFUiksXG4mIzQzO1x0XHQubWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBIUEFHRV9QTURfT1JERVIpLFxuJiM0MztcdH07XG4mIzQzO1xuIFx0cmVzdWx0ID0gZmluZF9wbWRfb3JfdGhwX29yX25vbmUobW0sIHN0YXJ0X2FkZHIsIFx1MDAyNnBtZCk7XG4gXHRpZiAocmVzdWx0ICE9IFNDQU5fU1VDQ0VFRCkge1xuIFx0XHRjYy1cdTAwM2Vwcm9ncmVzcyYjNDM7JiM0Mzs7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuLVx0Yml0bWFwX3plcm8oY2MtXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpO1xuLVx0bWVtc2V0KGNjLVx1MDAzZW5vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLVx1MDAzZW5vZGVfbG9hZCkpO1xuLVx0bm9kZXNfY2xlYXIoY2MtXHUwMDNlYWxsb2Nfbm1hc2spO1xuJiM0MztcdGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTtcbiBcbiBcdGVuYWJsZWRfb3JkZXJzID0gY29sbGFwc2VfcG9zc2libGVfb3JkZXJzKHZtYSwgdm1hLVx1MDAzZXZtX2ZsYWdzLCB0dmFfZmxhZ3MpO1xuIFxuIFx0LypcbiBcdCAqIElmIFBNRCBpcyB0aGUgb25seSBlbmFibGVkIG9yZGVyLCBlbmZvcmNlIG1heF9wdGVzX25vbmUsIG90aGVyd2lzZVxuLVx0ICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS5cbiYjNDM7XHQgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLiBUaGUgYml0bWFwXG4mIzQzO1x0ICogaXMgdGhlbiBjaGVja2VkIGFnYWluIGluIG10aHBfY29sbGFwc2UoKSBmb3IgZWFjaCBhdHRlbXB0ZWQgb3JkZXIuXG4gXHQgKi9cbiBcdGlmIChlbmFibGVkX29yZGVycyAhPSBCSVQoSFBBR0VfUE1EX09SREVSKSlcbi1cdFx0bWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7XG4mIzQzO1x0XHRjdHgubWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7XG4gXG4gXHRwdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIHN0YXJ0X2FkZHIsIFx1MDAyNnB0bCk7XG4gXHRpZiAoIXB0ZSkge1xuQEAgLTE2NDQsODQgJiM0MzsxNzQ2LDE0IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIFx0XHRjYy1cdTAwM2Vwcm9ncmVzcyYjNDM7JiM0Mzs7XG4gXG4tXHRcdGlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHtcbi1cdFx0XHRpZiAoJiM0MzsmIzQzO25vbmVfb3JfemVybyBcdTAwM2UgbWF4X3B0ZXNfbm9uZSkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfTk9ORV9QVEU7XG4tXHRcdFx0XHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUpO1xuLVx0XHRcdFx0Y291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUixcbi1cdFx0XHRcdFx0XHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdGlmICghcHRlX3ByZXNlbnQocHRldmFsKSkge1xuLVx0XHRcdGlmICgmIzQzOyYjNDM7dW5tYXBwZWQgXHUwMDNlIG1heF9wdGVzX3N3YXApIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX1NXQVBfUFRFO1xuLVx0XHRcdFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NXQVBfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsXG4tXHRcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTtcbi1cdFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHRcdH1cbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEFsd2F5cyBiZSBzdHJpY3Qgd2l0aCB1ZmZkLXdwXG4tXHRcdFx0ICogZW5hYmxlZCBzd2FwIGVudHJpZXMuICBQbGVhc2Ugc2VlXG4tXHRcdFx0ICogY29tbWVudCBiZWxvdyBmb3IgcHRlX3VmZmQoKS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAocHRlX3N3cF91ZmZkX2FueShwdGV2YWwpKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9VRkZEO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdGlmIChwdGVfdWZmZChwdGV2YWwpKSB7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBEb24mIzM5O3QgY29sbGFwc2UgdGhlIHBhZ2UgaWYgYW55IG9mIHRoZSBzbWFsbFxuLVx0XHRcdCAqIFBURXMgYXJlIGFybWVkIHdpdGggdWZmZCB3cml0ZSBwcm90ZWN0aW9uLlxuLVx0XHRcdCAqIEhlcmUgd2UgY2FuIGFsc28gbWFyayB0aGUgbmV3IGh1Z2UgcG1kIGFzXG4tXHRcdFx0ICogd3JpdGUgcHJvdGVjdGVkIGlmIGFueSBvZiB0aGUgc21hbGwgb25lcyBpc1xuLVx0XHRcdCAqIG1hcmtlZCBidXQgdGhhdCBjb3VsZCBicmluZyB1bmtub3duXG4tXHRcdFx0ICogdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbHMgb3V0c2lkZSBvZlxuLVx0XHRcdCAqIHRoZSByZWdpc3RlcmVkIHJhbmdlLiAgU28sIGp1c3QgYmUgc2ltcGxlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XG4tXHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdH1cbi1cbi1cdFx0cGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRldmFsKTtcbi1cdFx0aWYgKHVubGlrZWx5KCFwYWdlKSB8fCB1bmxpa2VseShpc196b25lX2RldmljZV9wYWdlKHBhZ2UpKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMO1xuLVx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHR9XG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICogSWYgdGhlIHZtYSBoYXMgdGhlIFZNX0RST1BQQUJMRSBmbGFnLCB0aGUgY29sbGFwc2Ugd2lsbFxuLVx0XHQgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuXG4tXHRcdCAqL1xuLVx0XHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjYgISh2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpb190ZXN0X2xhenlmcmVlKGZvbGlvKSBcdTAwMjZcdTAwMjYgIXB0ZV9kaXJ0eShwdGV2YWwpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX0xBWllGUkVFO1xuJiM0MztcdFx0cHRlX2NoZWNrID0gY29sbGFwc2VfY2hlY2tfcHRlKHB0ZXZhbCwgYWRkciwgXHUwMDI2Y3R4KTtcbiYjNDM7XHRcdGZvbGlvID0gY3R4LmZvbGlvO1xuJiM0MztcdFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkge1xuJiM0MztcdFx0XHRyZXN1bHQgPSBjdHgucmVzdWx0O1xuIFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuIFx0XHR9XG4tXG4tXHRcdGlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9BTk9OO1xuLVx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHR9XG4tXG4tXHRcdC8qXG4tXHRcdCAqIFdlIHRyZWF0IGEgc2luZ2xlIHBhZ2UgYXMgc2hhcmVkIGlmIGFueSBwYXJ0IG9mIHRoZSBUSFBcbi1cdFx0ICogaXMgc2hhcmVkLlxuLVx0XHQgKi9cbi1cdFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7XG4tXHRcdFx0aWYgKCYjNDM7JiM0MztzaGFyZWQgXHUwMDNlIG1heF9wdGVzX3NoYXJlZCkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfU0hBUkVEX1BURTtcbi1cdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsXG4tXHRcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHR9XG4mIzQzO1x0XHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4gXG4gXHRcdC8qIFNldCBiaXQgZm9yIG9jY3VwaWVkIHBhZ2VzICovXG4gXHRcdF9fc2V0X2JpdChpLCBjYy1cdTAwM2VtdGhwX3ByZXNlbnRfcHRlcyk7XG5AQCAtMTc0OSwzMSAmIzQzOzE3ODEsMjEgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdC8qXG4gXHRcdCAqIENoZWNrIGlmIHRoZSBwYWdlIGhhcyBhbnkgR1VQIChvciBvdGhlciBleHRlcm5hbCkgcGlucy5cbiBcdFx0ICpcbi1cdFx0ICogSGVyZSB0aGUgY2hlY2sgbWF5IGJlIHJhY3k6XG4tXHRcdCAqIGl0IG1heSBzZWUgZm9saW9fbWFwY291bnQoKSBcdTAwM2UgZm9saW9fcmVmX2NvdW50KCkuXG4tXHRcdCAqIEJ1dCBzdWNoIGNhc2UgaXMgZXBoZW1lcmFsIHdlIGNvdWxkIGFsd2F5cyByZXRyeSBjb2xsYXBzZVxuLVx0XHQgKiBsYXRlci4gIEhvd2V2ZXIgaXQgbWF5IHJlcG9ydCBmYWxzZSBwb3NpdGl2ZSBpZiB0aGUgcGFnZVxuLVx0XHQgKiBoYXMgZXhjZXNzaXZlIEdVUCBwaW5zIChpLmUuIDUxMikuICBBbnl3YXkgdGhlIHNhbWUgY2hlY2tcbi1cdFx0ICogd2lsbCBiZSBkb25lIGFnYWluIGxhdGVyIHRoZSByaXNrIHNlZW1zIGxvdy5cbiYjNDM7XHRcdCAqIEhlcmUgdGhlIGNoZWNrIGlzIHJhY3ksIGJ1dCBzdWNoIGNhc2UgaXMgZXBoZW1lcmFsIGFuZFxuJiM0MztcdFx0ICogd2UgY291bGQgYWx3YXlzIHJldHJ5IGNvbGxhcHNlIGxhdGVyLiBBbnl3YXkgdGhlIHNhbWVcbiYjNDM7XHRcdCAqIGNoZWNrIHdpbGwgYmUgZG9uZSBhZ2FpbiBsYXRlciB0aGUgcmlzayBzZWVtcyBsb3cuXG4gXHRcdCAqL1xuIFx0XHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pKSB7XG4gXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX0NPVU5UO1xuIFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuIFx0XHR9XG4gXG4tXHRcdC8qXG4tXHRcdCAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpc1xuLVx0XHQgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZVxuLVx0XHQgKi9cbi1cdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcbi1cdFx0ICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XG4tXHRcdCAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVx1MDAzZXZtX21tLCBhZGRyKSkpXG4mIzQzO1x0XHRpZiAocHRlX2lzX3JlZmVyZW5jZWQoY2MsIHB0ZXZhbCwgZm9saW8sIHZtYSwgYWRkcikpXG4gXHRcdFx0cmVmZXJlbmNlZCYjNDM7JiM0Mzs7XG4gXHR9XG4gXHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjZcbiBcdFx0ICAgKCFyZWZlcmVuY2VkIHx8XG4tXHRcdCAgICAodW5tYXBwZWQgXHUwMDI2XHUwMDI2IHJlZmVyZW5jZWQgXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xuJiM0MztcdFx0ICAgIChjdHgudW5tYXBwZWQgXHUwMDI2XHUwMDI2IHJlZmVyZW5jZWQgXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xuIFx0XHRyZXN1bHQgPSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFO1xuIFx0fSBlbHNlIHtcbiBcdFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xuQEAgLTE3ODEsMTYgJiM0MzsxODAzLDE2IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIG91dF91bm1hcDpcbiBcdHB0ZV91bm1hcF91bmxvY2socHRlLCBwdGwpO1xuIFx0aWYgKHJlc3VsdCA9PSBTQ0FOX1NVQ0NFRUQpIHtcbi1cdFx0LyogY29sbGFwc2VfaHVnZV9wYWdlIGV4cGVjdHMgdGhlIGxvY2sgdG8gYmUgZHJvcHBlZCBiZWZvcmUgY2FsbGluZyAqL1xuJiM0MztcdFx0LyogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovXG4gXHRcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xuIFx0XHRyZXN1bHQgPSBtdGhwX2NvbGxhcHNlKG1tLCBzdGFydF9hZGRyLCByZWZlcmVuY2VkLFxuLVx0XHRcdFx0ICAgICAgIHVubWFwcGVkLCBjYywgZW5hYmxlZF9vcmRlcnMpO1xuJiM0MztcdFx0XHRcdCAgICAgICBjdHgudW5tYXBwZWQsIGNjLCBlbmFibGVkX29yZGVycyk7XG4gXHRcdC8qIG1tYXBfbG9jayB3YXMgcmVsZWFzZWQgYWJvdmUsIHNldCBsb2NrX2Ryb3BwZWQgKi9cbiBcdFx0KmxvY2tfZHJvcHBlZCA9IHRydWU7XG4gXHR9XG4gb3V0OlxuIFx0dHJhY2VfbW1fa2h1Z2VwYWdlZF9zY2FuX3BtZChtbSwgZm9saW8sIHJlZmVyZW5jZWQsXG4tXHRcdFx0XHQgICAgIG5vbmVfb3JfemVybywgcmVzdWx0LCB1bm1hcHBlZCk7XG4mIzQzO1x0XHRcdFx0ICAgICBjdHgubm9uZV9vcl96ZXJvLCByZXN1bHQsIGN0eC51bm1hcHBlZCk7XG4gXHRyZXR1cm4gcmVzdWx0O1xuIH1cbiBcbkBAIC0yNjkxLDggJiM0MzsyNzEzLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIFx0cHJlc2VudCA9IDA7XG4gXHRzd2FwID0gMDtcbi1cdG1lbXNldChjYy1cdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cdTAwM2Vub2RlX2xvYWQpKTtcbi1cdG5vZGVzX2NsZWFyKGNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbiYjNDM7XHRjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7XG4gXHRyY3VfcmVhZF9sb2NrKCk7XG4gXHR4YXNfZm9yX2VhY2goXHUwMDI2eGFzLCBmb2xpbywgc3RhcnQgJiM0MzsgSFBBR0VfUE1EX05SIC0gMSkge1xuIFx0XHRpZiAoeGFzX3JldHJ5KFx1MDAyNnhhcywgZm9saW8pKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjM5PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjRtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtVU0VSRkFVTFRGRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O21hZHZpc2VfY29sbGFwc2UmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIFBURSBjaGVja2luZyBsb2dpYyBmb3IgVEhQIGNvbGxhcHNlIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGNvbGxhcHNlX2NoZWNrX3B0ZSgpLiBJdCBhbHNvIG1vZGlmaWVzIHRoZSBiZWhhdmlvciB3aGVuIGEgbm9uLWFub255bW91cyBmb2xpbyBpcyBlbmNvdW50ZXJlZCBpbiBhbiBhbm9ueW1vdXMgVk1BLCBjaGFuZ2luZyBhIFZNX0JVR19PTl9GT0xJTyB0byBhIFZNX1dBUk5fT05fRk9MSU8gYW5kIHJldHVybmluZyBhbiBlcnJvci4gRnV6emluZyBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpIGFuZCBraHVnZXBhZ2VkIGNhbiBoZWxwIHZlcmlmeSB0aGF0IHRoaXMgcmVmYWN0b3JpbmcgZG9lc24mIzM5O3QgaW50cm9kdWNlIHN1YnRsZSByZWdyZXNzaW9ucyBpbiBQVEUgc2Nhbm5pbmcgb3IgdW5pbml0aWFsaXplZCB2YXJpYWJsZSB1c2FnZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDU3OGE0ZGE2MDgzYzU1NTJjMjZmMmE3MGZlZDhhZTliOWEzNDlmNDAKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVHVlIEF1ZyA0IDE5OjM4OjU3IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0CmluZGV4IDE2ZjM3MTM1ZWQ4MGQuLmIxODdkNjE4NDUyZjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdAomIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3QKQEAgLTIyNCw3ICYjNDM7MjI0LDcgQEAga2h1Z2VwYWdlZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB3aGVuIGFueSBUSFAgc2l6ZSBpcyBlbmFibGVkCiAoZWl0aGVyIG9mIHRoZSBwZXItc2l6ZSBhbm9uIGNvbnRyb2wgb3IgdGhlIHRvcC1sZXZlbCBjb250cm9sIGFyZSBzZXQKIHRvICYjMzQ7YWx3YXlzJiMzNDsgb3IgJiMzNDttYWR2aXNlJiMzNDspLCBhbmQgaXQmIzM5O2xsIGJlIGF1dG9tYXRpY2FsbHkgc2h1dGRvd24gd2hlbgogYWxsIFRIUCBzaXplcyBhcmUgZGlzYWJsZWQgKHdoZW4gYm90aCB0aGUgcGVyLXNpemUgYW5vbiBjb250cm9sIGFuZCB0aGUKLXRvcC1sZXZlbCBjb250cm9sIGFyZSAmIzM0O25ldmVyJiMzNDspCiYjNDM7dG9wLWxldmVsIGNvbnRyb2wgYXJlICYjMzQ7bmV2ZXImIzM0OykuCiAKIHByb2Nlc3MgVEhQIGNvbnRyb2xzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzAxLDcgJiM0MzszMDEsOSBAQCBiZWluZyByZXBsYWNlZCBieSBhIFBNRCBtYXBwaW5nLCBvciAoMikgcGh5c2ljYWwgcGFnZXMgcmVwbGFjZWQgYnkgb25lCiBodWdlcGFnZSBvZiB2YXJpb3VzIHNpemVzIChQTUQtc2l6ZWQgb3IgbVRIUCkuIEVhY2ggbWF5IGhhcHBlbiBpbmRlcGVuZGVudGx5LAogb3IgdG9nZXRoZXIsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBtZW1vcnkgYW5kIHRoZSBmYWlsdXJlcyB0aGF0IG9jY3VyLgogQXMgc3VjaCwgdGhpcyB2YWx1ZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgcm91Z2hseSBhcyBhIHNpZ24gb2YgcHJvZ3Jlc3MsCi1hbmQgY291bnRlcnMgaW4gL3Byb2Mvdm1zdGF0IGNvbnN1bHRlZCBmb3IgbW9yZSBhY2N1cmF0ZSBhY2NvdW50aW5nKTo6CiYjNDM7YW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZy4KJiM0MztQZXItb3JkZXIgbVRIUCBjb2xsYXBzZSBzdGF0aXN0aWNzIGFyZSBhbHNvIGF2YWlsYWJsZSB1bmRlcgomIzQzOy9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2h1Z2VwYWdlcy0mbHQ7c2l6ZSZndDtrQi9zdGF0cy8pOjoKIAogCS9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2todWdlcGFnZWQvcGFnZXNfY29sbGFwc2VkCiAKZGlmZiAtLWdpdCBhL21tL2todWdlcGFnZWQuYyBiL21tL2todWdlcGFnZWQuYwppbmRleCBiMjM3ZjZlNzY2MmE1Li4zMzM4ZTlkYzExZGQwIDEwMDY0NAotLS0gYS9tbS9raHVnZXBhZ2VkLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0va2h1Z2VwYWdlZC5jCkBAIC02NSw2ICYjNDM7NjUsMTIgQEAgZW51bSBzY2FuX3Jlc3VsdCB7CiAJU0NBTl9QQUdFX0RJUlRZX09SX1dSSVRFQkFDSywKIH07CiAKJiM0MztlbnVtIHB0ZV9jaGVja19yZXN1bHQgewomIzQzOwlQVEVfQ0hFQ0tfU1VDQ0VFRCwKJiM0MzsJUFRFX0NIRUNLX0ZBSUwsCiYjNDM7CVBURV9DSEVDS19DT05USU5VRSwKJiM0Mzt9OwomIzQzOwogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSAmbHQ7dHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgmZ3Q7CiAKQEAgLTExOSw2ICYjNDM7MTI1LDIwIEBAIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sIHsKIAlERUNMQVJFX0JJVE1BUChtdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7CiB9OwogCiYjNDM7c3RydWN0IHB0ZV9jaGVja19jb250ZXh0IHsKJiM0MzsJc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjOwomIzQzOwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKJiM0MzsJdW5zaWduZWQgaW50IG9yZGVyOwomIzQzOwlzdHJ1Y3QgZm9saW8gKmZvbGlvOwomIzQzOwlpbnQgbm9uZV9vcl96ZXJvOwomIzQzOwlpbnQgc2hhcmVkOwomIzQzOwlpbnQgdW5tYXBwZWQ7CiYjNDM7CWVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0OwomIzQzOwl1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZTsKJiM0MzsJdW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXA7CiYjNDM7CXVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQ7CiYjNDM7fTsKJiM0MzsKIC8qKgogICogc3RydWN0IGtodWdlcGFnZWRfc2NhbiAtIGN1cnNvciBmb3Igc2Nhbm5pbmcKICAqIEBtbV9oZWFkOiB0aGUgaGVhZCBvZiB0aGUgbW0gbGlzdCB0byBzY2FuCkBAIC02MjAsNyAmIzQzOzY0MCw3IEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiAJCS8qCiAJCSAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gc2VyaWFsaXplIGFnYWluc3QKIAkJICogY29sbGFwc2VfdGVzdF9leGl0KCkgKHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gcnVuCi0JCSAqIHVuZGVyIG1tYXAgc2VtIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbAomIzQzOwkJICogdW5kZXIgbW1hcF9sb2NrIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbAogCQkgKiBwYWdldGFibGVzIHdpbGwgYmUgZGVzdHJveWVkKSB1bnRpbCBraHVnZXBhZ2VkIGhhcyBmaW5pc2hlZAogCQkgKiB3b3JraW5nIG9uIHRoZSBwYWdldGFibGVzIHVuZGVyIHRoZSBtbWFwX2xvY2suCiAJCSAqLwpAQCAtNjI5LDYgJiM0Mzs2NDksMTMgQEAgdm9pZCBfX2todWdlcGFnZWRfZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIAl9CiB9CiAKJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpCiYjNDM7ewomIzQzOwltZW1zZXQoY2MtJmd0O25vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLSZndDtub2RlX2xvYWQpKTsKJiM0MzsJbm9kZXNfY2xlYXIoY2MtJmd0O2FsbG9jX25tYXNrKTsKJiM0MzsJYml0bWFwX3plcm8oY2MtJmd0O210aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKQogewogCW5vZGVfc3RhdF9tb2RfZm9saW8oZm9saW8sCkBAIC02NjUsNzYgJiM0Mzs2OTIsMTU2IEBAIHN0YXRpYyB2b2lkIHJlbGVhc2VfcHRlX3BhZ2VzKHB0ZV90ICpwdGUsIHB0ZV90ICpfcHRlLAogCX0KIH0KIAomIzQzOy8qCiYjNDM7ICogcHRlX2lzX3JlZmVyZW5jZWQoKSAtIENoZWNrIGZvciBlbm91Z2ggcmVmZXJlbmNlZCBQVEVzIHRvIGp1c3RpZnkgY29sbGFwc2luZwomIzQzOyAqCiYjNDM7ICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZSBwYWdlIGhhcyBiZWVuCiYjNDM7ICogcmVjZW50bHkgYWNjZXNzZWQgKHlvdW5nIHB0ZSkgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB0cnVlIGlmIHRoZSBwYWdlIGhhcyBiZWVuIHJlY2VudGx5IGFjY2Vzc2VkLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBwdGVfaXNfcmVmZXJlbmNlZChzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsIHB0ZV90IHB0ZXZhbCwKJiM0MzsJc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcikKJiM0Mzt7CiYjNDM7CXJldHVybiBjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7CiYjNDM7CSAgICAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHwKJiM0MzsJCWZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgfHwKJiM0MzsJCW1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS0mZ3Q7dm1fbW0sIGFkZHIpKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY291bnRfY29sbGFwc2VfZXZlbnQodW5zaWduZWQgaW50IG9yZGVyLCBlbnVtIHZtX2V2ZW50X2l0ZW0gdm1fZXZlbnQsCiYjNDM7CQllbnVtIG10aHBfc3RhdF9pdGVtIG10aHBfZXZlbnQpCiYjNDM7ewomIzQzOwlpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSkKJiM0MzsJCWNvdW50X3ZtX2V2ZW50KHZtX2V2ZW50KTsKJiM0MzsJY291bnRfbXRocF9zdGF0KG9yZGVyLCBtdGhwX2V2ZW50KTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBwdGVfY2hlY2tfZmFpbCgpIC0gQSBzaW1wbGUgaGVscGVyIHRvIHNldCB0aGUgcHRlX2NoZWNrX2NvbnRleHQgcmVzdWx0IGFuZAomIzQzOyAqIHJldHVybiBQVEVfQ0hFQ0tfRkFJTC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVja19mYWlsKHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCAqY3R4LAomIzQzOwkJZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQpCiYjNDM7ewomIzQzOwljdHgtJmd0O3Jlc3VsdCA9IHJlc3VsdDsKJiM0MzsJcmV0dXJuIFBURV9DSEVDS19GQUlMOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIGNvbGxhcHNlX2NoZWNrX3B0ZSgpIC0gQ2hlY2sgaWYgYSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlCiYjNDM7ICoKJiM0MzsgKiBDaGVjayBpZiBhIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2UgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjcml0ZXJpYToKJiM0MzsgKiAtIG1heF9wdGVfKiB2YWx1ZXMgYXJlIG5vdCBleGNlZWRlZAomIzQzOyAqIC0gdWZmZCBpcyBub3QgYWN0aXZlCiYjNDM7ICogLSBsYXp5ZnJlZSBwcm9wZXJ0aWVzIGFyZSBub3QgcHJlc2VudAomIzQzOyAqIC0gb25seSBhbm9ueW1vdXMgcGFnZXMgYXJlIHByZXNlbnQKJiM0MzsgKgomIzQzOyAqIGEgaGVscGVyIHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBpcyB1c2VkIHRvIHBhc3MgYW5kIHN0b3JlIHJlbGV2YW50CiYjNDM7ICogaW5mb3JtYXRpb24gYmV0d2VlbiB0aGUgY29sbGFwc2VfY2hlY2tfcHRlKCkgZnVuY3Rpb24gYW5kIHRoZSBjYWxsZXIuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFBURV9DSEVDS19TVUNDRUVEIGlmIHRoZSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlLAomIzQzOyAqICAgICAgICAgUFRFX0NIRUNLX0ZBSUwgaWYgdGhlIFBURSBpcyBub3Qgc3VpdGFibGUgZm9yIGNvbGxhcHNlLAomIzQzOyAqICAgICAgICAgUFRFX0NIRUNLX0NPTlRJTlVFIGlmIHRoZSBzY2FuIHNob3VsZCBjb250aW51ZSB0byBjaGVjayB0aGUgbmV4dCBQVEUuCiYjNDM7ICovCiYjNDM7c3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBjb2xsYXBzZV9jaGVja19wdGUocHRlX3QgcHRldmFsLAomIzQzOwkJdW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eCkKJiM0Mzt7CiYjNDM7CWlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHsKJiM0MzsJCWlmICgmIzQzOyYjNDM7Y3R4LSZndDtub25lX29yX3plcm8gJmd0OyBjdHgtJmd0O21heF9wdGVzX25vbmUpIHsKJiM0MzsJCQljb3VudF9jb2xsYXBzZV9ldmVudChjdHgtJmd0O29yZGVyLCBUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUsCiYjNDM7CQkJCQkgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7CiYjNDM7CQkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfTk9ORV9QVEUpOwomIzQzOwkJfQomIzQzOwkJcmV0dXJuIFBURV9DSEVDS19DT05USU5VRTsKJiM0MzsJfQomIzQzOwlpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHsKJiM0MzsJCWlmIChjdHgtJmd0O3VubWFwcGVkID09IC0xKQomIzQzOwkJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX05PTl9QUkVTRU5UKTsKJiM0MzsJCWlmICgmIzQzOyYjNDM7Y3R4LSZndDt1bm1hcHBlZCAmZ3Q7IGN0eC0mZ3Q7bWF4X3B0ZXNfc3dhcCkgewomIzQzOwkJCWNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC0mZ3Q7b3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSwKJiM0MzsJCQkJCSAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTsKJiM0MzsJCQlyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9TV0FQX1BURSk7CiYjNDM7CQl9CiYjNDM7CQlpZiAocHRlX3N3cF91ZmZkX2FueShwdGV2YWwpKQomIzQzOwkJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpOwomIzQzOwkJcmV0dXJuIFBURV9DSEVDS19DT05USU5VRTsKJiM0MzsJfQomIzQzOwkvKgomIzQzOwkgKiBEb24mIzM5O3QgY29sbGFwc2UgaWYgYW55IG9mIHRoZSBzbWFsbCBQVEVzIGFyZSBhcm1lZCB3aXRoIHVmZmQKJiM0MzsJICogd3JpdGUgcHJvdGVjdGlvbi4gTWFya2luZyB0aGUgbmV3IGh1Z2UgcG1kIGFzIHdyaXRlIHByb3RlY3RlZAomIzQzOwkgKiBjb3VsZCBicmluZyB1c2VyZmF1bHQgbWVzc2FnZXMgdGhhdCBmYWxsIG91dHNpZGUgb2YgdGhlCiYjNDM7CSAqIHJlZ2lzdGVyZWQgcmFuZ2UuCiYjNDM7CSAqLwomIzQzOwlpZiAocHRlX3VmZmQocHRldmFsKSkKJiM0MzsJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpOwomIzQzOwomIzQzOwljdHgtJmd0O2ZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKGN0eC0mZ3Q7dm1hLCBhZGRyLCBwdGV2YWwpOwomIzQzOwlpZiAodW5saWtlbHkoIWN0eC0mZ3Q7Zm9saW8pIHx8IHVubGlrZWx5KGZvbGlvX2lzX3pvbmVfZGV2aWNlKGN0eC0mZ3Q7Zm9saW8pKSkKJiM0MzsJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9OVUxMKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogSWYgdGhlIHZtYSBoYXMgdGhlIFZNX0RST1BQQUJMRSBmbGFnLCB0aGUgY29sbGFwc2Ugd2lsbAomIzQzOwkgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuCiYjNDM7CSAqLwomIzQzOwlpZiAoY3R4LSZndDtjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7ICEoY3R4LSZndDt2bWEtJmd0O3ZtX2ZsYWdzICZhbXA7IFZNX0RST1BQQUJMRSkgJmFtcDsmYW1wOwomIzQzOwkgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShjdHgtJmd0O2ZvbGlvKSAmYW1wOyZhbXA7ICFwdGVfZGlydHkocHRldmFsKSkKJiM0MzsJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9MQVpZRlJFRSk7CiYjNDM7CiYjNDM7CWlmICghZm9saW9fdGVzdF9hbm9uKGN0eC0mZ3Q7Zm9saW8pKSB7CiYjNDM7CQlWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oY3R4LSZndDtmb2xpbyksIGN0eC0mZ3Q7Zm9saW8pOwomIzQzOwkJcmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0FOT04pOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGN0eC0mZ3Q7Zm9saW8pKSB7CiYjNDM7CQkvKgomIzQzOwkJICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXIKJiM0MzsJCSAqIG1USFAgY29sbGFwc2VzLiBDdXJyZW50bHkgYnJpbmdpbmcgaW4gbmV3IHBhZ2VzIHZpYQomIzQzOwkJICogc2hhcmVkIG1heSBjYXVzZSBhIGZ1dHVyZSBoaWdoZXIgb3JkZXIgY29sbGFwc2Ugb24gYQomIzQzOwkJICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLgomIzQzOwkJICovCiYjNDM7CQlpZiAoJiM0MzsmIzQzO2N0eC0mZ3Q7c2hhcmVkICZndDsgY3R4LSZndDttYXhfcHRlc19zaGFyZWQpIHsKJiM0MzsJCQljb3VudF9jb2xsYXBzZV9ldmVudChjdHgtJmd0O29yZGVyLCBUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSwKJiM0MzsJCQkJCSAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpOwomIzQzOwkJCXJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NIQVJFRF9QVEUpOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiBQVEVfQ0hFQ0tfU1VDQ0VFRDsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsIHB0ZV90ICpwdGUsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYywKIAkJdW5zaWduZWQgaW50IG9yZGVyLCBzdHJ1Y3QgbGlzdF9oZWFkICpjb21wb3VuZF9wYWdlbGlzdCkKIHsKLQljb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgb3JkZXIpOwotCWNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIG9yZGVyKTsKIAljb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMICZsdDsmbHQ7IG9yZGVyOwotCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAlzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSBzdGFydF9hZGRyOwotCXB0ZV90ICpfcHRlOwotCWludCBub25lX29yX3plcm8gPSAwLCBzaGFyZWQgPSAwLCByZWZlcmVuY2VkID0gMDsKJiM0MzsJcHRlX3QgKl9wdGUsIHB0ZXZhbDsKJiM0MzsJaW50IHJlZmVyZW5jZWQgPSAwOwogCWVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMOwomIzQzOwllbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrOwomIzQzOwlzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0gewomIzQzOwkJLmNjID0gY2MsCiYjNDM7CQkudm1hID0gdm1hLAomIzQzOwkJLm9yZGVyID0gb3JkZXIsCiYjNDM7CQkudW5tYXBwZWQgPSAtMSwgLyogZG9uJiMzOTt0IGNoZWNrIHN3YXAgUFRFcyAqLwomIzQzOwkJLm1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKSwKJiM0MzsJCS5tYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIG9yZGVyKSwKJiM0MzsJfTsKIAogCWZvciAoX3B0ZSA9IHB0ZTsgX3B0ZSAmbHQ7IHB0ZSAmIzQzOyBucl9wYWdlczsKIAkgICAgIF9wdGUmIzQzOyYjNDM7LCBhZGRyICYjNDM7PSBQQUdFX1NJWkUpIHsKLQkJcHRlX3QgcHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7Ci0JCWlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHsKLQkJCWlmICgmIzQzOyYjNDM7bm9uZV9vcl96ZXJvICZndDsgbWF4X3B0ZXNfbm9uZSkgewotCQkJCXJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFOwotCQkJCWlmIChpc19wbWRfb3JkZXIob3JkZXIpKQotCQkJCQljb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUpOwotCQkJCWNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghcHRlX3ByZXNlbnQocHRldmFsKSkgewotCQkJcmVzdWx0ID0gU0NBTl9QVEVfTk9OX1BSRVNFTlQ7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlpZiAocHRlX3VmZmQocHRldmFsKSkgewotCQkJcmVzdWx0ID0gU0NBTl9QVEVfVUZGRDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCXBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7Ci0JCWlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7Ci0JCVZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSwgZm9saW8pOwotCi0JCS8qCi0JCSAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGwKLQkJICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLgotCQkgKi8KLQkJaWYgKGNjLSZndDtpc19raHVnZXBhZ2VkICZhbXA7JmFtcDsgISh2bWEtJmd0O3ZtX2ZsYWdzICZhbXA7IFZNX0RST1BQQUJMRSkgJmFtcDsmYW1wOwotCQkgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgJmFtcDsmYW1wOyAhcHRlX2RpcnR5KHB0ZXZhbCkpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTsKJiM0MzsJCXB0ZXZhbCA9IHB0ZXBfZ2V0KF9wdGUpOwomIzQzOwkJcHRlX2NoZWNrID0gY29sbGFwc2VfY2hlY2tfcHRlKHB0ZXZhbCwgYWRkciwgJmFtcDtjdHgpOwomIzQzOwkJZm9saW8gPSBjdHguZm9saW87CiYjNDM7CQlpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19GQUlMKSB7CiYjNDM7CQkJcmVzdWx0ID0gY3R4LnJlc3VsdDsKIAkJCWdvdG8gb3V0OwogCQl9CiYjNDM7CQlpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSkKJiM0MzsJCQljb250aW51ZTsKIAotCQkvKiBTZWUgY29sbGFwc2Vfc2Nhbl9wbWQoKS4gKi8KLQkJaWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7Ci0JCQkvKgotCQkJICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXIKLQkJCSAqIG1USFAgY29sbGFwc2VzLiBDdXJyZW50bHkgYnJpbmdpbmcgaW4gbmV3IHBhZ2VzIHZpYQotCQkJICogc2hhcmVkIG1heSBjYXVzZSBhIGZ1dHVyZSBoaWdoZXIgb3JkZXIgY29sbGFwc2Ugb24gYQotCQkJICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLgotCQkJICovCi0JCQlpZiAoJiM0MzsmIzQzO3NoYXJlZCAmZ3Q7IG1heF9wdGVzX3NoYXJlZCkgewotCQkJCXJlc3VsdCA9IFNDQU5fRVhDRUVEX1NIQVJFRF9QVEU7Ci0JCQkJaWYgKGlzX3BtZF9vcmRlcihvcmRlcikpCi0JCQkJCWNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTsKLQkJCQljb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfQogCQkvKgogCQkgKiBUT0RPOiBJbiBzb21lIGNhc2VzIG9mIHBhcnRpYWxseS1tYXBwZWQgZm9saW9zLCB3ZSYjMzk7ZCBhY3R1YWxseQogCQkgKiB3YW50IHRvIGNvbGxhcHNlLgpAQCAtNzU5LDggJiM0Mzs4NjYsOCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCiAJCS8qCiAJCSAqIFdlIGNhbiBkbyBpdCBiZWZvcmUgZm9saW9faXNvbGF0ZV9scnUgYmVjYXVzZSB0aGUKLQkJICogZm9saW8gY2FuJiMzOTt0IGJlIGZyZWVkIGZyb20gdW5kZXIgdXMuIE5PVEU6IFBHX2xvY2sKLQkJICogaXMgbmVlZGVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHNwbGl0X2h1Z2VfcGFnZQomIzQzOwkJICogZm9saW8gY2FuJiMzOTt0IGJlIGZyZWVkIGZyb20gdW5kZXIgdXMuIE5PVEU6IGZvbGlvIGxvY2sKJiM0MzsJCSAqIGlzIG5lZWRlZCB0byBzZXJpYWxpemUgYWdhaW5zdCBzcGxpdF9odWdlX3BhZ2UoKQogCQkgKiB3aGVuIGludm9rZWQgZnJvbSB0aGUgVk0uCiAJCSAqLwogCQlpZiAoIWZvbGlvX3RyeWxvY2soZm9saW8pKSB7CkBAIC03ODYsNyAmIzQzOzg5Myw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCX0KIAogCQkvKgotCQkgKiBJc29sYXRlIHRoZSBwYWdlIHRvIGF2b2lkIGNvbGxhcHNpbmcgYW4gaHVnZXBhZ2UKJiM0MzsJCSAqIElzb2xhdGUgdGhlIGZvbGlvIHRvIGF2b2lkIGNvbGxhcHNpbmcgYSBodWdlcGFnZQogCQkgKiBjdXJyZW50bHkgaW4gdXNlIGJ5IHRoZSBWTS4KIAkJICovCiAJCWlmICghZm9saW9faXNvbGF0ZV9scnUoZm9saW8pKSB7CkBAIC04MDMsMTQgJiM0Mzs5MTAsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQlpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpCiAJCQlsaXN0X2FkZF90YWlsKCZhbXA7Zm9saW8tJmd0O2xydSwgY29tcG91bmRfcGFnZWxpc3QpOwogbmV4dDoKLQkJLyoKLQkJICogSWYgY29sbGFwc2Ugd2FzIGluaXRpYXRlZCBieSBraHVnZXBhZ2VkLCBjaGVjayB0aGF0IHRoZXJlIGlzCi0JCSAqIGVub3VnaCB5b3VuZyBwdGUgdG8ganVzdGlmeSBjb2xsYXBzaW5nIHRoZSBwYWdlCi0JCSAqLwotCQlpZiAoY2MtJmd0O2lzX2todWdlcGFnZWQgJmFtcDsmYW1wOwotCQkgICAgKHB0ZV95b3VuZyhwdGV2YWwpIHx8IGZvbGlvX3Rlc3RfeW91bmcoZm9saW8pIHx8Ci0JCSAgICAgZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSB8fAotCQkgICAgIG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS0mZ3Q7dm1fbW0sIGFkZHIpKSkKJiM0MzsJCWlmIChwdGVfaXNfcmVmZXJlbmNlZChjYywgcHRldmFsLCBmb2xpbywgdm1hLCBhZGRyKSkKIAkJCXJlZmVyZW5jZWQmIzQzOyYjNDM7OwogCX0KIApAQCAtODE4LDEzICYjNDM7OTE4LDEzIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCXJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7CiAJfSBlbHNlIHsKIAkJcmVzdWx0ID0gU0NBTl9TVUNDRUVEOwotCQl0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgbm9uZV9vcl96ZXJvLAomIzQzOwkJdHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIGN0eC5ub25lX29yX3plcm8sCiAJCQkJCQkgICAgcmVmZXJlbmNlZCwgcmVzdWx0LCBvcmRlcik7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogb3V0OgogCXJlbGVhc2VfcHRlX3BhZ2VzKHB0ZSwgX3B0ZSwgY29tcG91bmRfcGFnZWxpc3QpOwotCXRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sCiYjNDM7CXRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLAogCQkJCQkgICAgcmVmZXJlbmNlZCwgcmVzdWx0LCBvcmRlcik7CiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTkwNCw3ICYjNDM7MTAwNCw3IEBAIHN0YXRpYyB2b2lkIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfZmFpbGVkKHB0ZV90ICpwdGUsCiAJICogUmUtZXN0YWJsaXNoIHRoZSBQTUQgdG8gcG9pbnQgdG8gdGhlIG9yaWdpbmFsIHBhZ2UgdGFibGUKIAkgKiBlbnRyeS4gUmVzdG9yaW5nIFBNRCBuZWVkcyB0byBiZSBkb25lIHByaW9yIHRvIHJlbGVhc2luZwogCSAqIHBhZ2VzLiBTaW5jZSBwYWdlcyBhcmUgc3RpbGwgaXNvbGF0ZWQgYW5kIGxvY2tlZCBoZXJlLAotCSAqIGFjcXVpcmluZyBhbm9uX3ZtYV9sb2NrX3dyaXRlIGlzIHVubmVjZXNzYXJ5LgomIzQzOwkgKiBhY3F1aXJpbmcgYW5vbl92bWFfbG9ja193cml0ZSgpIGlzIHVubmVjZXNzYXJ5LgogCSAqLwogCXBtZF9wdGwgPSBwbWRfbG9jayh2bWEtJmd0O3ZtX21tLCBwbWQpOwogCXBtZF9wb3B1bGF0ZSh2bWEtJmd0O3ZtX21tLCBwbWQsIHBtZF9wZ3RhYmxlKG9yaWdfcG1kKSk7CkBAIC0xMDc4LDkgJiM0MzsxMTc4LDkgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGwKIAkJcmV0dXJuIFNDQU5fVk1BX0NIRUNLOwogCS8qCiAJICogQW5vbiBWTUEgZXhwZWN0ZWQsIHRoZSBhZGRyZXNzIG1heSBiZSB1bm1hcHBlZCB0aGVuCi0JICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYXF1aXJlZCB0aGUgbW1hcF9sb2NrLgomIzQzOwkgKiByZW1hcHBlZCB0byBmaWxlIGFmdGVyIGtodWdlcGFnZWQgcmVhY3F1aXJlZCB0aGUgbW1hcF9sb2NrLgogCSAqCi0JICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzIG1heSByZXR1cm4gdHJ1ZSBmb3IgcXVhbGlmaWVkIGZpbGUKJiM0MzsJICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKCkgbWF5IHJldHVybiB0cnVlIGZvciBxdWFsaWZpZWQgZmlsZQogCSAqIHZtYXMuCiAJICovCiAJaWYgKGV4cGVjdF9hbm9uICZhbXA7JmFtcDsgKCEoKnZtYXApLSZndDthbm9uX3ZtYSB8fCAhdm1hX2lzX2Fub255bW91cygqdm1hcCkpKQpAQCAtMTEzNiw3ICYjNDM7MTIzNiw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNoZWNrX3BtZF9zdGlsbF92YWxpZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAogLyoKICAqIEJyaW5nIG1pc3NpbmcgcGFnZXMgaW4gZnJvbSBzd2FwLCB0byBjb21wbGV0ZSBUSFAgY29sbGFwc2UuCi0gKiBPbmx5IGRvbmUgaWYga2h1Z2VwYWdlZF9zY2FuX3BtZCBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLgomIzQzOyAqIE9ubHkgZG9uZSBpZiBjb2xsYXBzZV9zY2FuX3BtZCgpIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuCiAgKgogICogRm9yIG1USFAgb3JkZXJzIHRoZSBmdW5jdGlvbiBiYWlscyBvbiB0aGUgZmlyc3Qgc3dhcCBlbnRyeSwgYmVjYXVzZQogICogZmF1bHRpbmcgcGFnZXMgYmFjayBpbiBkdXJpbmcgY29sbGFwc2UgY291bGQgcmUtcG9wdWxhdGUgUFRFcyB0aGF0CkBAIC0xMjA0LDcgJiM0MzsxMzA0LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQlwdGUgPSBOVUxMOwogCiAJCS8qCi0JCSAqIGRvX3N3YXBfcGFnZSByZXR1cm5zIFZNX0ZBVUxUX1JFVFJZIHdpdGggcmVsZWFzZWQgbW1hcF9sb2NrLgomIzQzOwkJICogZG9fc3dhcF9wYWdlKCkgcmV0dXJucyBWTV9GQVVMVF9SRVRSWSB3aXRoIHJlbGVhc2VkIG1tYXBfbG9jay4KIAkJICogTm90ZSB3ZSB0cmVhdCBWTV9GQVVMVF9SRVRSWSBhcyBWTV9GQVVMVF9FUlJPUiBoZXJlIGJlY2F1c2UKIAkJICogd2UgZG8gbm90IHJldHJ5IGhlcmUgYW5kIHN3YXAgZW50cnkgd2lsbCByZW1haW4gaW4gcGFnZXRhYmxlCiAJCSAqIHJlc3VsdGluZyBpbiBsYXRlciBmYWlsdXJlLgpAQCAtMTI0NywxNSAmIzQzOzEzNDcsMTIgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnUKIAlmb2xpbyA9IF9fZm9saW9fYWxsb2MoZ2ZwLCBvcmRlciwgbm9kZSwgJmFtcDtjYy0mZ3Q7YWxsb2Nfbm1hc2spOwogCWlmICghZm9saW8pIHsKIAkJKmZvbGlvcCA9IE5VTEw7Ci0JCWlmIChpc19wbWRfb3JkZXIob3JkZXIpKQotCQkJY291bnRfdm1fZXZlbnQoVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7Ci0JCWNvdW50X210aHBfc3RhdChvcmRlciwgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7CiYjNDM7CQljb3VudF9jb2xsYXBzZV9ldmVudChvcmRlciwgVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCwKJiM0MzsJCQkJICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTsKIAkJcmV0dXJuIFNDQU5fQUxMT0NfSFVHRV9QQUdFX0ZBSUw7CiAJfQogCi0JaWYgKGlzX3BtZF9vcmRlcihvcmRlcikpCi0JCWNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQyk7Ci0JY291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0MpOwomIzQzOwljb3VudF9jb2xsYXBzZV9ldmVudChvcmRlciwgVEhQX0NPTExBUFNFX0FMTE9DLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0MpOwogCiAJaWYgKHVubGlrZWx5KG1lbV9jZ3JvdXBfY2hhcmdlKGZvbGlvLCBtbSwgZ2ZwKSkpIHsKIAkJZm9saW9fcHV0KGZvbGlvKTsKQEAgLTEyNzEsNyAmIzQzOzEzNjgsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydQogfQogCiAvKgotICogY29sbGFwc2VfaHVnZV9wYWdlIGV4cGVjdHMgdGhlIG1tYXBfbG9jayB0byBiZSB1bmxvY2tlZCBiZWZvcmUgZW50ZXJpbmcgYW5kCiYjNDM7ICogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbW1hcF9sb2NrIHRvIGJlIHVubG9ja2VkIGJlZm9yZSBlbnRlcmluZyBhbmQKICAqIHdpbGwgYWx3YXlzIHJldHVybiB3aXRoIHRoZSBsb2NrIHVubG9ja2VkLCB0byBhdm9pZCBob2xkaW5nIHRoZSBtbWFwX2xvY2sKICAqIHdoaWxlIGFsbG9jYXRpbmcgYSBUSFAsIGFzIHRoYXQgY291bGQgdHJpZ2dlciBkaXJlY3QgcmVjbGFpbS9jb21wYWN0aW9uLgogICogTm90ZSB0aGF0IHRoZSBWTUEgbXVzdCBiZSByZWNoZWNrZWQgYWZ0ZXIgZ3JhYmJpbmcgdGhlIG1tYXBfbG9jayBhZ2Fpbi4KQEAgLTEzMTgsNyAmIzQzOzE0MTUsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcwogCiAJaWYgKHVubWFwcGVkKSB7CiAJCS8qCi0JCSAqIF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbiB3aWxsIHJldHVybiB3aXRoIG1tYXBfbG9jawomIzQzOwkJICogX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKCkgd2lsbCByZXR1cm4gd2l0aCBtbWFwX2xvY2sKIAkJICogcmVsZWFzZWQgd2hlbiBpdCBmYWlscy4gU28gd2UganVtcCBvdXRfbm9sb2NrIGRpcmVjdGx5IGluCiAJCSAqIHRoYXQgY2FzZS4gIENvbnRpbnVpbmcgdG8gY29sbGFwc2UgY2F1c2VzIGluY29uc2lzdGVuY3kuCiAJCSAqLwpAQCAtMTMzMSw4ICYjNDM7MTQyOCw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzCiAJbW1hcF9yZWFkX3VubG9jayhtbSk7CiAJLyoKIAkgKiBQcmV2ZW50IGFsbCBhY2Nlc3MgdG8gcGFnZXRhYmxlcyB3aXRoIHRoZSBleGNlcHRpb24gb2YKLQkgKiBndXBfZmFzdCBsYXRlciBoYW5kbGVkIGJ5IHRoZSBwdGVwX2NsZWFyX2ZsdXNoIGFuZCB0aGUgVk0KLQkgKiBoYW5kbGVkIGJ5IHRoZSBhbm9uX3ZtYSBsb2NrICYjNDM7IFBHX2xvY2suCiYjNDM7CSAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHBtZHBfY29sbGFwc2VfZmx1c2goKSBhbmQgdGhlIFZNCiYjNDM7CSAqIGhhbmRsZWQgYnkgdGhlIGFub25fdm1hIGxvY2sgJiM0MzsgZm9saW8gbG9jay4KIAkgKgogCSAqIFVGRkRJT19NT1ZFIGlzIHByZXZlbnRlZCB0byByYWNlIGFzIHdlbGwgdGhhbmtzIHRvIHRoZQogCSAqIG1tYXBfbG9jay4KQEAgLTEzODksOSAmIzQzOzE0ODYsOSBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcwogCQlzcGluX2xvY2socG1kX3B0bCk7CiAJCVZNX1dBUk5fT05fT05DRSghcG1kX25vbmUoKnBtZCkpOwogCQkvKgotCQkgKiBXZSBjYW4gb25seSB1c2Ugc2V0X3BtZF9hdCB3aGVuIGVzdGFibGlzaGluZwomIzQzOwkJICogV2UgY2FuIG9ubHkgdXNlIHNldF9wbWRfYXQoKSB3aGVuIGVzdGFibGlzaGluZwogCQkgKiBodWdlcG1kcyBhbmQgbmV2ZXIgZm9yIGVzdGFibGlzaGluZyByZWd1bGFyIHBtZHMgdGhhdAotCQkgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlIGZvciB0aGF0CiYjNDM7CQkgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlKCkgZm9yIHRoYXQKIAkJICovCiAJCXBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwbWRfcGd0YWJsZShfcG1kKSk7CiAJCXNwaW5fdW5sb2NrKHBtZF9wdGwpOwpAQCAtMTQzOSw3ICYjNDM7MTUzNiw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzCiAJCQlzcGluX2xvY2tfbmVzdGVkKHB0ZV9wdGwsIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKIAkJcG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBtZF9wZ3RhYmxlKF9wbWQpKTsKIAkJbWFwX2Fub25fZm9saW9fcHRlX25vcGYoZm9saW8sIHB0ZSwgdm1hLCBzdGFydF9hZGRyLAotCQkJCQkgIC8qdWZmZF93cD0qLyBmYWxzZSk7CiYjNDM7CQkJCQkgIC8qdWZmZD0qLyBmYWxzZSk7CiAJCWlmIChwdGVfcHRsICE9IHBtZF9wdGwpCiAJCQlzcGluX3VubG9jayhwdGVfcHRsKTsKIAl9CkBAIC0xNDQ5LDEwICYjNDM7MTU0NiwxMCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcwogCiAJcmVzdWx0ID0gU0NBTl9TVUNDRUVEOwogb3V0X3VwX3dyaXRlOgotCWlmIChhbm9uX3ZtYV9sb2NrZWQpCi0JCWFub25fdm1hX3VubG9ja193cml0ZSh2bWEtJmd0O2Fub25fdm1hKTsKIAlpZiAocHRlKQogCQlwdGVfdW5tYXAocHRlKTsKJiM0MzsJaWYgKGFub25fdm1hX2xvY2tlZCkKJiM0MzsJCWFub25fdm1hX3VubG9ja193cml0ZSh2bWEtJmd0O2Fub25fdm1hKTsKIAltbWFwX3dyaXRlX3VubG9jayhtbSk7CiBvdXRfbm9sb2NrOgogCWlmIChmb2xpbykKQEAgLTE1OTMsNDIgJiM0MzsxNjkwLDQ3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLAogCQlib29sICpsb2NrX2Ryb3BwZWQsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYykKIHsKLQljb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBIUEFHRV9QTURfT1JERVIpOwotCWNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwID0gY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChjYywgSFBBR0VfUE1EX09SREVSKTsKLQl1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKTsKIAllbnVtIHR2YV90eXBlIHR2YV9mbGFncyA9IGNjLSZndDtpc19raHVnZXBhZ2VkID8gVFZBX0tIVUdFUEFHRUQgOiBUVkFfRk9SQ0VEX0NPTExBUFNFOwogCXBtZF90ICpwbWQ7CiAJcHRlX3QgKnB0ZSwgKl9wdGUsIHB0ZXZhbDsKIAlpbnQgaTsKLQlpbnQgbm9uZV9vcl96ZXJvID0gMCwgc2hhcmVkID0gMCwgcmVmZXJlbmNlZCA9IDA7Ci0JZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwogCXN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMOwomIzQzOwlpbnQgcmVmZXJlbmNlZCA9IDA7CiYjNDM7CWVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAl1bnNpZ25lZCBsb25nIGVuYWJsZWRfb3JkZXJzOwogCXNwaW5sb2NrX3QgKnB0bDsKLQlpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERSwgdW5tYXBwZWQgPSAwOwomIzQzOwlpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERTsKJiM0MzsJZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVjazsKIAogCVZNX0JVR19PTihzdGFydF9hZGRyICZhbXA7IH5IUEFHRV9QTURfTUFTSyk7CiAKJiM0MzsJc3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGN0eCA9IHsKJiM0MzsJCS5jYyA9IGNjLAomIzQzOwkJLnZtYSA9IHZtYSwKJiM0MzsJCS5vcmRlciA9IEhQQUdFX1BNRF9PUkRFUiwKJiM0MzsJCS5tYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgdm1hLCBIUEFHRV9QTURfT1JERVIpLAomIzQzOwkJLm1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpLAomIzQzOwkJLm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgSFBBR0VfUE1EX09SREVSKSwKJiM0MzsJfTsKJiM0MzsKIAlyZXN1bHQgPSBmaW5kX3BtZF9vcl90aHBfb3Jfbm9uZShtbSwgc3RhcnRfYWRkciwgJmFtcDtwbWQpOwogCWlmIChyZXN1bHQgIT0gU0NBTl9TVUNDRUVEKSB7CiAJCWNjLSZndDtwcm9ncmVzcyYjNDM7JiM0Mzs7CiAJCWdvdG8gb3V0OwogCX0KIAotCWJpdG1hcF96ZXJvKGNjLSZndDttdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7Ci0JbWVtc2V0KGNjLSZndDtub2RlX2xvYWQsIDAsIHNpemVvZihjYy0mZ3Q7bm9kZV9sb2FkKSk7Ci0Jbm9kZXNfY2xlYXIoY2MtJmd0O2FsbG9jX25tYXNrKTsKJiM0MzsJY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oY2MpOwogCiAJZW5hYmxlZF9vcmRlcnMgPSBjb2xsYXBzZV9wb3NzaWJsZV9vcmRlcnModm1hLCB2bWEtJmd0O3ZtX2ZsYWdzLCB0dmFfZmxhZ3MpOwogCiAJLyoKIAkgKiBJZiBQTUQgaXMgdGhlIG9ubHkgZW5hYmxlZCBvcmRlciwgZW5mb3JjZSBtYXhfcHRlc19ub25lLCBvdGhlcndpc2UKLQkgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLgomIzQzOwkgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLiBUaGUgYml0bWFwCiYjNDM7CSAqIGlzIHRoZW4gY2hlY2tlZCBhZ2FpbiBpbiBtdGhwX2NvbGxhcHNlKCkgZm9yIGVhY2ggYXR0ZW1wdGVkIG9yZGVyLgogCSAqLwogCWlmIChlbmFibGVkX29yZGVycyAhPSBCSVQoSFBBR0VfUE1EX09SREVSKSkKLQkJbWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7CiYjNDM7CQljdHgubWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7CiAKIAlwdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIHN0YXJ0X2FkZHIsICZhbXA7cHRsKTsKIAlpZiAoIXB0ZSkgewpAQCAtMTY0NCw4NCAmIzQzOzE3NDYsMTQgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAKIAkJY2MtJmd0O3Byb2dyZXNzJiM0MzsmIzQzOzsKIAotCQlpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7Ci0JCQlpZiAoJiM0MzsmIzQzO25vbmVfb3JfemVybyAmZ3Q7IG1heF9wdGVzX25vbmUpIHsKLQkJCQlyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9OT05FX1BURTsKLQkJCQljb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUpOwotCQkJCWNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsCi0JCQkJCQlNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpOwotCQkJCWdvdG8gb3V0X3VubWFwOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7Ci0JCQlpZiAoJiM0MzsmIzQzO3VubWFwcGVkICZndDsgbWF4X3B0ZXNfc3dhcCkgewotCQkJCXJlc3VsdCA9IFNDQU5fRVhDRUVEX1NXQVBfUFRFOwotCQkJCWNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSk7Ci0JCQkJY291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUiwKLQkJCQkJCU1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU1dBUCk7Ci0JCQkJZ290byBvdXRfdW5tYXA7Ci0JCQl9Ci0JCQkvKgotCQkJICogQWx3YXlzIGJlIHN0cmljdCB3aXRoIHVmZmQtd3AKLQkJCSAqIGVuYWJsZWQgc3dhcCBlbnRyaWVzLiAgUGxlYXNlIHNlZQotCQkJICogY29tbWVudCBiZWxvdyBmb3IgcHRlX3VmZmQoKS4KLQkJCSAqLwotCQkJaWYgKHB0ZV9zd3BfdWZmZF9hbnkocHRldmFsKSkgewotCQkJCXJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7Ci0JCQkJZ290byBvdXRfdW5tYXA7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAocHRlX3VmZmQocHRldmFsKSkgewotCQkJLyoKLQkJCSAqIERvbiYjMzk7dCBjb2xsYXBzZSB0aGUgcGFnZSBpZiBhbnkgb2YgdGhlIHNtYWxsCi0JCQkgKiBQVEVzIGFyZSBhcm1lZCB3aXRoIHVmZmQgd3JpdGUgcHJvdGVjdGlvbi4KLQkJCSAqIEhlcmUgd2UgY2FuIGFsc28gbWFyayB0aGUgbmV3IGh1Z2UgcG1kIGFzCi0JCQkgKiB3cml0ZSBwcm90ZWN0ZWQgaWYgYW55IG9mIHRoZSBzbWFsbCBvbmVzIGlzCi0JCQkgKiBtYXJrZWQgYnV0IHRoYXQgY291bGQgYnJpbmcgdW5rbm93bgotCQkJICogdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbHMgb3V0c2lkZSBvZgotCQkJICogdGhlIHJlZ2lzdGVyZWQgcmFuZ2UuICBTbywganVzdCBiZSBzaW1wbGUuCi0JCQkgKi8KLQkJCXJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7Ci0JCQlnb3RvIG91dF91bm1hcDsKLQkJfQotCi0JCXBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7Ci0JCWlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMOwotCQkJZ290byBvdXRfdW5tYXA7Ci0JCX0KLQkJZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpOwotCi0JCS8qCi0JCSAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGwKLQkJICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLgotCQkgKi8KLQkJaWYgKGNjLSZndDtpc19raHVnZXBhZ2VkICZhbXA7JmFtcDsgISh2bWEtJmd0O3ZtX2ZsYWdzICZhbXA7IFZNX0RST1BQQUJMRSkgJmFtcDsmYW1wOwotCQkgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgJmFtcDsmYW1wOyAhcHRlX2RpcnR5KHB0ZXZhbCkpIHsKLQkJCXJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTsKJiM0MzsJCXB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsICZhbXA7Y3R4KTsKJiM0MzsJCWZvbGlvID0gY3R4LmZvbGlvOwomIzQzOwkJaWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkgewomIzQzOwkJCXJlc3VsdCA9IGN0eC5yZXN1bHQ7CiAJCQlnb3RvIG91dF91bm1hcDsKIAkJfQotCi0JCWlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkgewotCQkJcmVzdWx0ID0gU0NBTl9QQUdFX0FOT047Ci0JCQlnb3RvIG91dF91bm1hcDsKLQkJfQotCi0JCS8qCi0JCSAqIFdlIHRyZWF0IGEgc2luZ2xlIHBhZ2UgYXMgc2hhcmVkIGlmIGFueSBwYXJ0IG9mIHRoZSBUSFAKLQkJICogaXMgc2hhcmVkLgotCQkgKi8KLQkJaWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7Ci0JCQlpZiAoJiM0MzsmIzQzO3NoYXJlZCAmZ3Q7IG1heF9wdGVzX3NoYXJlZCkgewotCQkJCXJlc3VsdCA9IFNDQU5fRVhDRUVEX1NIQVJFRF9QVEU7Ci0JCQkJY291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUpOwotCQkJCWNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsCi0JCQkJCQlNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7Ci0JCQkJZ290byBvdXRfdW5tYXA7Ci0JCQl9Ci0JCX0KJiM0MzsJCWlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0NPTlRJTlVFKQomIzQzOwkJCWNvbnRpbnVlOwogCiAJCS8qIFNldCBiaXQgZm9yIG9jY3VwaWVkIHBhZ2VzICovCiAJCV9fc2V0X2JpdChpLCBjYy0mZ3Q7bXRocF9wcmVzZW50X3B0ZXMpOwpAQCAtMTc0OSwzMSAmIzQzOzE3ODEsMjEgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCS8qCiAJCSAqIENoZWNrIGlmIHRoZSBwYWdlIGhhcyBhbnkgR1VQIChvciBvdGhlciBleHRlcm5hbCkgcGlucy4KIAkJICoKLQkJICogSGVyZSB0aGUgY2hlY2sgbWF5IGJlIHJhY3k6Ci0JCSAqIGl0IG1heSBzZWUgZm9saW9fbWFwY291bnQoKSAmZ3Q7IGZvbGlvX3JlZl9jb3VudCgpLgotCQkgKiBCdXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCB3ZSBjb3VsZCBhbHdheXMgcmV0cnkgY29sbGFwc2UKLQkJICogbGF0ZXIuICBIb3dldmVyIGl0IG1heSByZXBvcnQgZmFsc2UgcG9zaXRpdmUgaWYgdGhlIHBhZ2UKLQkJICogaGFzIGV4Y2Vzc2l2ZSBHVVAgcGlucyAoaS5lLiA1MTIpLiAgQW55d2F5IHRoZSBzYW1lIGNoZWNrCi0JCSAqIHdpbGwgYmUgZG9uZSBhZ2FpbiBsYXRlciB0aGUgcmlzayBzZWVtcyBsb3cuCiYjNDM7CQkgKiBIZXJlIHRoZSBjaGVjayBpcyByYWN5LCBidXQgc3VjaCBjYXNlIGlzIGVwaGVtZXJhbCBhbmQKJiM0MzsJCSAqIHdlIGNvdWxkIGFsd2F5cyByZXRyeSBjb2xsYXBzZSBsYXRlci4gQW55d2F5IHRoZSBzYW1lCiYjNDM7CQkgKiBjaGVjayB3aWxsIGJlIGRvbmUgYWdhaW4gbGF0ZXIgdGhlIHJpc2sgc2VlbXMgbG93LgogCQkgKi8KIAkJaWYgKGZvbGlvX2V4cGVjdGVkX3JlZl9jb3VudChmb2xpbykgIT0gZm9saW9fcmVmX2NvdW50KGZvbGlvKSkgewogCQkJcmVzdWx0ID0gU0NBTl9QQUdFX0NPVU5UOwogCQkJZ290byBvdXRfdW5tYXA7CiAJCX0KIAotCQkvKgotCQkgKiBJZiBjb2xsYXBzZSB3YXMgaW5pdGlhdGVkIGJ5IGtodWdlcGFnZWQsIGNoZWNrIHRoYXQgdGhlcmUgaXMKLQkJICogZW5vdWdoIHlvdW5nIHB0ZSB0byBqdXN0aWZ5IGNvbGxhcHNpbmcgdGhlIHBhZ2UKLQkJICovCi0JCWlmIChjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7Ci0JCSAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHwKLQkJICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8Ci0JCSAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLSZndDt2bV9tbSwgYWRkcikpKQomIzQzOwkJaWYgKHB0ZV9pc19yZWZlcmVuY2VkKGNjLCBwdGV2YWwsIGZvbGlvLCB2bWEsIGFkZHIpKQogCQkJcmVmZXJlbmNlZCYjNDM7JiM0Mzs7CiAJfQogCWlmIChjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCAmYW1wOyZhbXA7CiAJCSAgICghcmVmZXJlbmNlZCB8fAotCQkgICAgKHVubWFwcGVkICZhbXA7JmFtcDsgcmVmZXJlbmNlZCAmbHQ7IEhQQUdFX1BNRF9OUiAvIDIpKSkgewomIzQzOwkJICAgIChjdHgudW5tYXBwZWQgJmFtcDsmYW1wOyByZWZlcmVuY2VkICZsdDsgSFBBR0VfUE1EX05SIC8gMikpKSB7CiAJCXJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7CiAJfSBlbHNlIHsKIAkJcmVzdWx0ID0gU0NBTl9TVUNDRUVEOwpAQCAtMTc4MSwxNiAmIzQzOzE4MDMsMTYgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiBvdXRfdW5tYXA6CiAJcHRlX3VubWFwX3VubG9jayhwdGUsIHB0bCk7CiAJaWYgKHJlc3VsdCA9PSBTQ0FOX1NVQ0NFRUQpIHsKLQkJLyogY29sbGFwc2VfaHVnZV9wYWdlIGV4cGVjdHMgdGhlIGxvY2sgdG8gYmUgZHJvcHBlZCBiZWZvcmUgY2FsbGluZyAqLwomIzQzOwkJLyogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovCiAJCW1tYXBfcmVhZF91bmxvY2sobW0pOwogCQlyZXN1bHQgPSBtdGhwX2NvbGxhcHNlKG1tLCBzdGFydF9hZGRyLCByZWZlcmVuY2VkLAotCQkJCSAgICAgICB1bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTsKJiM0MzsJCQkJICAgICAgIGN0eC51bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTsKIAkJLyogbW1hcF9sb2NrIHdhcyByZWxlYXNlZCBhYm92ZSwgc2V0IGxvY2tfZHJvcHBlZCAqLwogCQkqbG9ja19kcm9wcGVkID0gdHJ1ZTsKIAl9CiBvdXQ6CiAJdHJhY2VfbW1fa2h1Z2VwYWdlZF9zY2FuX3BtZChtbSwgZm9saW8sIHJlZmVyZW5jZWQsCi0JCQkJICAgICBub25lX29yX3plcm8sIHJlc3VsdCwgdW5tYXBwZWQpOwomIzQzOwkJCQkgICAgIGN0eC5ub25lX29yX3plcm8sIHJlc3VsdCwgY3R4LnVubWFwcGVkKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0yNjkxLDggJiM0MzsyNzEzLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCiAJcHJlc2VudCA9IDA7CiAJc3dhcCA9IDA7Ci0JbWVtc2V0KGNjLSZndDtub2RlX2xvYWQsIDAsIHNpemVvZihjYy0mZ3Q7bm9kZV9sb2FkKSk7Ci0Jbm9kZXNfY2xlYXIoY2MtJmd0O2FsbG9jX25tYXNrKTsKJiM0MzsJY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oY2MpOwogCXJjdV9yZWFkX2xvY2soKTsKIAl4YXNfZm9yX2VhY2goJmFtcDt4YXMsIGZvbGlvLCBzdGFydCAmIzQzOyBIUEFHRV9QTURfTlIgLSAxKSB7CiAJCWlmICh4YXNfcmV0cnkoJmFtcDt4YXMsIGZvbGlvKSkKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6Mzk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTEyMzYKCQkJCQkJCW91dHB1dDogMjAKCQkJCQkJCXRob3VnaHRzOiAyODIyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgS2h1Z2VwYWdlZCBDb2xsYXBzZSBMb2dpYyBSZWZhY3RvcioqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCB0aGF0IHNlZW1zIHRvIGJlIGEgcmVmYWN0b3Jpbmcgb2YgdGhlIGtodWdlcGFnZWQgY29sbGFwc2UgbG9naWMsIHNwZWNpZmljYWxseSB0aGUgUFRFIHNjYW5uaW5nIHBhcnQsIG1vZGlmeWluZyBgbW0va2h1Z2VwYWdlZC5jYCBhbmQgYERvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdGAuIFRoZSBtYWluIGNoYW5nZXMgYXBwZWFyIHRvIGJlIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYSBuZXcgYHB0ZV9jaGVja19jb250ZXh0YCBzdHJ1Y3QgYW5kIGEgbmV3IGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgdG8gY2VudHJhbGl6ZSBQVEUgY2hlY2tpbmcuIFNldmVyYWwgb3RoZXIgcmVsYXRlZCBmdW5jdGlvbnMgbGlrZSBgcHRlX2lzX3JlZmVyZW5jZWQoKWAsIGBjb3VudF9jb2xsYXBzZV9ldmVudCgpYCwgYW5kIGBjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbigpYCBhcmUgYWRkZWQgb3IgbW9kaWZpZWQgYXMgd2VsbC4gTXkgaW5pdGlhbCBpbXByZXNzaW9uIGlzIHRoYXQgdGhpcyBpcyBhIGNsZWFuLXVwLCBidXQgSSBuZWVkIHRvIGJlIHN1cmUuCgpMb29raW5nIGNsb3NlbHkgYXQgdGhlIGRpZmYgaW4gYGNvbGxhcHNlX3NjYW5fcG1kKClgLCBJIHNlZSB0aGF0IGEgc2VyaWVzIG9mIGNoZWNrcyBoYXZlIGJlZW4gbW92ZWQgaW50byB0aGUgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBmdW5jdGlvbi4gTXkgZmlyc3QgdGhvdWdodCBpcyAmIzM0O29rLCB0aGlzIHNlZW1zIGxpa2UganVzdCBhIGxvZ2ljYWwgZ3JvdXBpbmcgYW5kIHNpbXBsaWZpY2F0aW9uLiYjMzQ7IFRoZSBvcmlnaW5hbCBjb2RlIGRpZCBpbmxpbmUgY2hlY2tzIHdpdGggYHB0ZV9ub25lX29yX3plcm8oKWAsIGBwdGVfcHJlc2VudCgpYCwgYW5kIHNvbWUgZm9saW8gdGVzdHMuIE5vdywgdGhlc2UgYXJlIGFsbCBkb25lIHdpdGhpbiBgY29sbGFwc2VfY2hlY2tfcHRlKClgLgoKSG93ZXZlciwgYXMgSSBkaXZlIGRlZXBlciwgSSBub3RpY2Ugc3VidGxlIGRldGFpbHMuIEluIGBjb2xsYXBzZV9jaGVja19wdGUoKWAsIHRoZSBjb250ZXh0IHN0cnVjdCBpcyBpbml0aWFsaXplZC4gQ29tcGFyaW5nIHRoaXMgdG8gdGhlIG9sZGVyIHZlcnNpb24sIEkgd2FudCB0byB2ZXJpZnkgaWYgdGhlcmUgaXMgYW55IGZ1bmN0aW9uYWwgY2hhbmdlLiBMb29raW5nIGNsb3NlciwgdGhlcmUgaXMgYSBgY3R4LSZndDt1bm1hcHBlZGAgd2hpY2ggaXMgaW5pdGlhbGl6ZWQgdG8gYC0xYCBpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYC4gVGhpcyBpcyBpbXBvcnRhbnQsIGFzIGl0IGhhbmRsZXMgYSBkaWZmZXJlbnQgY2FzZSB0aGFuIGluIGBjb2xsYXBzZV9zY2FuX3BtZCgpYC4gSW4gYGNvbGxhcHNlX3NjYW5fcG1kKClgLCB0aGUgaW5pdGlhbGl6YXRpb24gaXMgaW1wbGljaXQsIGJ1dCBJIG5lZWQgdG8gdmVyaWZ5IHRoYXQgYWxsIHRoZSBvbGQgYW5kIG5ldyBjb250ZXh0cyBhcmUgY29tcGFyYWJsZS4gVGhlIG9sZCBjb2RlIGhhZCBgaW50IHVubWFwcGVkID0gMDtgIGFuZCBzbyBvbiwgc28gbm93IEkgbmVlZCB0byBjaGVjayB0aGUgZGVmYXVsdCB2YWx1ZXMuIFNvIHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgYWxzbyAwLiBgbm9uZV9vcl96ZXJvYCBhbmQgYHNoYXJlZGAgYXJlIGFsc28gMC4gU28gbm8gZnVuY3Rpb25hbCBjaGFuZ2UgaGVyZS4KClRoZW4sIHRoZXJlIGlzIHRoZSBmdW5jdGlvbmFsIGVxdWl2YWxlbmNlIG9mIGB2bV9ub3JtYWxfZm9saW8oKWAgdnMgdGhlIG9sZCBgdm1fbm9ybWFsX3BhZ2UoKWAgJiM0MzsgYHBhZ2VfZm9saW8oKWAgY29tYmluYXRpb24uIEFsdGhvdWdoIHRoZXkgYXJlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IGZvciBtb3N0IGNhc2VzLCBgdm1fbm9ybWFsX2ZvbGlvKClgIG1pZ2h0IGJlIHNsaWdodGx5IGRpZmZlcmVudC4gU28gdGhpcyBwYXJ0IGlzIGFsc28gcmVmYWN0b3JpbmcuIFRoZSBzYW1lIGdvZXMgZm9yIHRoZSBhZGRpdGlvbiBvZiBgY291bnRfY29sbGFwc2VfZXZlbnQoKWAsIGl0IGlzIGEgc2ltcGxlIHJlZmFjdG9yaW5nLgoKV2FpdCwgbG9va2luZyBhdCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCwgSSBvYnNlcnZlIGEgY3JpdGljYWwgY2hhbmdlOiBgVk1fQlVHX09OX0ZPTElPYCBpcyBiZWluZyByZXBsYWNlZCBieSBgVk1fV0FSTl9PTl9GT0xJT2AuIFRoaXMgY2hhbmdlIGlzIGFsc28gYWRkZWQgaW4gYGNvbGxhcHNlX3NjYW5fcG1kKClgISBUaGlzIGlzIHBvdGVudGlhbGx5IHNpZ25pZmljYW50ISBJbiB0aGUgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAgY2FsbCBzaXRlLCB0aGUgb2xkIGNvZGUgaGFkIGEgYFZNX0JVR19PTl9GT0xJT2AgY2hlY2ssIGJ1dCBpdCBpcyByZXBsYWNlZCB3aXRoIGBWTV9XQVJOX09OX0ZPTElPYCBub3cuIEluIHRoZSBvdGhlciBjYWxsIHNpdGUsIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCwgaXQgdXNlZCB0byBzaW1wbHkgcmV0dXJuIGBTQ0FOX1BBR0VfQU5PTmAgd2hlbiBpdCBmb3VuZCBhIG5vbi1hbm9ueW1vdXMgcGFnZS4gTm93LCBpdCB3aWxsIHRyaWdnZXIgYSBgVk1fV0FSTl9PTl9GT0xJT2AgaWYgaXQmIzM5O3Mgbm90IGFub24hIFRoaXMgaXMgYSBkb3duZ3JhZGUgZm9yIG9uZSBjYWxsIHNpdGUsIGJ1dCBhbiBpbnRyb2R1Y3Rpb24gb2YgYSBuZXcgd2FybmluZyBmb3IgdGhlIG90aGVyLgoKU28gdGhlIHF1ZXN0aW9uIGJlY29tZXM6IGNhbiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgZXZlciBlbmNvdW50ZXIgYSBub24tYW5vbnltb3VzIGZvbGlvPyBJJiMzOTtsbCBuZWVkIHRvIHZlcmlmeSB0aGUgY2FsbCBwYXRocyBvZiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAsIHdoaWNoIGlzIGNhbGxlZCBmcm9tIGBraHVnZXBhZ2VkX3NjYW5fcG1kKClgLCB3aGljaCBpcyBjYWxsZWQgZnJvbSBga2h1Z2VwYWdlZF9zY2FuX21tX3Nsb3QoKWAuIEl0IHNjYW5zIGFub255bW91cyBWTUFzLCBtZWFuaW5nIHRoZSBub24tYW5vbiBmb2xpbyBtdXN0IGNvbWUgZnJvbSBhIHNvdXJjZSB0aGF0IGtodWdlcGFnZWQgaW50ZXJhY3RzIHdpdGguIEkmIzM5O20gdGhpbmtpbmcgdGhlIHplcm8gcGFnZSBpcyBoYW5kbGVkIGJ5IGBwdGVfbm9uZV9vcl96ZXJvKClgLiBJdCBsb29rcyBsaWtlIHRoaXMgbmV3IHdhcm5pbmcgY291bGQgYmUgdHJpZ2dlcmVkIGJ5IHNvbWV0aGluZyBsaWtlIGEgVk1BIGJlaW5nIGFub255bW91cywgYnV0IHRoZSB1bmRlcmx5aW5nIHBhZ2Ugbm90IGFjdHVhbGx5IGJlaW5nIGFub255bW91cy4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIGRvZXNuJiMzOTt0IGludHJvZHVjZSBhbnkgbmV3IGluc3RhYmlsaXR5IGR1ZSB0byBuZXcgd2FybmluZ3MuIEkmIzM5O2xsIG5lZWQgdG8gY2hlY2sgdGhlIFZNQSB0byB2ZXJpZnkgd2hldGhlciBga2h1Z2VwYWdlZGAgY2FuIGFjdHVhbGx5IGludGVyYWN0IHdpdGggdGhpcyBjYXNlIG9yIG5vdCwgYW5kIHdoZXRoZXIgdGhhdCBmb2xpbyBjYW4gYWN0dWFsbHkgYmUgbm9uLWFub24uCgpJJiMzOTttIG5vdyBnb2luZyB0byB1c2UgYGRlZmF1bHRfYXBpOmdyZXBwZXJgIHRvIHNlYXJjaCBmb3IgYGNvbGxhcHNlX3NjYW5fcG1kYCB0byB2ZXJpZnkgbXkgZmluZGluZ3MuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29sbGFwc2Vfc2Nhbl9wbWQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0va2h1Z2VwYWdlZC5jPTEyMjQ9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY2hlY2tfcG1kX3N0aWxsX3ZhbGlkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xMjM4LSAqIEJyaW5nIG1pc3NpbmcgcGFnZXMgaW4gZnJvbSBzd2FwLCB0byBjb21wbGV0ZSBUSFAgY29sbGFwc2UuXG5tbS9raHVnZXBhZ2VkLmM6MTIzOTogKiBPbmx5IGRvbmUgaWYgY29sbGFwc2Vfc2Nhbl9wbWQoKSBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLlxubW0va2h1Z2VwYWdlZC5jLTEyNDAtICpcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MTU2Mj1zdGF0aWMgdW5zaWduZWQgaW50IG1heF9vcmRlcl9mcm9tX29mZnNldCh1bnNpZ25lZCBpbnQgb2Zmc2V0KVxuLS1cbm1tL2todWdlcGFnZWQuYy0xNTcxLSAqIG10aHBfY29sbGFwc2UoKSBjb25zdW1lcyB0aGUgYml0bWFwIHRoYXQgaXMgZ2VuZXJhdGVkIGR1cmluZ1xubW0va2h1Z2VwYWdlZC5jOjE1NzI6ICogY29sbGFwc2Vfc2Nhbl9wbWQoKSB0byBkZXRlcm1pbmUgd2hhdCByZWdpb25zIGFuZCBtVEhQIG9yZGVycyBmaXQgYmVzdC5cbm1tL2todWdlcGFnZWQuYy0xNTczLSAqXG4tLVxubW0va2h1Z2VwYWdlZC5jPTE1ODc9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgbXRocF9jb2xsYXBzZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTY4OC1cbm1tL2todWdlcGFnZWQuYzoxNjg5OnN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxubW0va2h1Z2VwYWdlZC5jLTE2OTAtXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsXG4tLVxubW0va2h1Z2VwYWdlZC5jPTI4MTE9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2luZ2xlX3BtZCh1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTI4MjMtXHRpZiAodm1hX2lzX2Fub255bW91cyh2bWEpKSB7XG5tbS9raHVnZXBhZ2VkLmM6MjgyNDpcdFx0cmVzdWx0ID0gY29sbGFwc2Vfc2Nhbl9wbWQobW0sIHZtYSwgYWRkciwgbG9ja19kcm9wcGVkLCBjYyk7XG5tbS9raHVnZXBhZ2VkLmMtMjgyNS1cdFx0Z290byBlbmQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6Mzk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU1MjAKCQkJCQkJCW91dHB1dDogMjAKCQkJCQkJCXRob3VnaHRzOiA4MDgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEtlcm5lbCBCdWcgaW4gYGNvbGxhcHNlX3NjYW5fcG1kKClgKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgYW5kIGl0JiMzOTtzIGNhbGxlZCB3aGVuIHRoZSBWTUEgaXMgYW5vbnltb3VzLCBzcGVjaWZpY2FsbHkgd2hlbiBgdm1hX2lzX2Fub255bW91cyh2bWEpYCBpcyB0cnVlLiBNeSBmaXJzdCB0aG91Z2h0IGlzOiBjYW4gYW4gYW5vbnltb3VzIFZNQSAqYWN0dWFsbHkqIGNvbnRhaW4gYSBub24tYW5vbnltb3VzIGZvbGlvPyBJIGltbWVkaWF0ZWx5IGtub3cgdGhhdCBhIGBNQVBfUFJJVkFURWAgbWFwcGluZyBvZiBhIGZpbGUgd291bGQgcmV0dXJuIGZhbHNlIGZvciBgdm1hX2lzX2Fub255bW91cyh2bWEpYC4gQnV0IHdoYXQgYWJvdXQgYE1BUF9BTk9OWU1PVVMgfCBNQVBfU0hBUkVEYD8gVGhhdCYjMzk7cyBhIHNobWVtIFZNQSwgYWdhaW4sIGB2bWFfaXNfYW5vbnltb3VzKHZtYSlgIGlzIGZhbHNlLiAgQSBzdGFuZGFyZCBgbW1hcChNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUpYCBjcmVhdGVzIGFuICphbm9ueW1vdXMqIFZNQSwgYnV0IGNvdWxkIGl0IGhhdmUgYSBub24tYW5vbiBmb2xpbz8gIEkgY29uc2lkZXIgS1NNIHBhZ2VzLCBidXQgdGhleSYjMzk7cmUgYW5vbiwgc28gbm8gbHVjayB0aGVyZS4gVXByb2Jlcz8gU3RpbGwgYW5vbi4gUHRyYWNlIGluc2VydGVkIHBhZ2VzPyBTdGlsbCBhbm9uLgoKQWhhISBXaGF0IGlmIGEgZGV2aWNlIGRyaXZlciB1c2VzIGB2bV9pbnNlcnRfcGFnZSgpYCB0byBtYXAgcGFnZXMgaW50byBhbiBhbm9ueW1vdXMgVk1BPyBJZiBhIGRyaXZlciBkb2VzIGRvIGEgYHZtX2luc2VydF9wYWdlKClgIGludG8gYW4gYW5vbnltb3VzIFZNQSwgdGhhdCBwYWdlICptaWdodCogbm90IGJlIGFub255bW91cy4gR29vZC4gTGV0JiMzOTtzIHNlZS4uLiBgdm1fbm9ybWFsX2ZvbGlvKClgIHdpbGwgcmV0dXJuIHRoZSBmb2xpby4gSWYgaXQmIzM5O3Mgbm90IGFub24sIGBmb2xpb190ZXN0X2Fub24oKWAgd2lsbCByZXR1cm4gZmFsc2UuIEFuZCwgdGhlIGNydWNpYWwgcGFydCwgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCB3aWxsIHRyaWdnZXIgYSBgVk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGN0eC0mZ3Q7Zm9saW8pLCBjdHgtJmd0O2ZvbGlvKTtgLiBXYWl0LCBpcyB0aGlzIGEgYnVnIGluIHRoZSBwYXRjaD8gIEl0IGRpZG4mIzM5O3QgdXNlZCB0byBoYXZlIHRoYXQgd2FybmluZyEgTGV0IG1lIGNoZWNrIHRoZSBvcmlnaW5hbCBjb2RlLi4uCgpPa2F5LCBJIHNlZSBpdC4gVGhlIG9yaWdpbmFsIGNvZGUganVzdCByZXR1cm5lZCBgU0NBTl9QQUdFX0FOT05gLiBUaGUgbmV3IGNvZGUgbm93IGFkZHMgYSBgVk1fV0FSTl9PTl9GT0xJT2AsIHdoaWNoIG1lYW5zIHRoZSBjdXJyZW50IHBhdGNoIGludHJvZHVjZWQgYSBmdW5jdGlvbmFsIGNoYW5nZS4gVGhhdOKAmXMgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGZ1enplZCEKCkNhbiB3ZSBldmVuIHRyaWdnZXIgdGhpcyB3YXJuaW5nPyBIb3cgY291bGQgd2UgZ2V0IGEgbm9uLWFub24gcGFnZSBpbnRvIGFuIGFub24gVk1BPyBUaGUgYmVzdCB3YXkgSSB0aGluayB3b3VsZCBiZSBmb3Igc3l6a2FsbGVyIHRvIG1hcCBhIG5vbi1hbm9uIHBhZ2UgaW50byBhbiBhbm9ueW1vdXMgVk1BIGFuZCB0aGVuIHRyaWdnZXIga2h1Z2VwYWdlZCB0byBzY2FuIGl0LCB3aGljaCBzaG91bGQgdHJpZ2dlciB0aGUgd2FybmluZy4KCkkgc3RhcnQgcnVubmluZyB0aHJvdWdoIHBvc3NpYmxlIGF2ZW51ZXM6IGBtbWFwKE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSlgIHdvbiYjMzk7dCB3b3JrIHRvIG1hcCBhIG5vbi1hbm9uIHBhZ2UuIFdoYXQgYWJvdXQgYG1yZW1hcGA/IE5vLCBpdCBqdXN0IG1vdmVzIHRoZSB3aG9sZSBWTUEuIFdoYXQgYWJvdXQgYHZtc3BsaWNlYD8gV2hhdCBhYm91dCBgdXNlcmZhdWx0ZmRgPyBXaXRoIGBVRkZESU9fQ09QWWAsIGl0IGNvcGllcyBpbnRvIGFuIGFub24gcGFnZS4gQnV0IHdoYXQgYWJvdXQgYFVGRkRJT19DT05USU5VRWA/IFRoYXQmIzM5O3MgZm9yIHNobWVtL2h1Z2V0bGIuIGBtYWR2aXNlKE1BRFZfTUVSR0VBQkxFKWA/IEtTTSBwYWdlcyBhcmUgYW5vbiwgYWdhaW4uIGBPX0RJUkVDVGAgcmVhZCBpbnRvIGFuIGFub24gVk1BPyBQYWdlcyBhcmUgYW5vbi4gV2hhdCBhYm91dCBgZ2V0X3VzZXJfcGFnZXNgPwoKV2FpdCwgd2hhdCBpZiB3ZSB1c2UgYG1tYXBgIHRvIG1hcCBhIGZpbGUsIHRoZW4gYG1wcm90ZWN0YD8gTm8uIFdoYXQgYWJvdXQgYHJlbWFwX2ZpbGVfcGFnZXNgPyBJdCB3YXMgZGVwcmVjYXRlZC4KCk9rYXksIGxldCYjMzk7cyByZWNhcC4gSXQgaXMgcG9zc2libGUgdG8gdHJpZ2dlciB0aGlzIGNhc2UuIFRvIG1hcCBhIG5vbi1hbm9uIGZvbGlvIGludG8gYW5vbiBWTUEgd2Ugc2hvdWxkIHNlYXJjaCB0aHJvdWdoIHBvc3NpYmxlIHdheXMsIGZvciBleGFtcGxlOiBhIGRldmljZSBkcml2ZXIgdXNlcyBgdm1faW5zZXJ0X3BhZ2UoKWAgdG8gbWFwIHBhZ2VzIGludG8gYW4gYW5vbnltb3VzIFZNQS4gVGhpcyBpcyBkZWZpbml0ZWx5IGEgYnVnIGluIHRoZSBwYXRjaCEgTGV0JiMzOTtzIHNlYXJjaCBmb3IgYFNDQU5fUEFHRV9BTk9OYCBpbiB0aGUga2VybmVsIHNvdXJjZSB0byBzZWUgaWYgdGhpcyBpcyBhIGtub3duIGlzc3VlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjM5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O1NDQU5fUEFHRV9BTk9OJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgtMjYtXHRFTSggU0NBTl9QQUdFX0xPQ0ssXHRcdFwmIzM0O3BhZ2VfbG9ja2VkXCYjMzQ7KVx0XHRcdFxcXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oOjI3Olx0RU0oIFNDQU5fUEFHRV9BTk9OLFx0XHRcJiMzNDtwYWdlX25vdF9hbm9uXCYjMzQ7KVx0XHRcXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC0yOC1cdEVNKCBTQ0FOX1BBR0VfTEFaWUZSRUUsXHRcdFwmIzM0O3BhZ2VfbGF6eWZyZWVcJiMzNDspXHRcdFxcXG4tLVxubW0va2h1Z2VwYWdlZC5jPTMzPWVudW0gc2Nhbl9yZXN1bHQge1xuLS1cbm1tL2todWdlcGFnZWQuYy00OS1cdFNDQU5fUEFHRV9MT0NLLFxubW0va2h1Z2VwYWdlZC5jOjUwOlx0U0NBTl9QQUdFX0FOT04sXG5tbS9raHVnZXBhZ2VkLmMtNTEtXHRTQ0FOX1BBR0VfTEFaWUZSRUUsXG4tLVxubW0va2h1Z2VwYWdlZC5jPTc0Nz1zdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGVfdCBwdGV2YWwsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTc5Mi1cdFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGN0eC1cdTAwM2Vmb2xpbyksIGN0eC1cdTAwM2Vmb2xpbyk7XG5tbS9raHVnZXBhZ2VkLmM6NzkzOlx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfQU5PTik7XG5tbS9raHVnZXBhZ2VkLmMtNzk0LVx0fVxuLS1cbm1tL2todWdlcGFnZWQuYz0xMTUzPXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTExODYtXHRpZiAoZXhwZWN0X2Fub24gXHUwMDI2XHUwMDI2ICghKCp2bWFwKS1cdTAwM2Vhbm9uX3ZtYSB8fCAhdm1hX2lzX2Fub255bW91cygqdm1hcCkpKVxubW0va2h1Z2VwYWdlZC5jOjExODc6XHRcdHJldHVybiBTQ0FOX1BBR0VfQU5PTjtcbm1tL2todWdlcGFnZWQuYy0xMTg4LVx0cmV0dXJuIFNDQU5fU1VDQ0VFRDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzU5NQoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDY2NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEtodWdlcGFnZWQgQW5vbnltb3VzIFBhZ2UgQ29sbGFwc2UgTG9naWMqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoKWAgZnVuY3Rpb24gYW5kIEkgc2VlIGl0IHJldHVybnMgYFNDQU5fUEFHRV9BTk9OYCB3aGVuIGBleHBlY3RfYW5vbmAgaXMgdHJ1ZSwgYnV0IHRoZSBWTUEgaXNuJiMzOTt0IGFub255bW91cyBhbnltb3JlLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgJiMzNDtXaGVyZSBhcmUgd2UgY2hlY2tpbmcgdGhpcz8mIzM0OyBUaGVuIEkgcmVtZW1iZXIgdGhhdCBgY29sbGFwc2VfY2hlY2tfcHRlKClgIGlzIGNhbGxlZCB3aGVuIHNjYW5uaW5nIHRoZSBQVEVzLgoKTm93LCBoZXJlJiMzOTtzIHdoZXJlIGl0IGdldHMgaW50ZXJlc3RpbmcuIEkmIzM5O20gbG9va2luZyBhdCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBhbmQgcmVhbGl6ZSB0aGUgb2xkIGNvZGUgYWxyZWFkeSBoYWQgYFZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSwgZm9saW8pO2AuIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGFyZSBjb2xsYXBzaW5nIGFub24gcGFnZXMgYW5kIHRocm93cyBhIFZNIGJ1ZyBpZiBub3QuCgpUaGUgcGF0Y2ggcmVwbGFjZXMgdGhpcyB3aXRoIGBjb2xsYXBzZV9jaGVja19wdGUoKWAsIHdoaWNoIGhhcyBgVk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGN0eC0mZ3Q7Zm9saW8pLCBjdHgtJmd0O2ZvbGlvKTtgLiBTbywgdGhlIHBhdGNoIGFjdHVhbGx5ICpkb3duZ3JhZGVzKiBhIGBWTV9CVUdfT05fRk9MSU9gIHRvIGEgYFZNX1dBUk5fT05fRk9MSU9gIGluIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgISBBdCB0aGUgc2FtZSB0aW1lIGl0ICp1cGdyYWRlcyogYSBzaWxlbnQgcmV0dXJuIHRvIGBWTV9XQVJOX09OX0ZPTElPYCBpbiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAuCgpIb2xkIG9uLCBJIG5lZWQgdG8gdHJhY2UgdGhlIGNhbGwgZmxvdy4gYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAgaXMgY2FsbGVkIGZyb20gYGNvbGxhcHNlX2h1Z2VfcGFnZSgpYCwgd2hpY2ggaXMgY2FsbGVkICphZnRlciogYGNvbGxhcHNlX3NjYW5fcG1kKClgIGhhcyBzdWNjZWVkZWQuIFNvIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBzY2FucyB0aGUgUE1EIGFuZCBpZiBpdCBmaW5kcyBhIG5vbi1hbm9ueW1vdXMgZm9saW8sIGl0ICp1c2VkKiB0byBzaWxlbnRseSByZXR1cm4gYFNDQU5fUEFHRV9BTk9OYC4gSWYgaXQgKnN1Y2NlZWRlZCosIGFsbCB0aGUgZm9saW9zIHdlcmUgYW5vbnltb3VzLiBUaGVuLCBgY29sbGFwc2VfaHVnZV9wYWdlKClgIGlzIGNhbGxlZCwgd2hpY2ggY2FsbHMgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAuIEluIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgLCBpdCB1c2VkIHRvIGhhdmUgdGhlIGBWTV9CVUdfT05fRk9MSU9gLCBiZWNhdXNlIGl0ICphc3N1bWVkKiB0aGF0IHNpbmNlIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBhbHJlYWR5IGNoZWNrZWQsIGl0IG11c3QgYmUgYW5vbnltb3VzLgoKQnV0IHdhaXQgYSBtaW51dGXigKYgdGhlIGBtbWFwX2xvY2tgIGlzIGRyb3BwZWQgKmJldHdlZW4qIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBhbmQgYGNvbGxhcHNlX2h1Z2VfcGFnZSgpYCEgIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBkcm9wcyB0aGUgbG9jayBiZWZvcmUgY2FsbGluZyBgbXRocF9jb2xsYXBzZSgpYC4KCk5vdywgaXMgYG10aHBfY29sbGFwc2UoKWAgY2FsbGVkICppbnN0ZWFkKiBvZiBgY29sbGFwc2VfaHVnZV9wYWdlKClgPyAgTGV0JiMzOTtzIGNoZWNrIGBtdGhwX2NvbGxhcHNlKClgLi4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bXRocF9jb2xsYXBzZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9raHVnZXBhZ2VkLmM9MTU2Mj1zdGF0aWMgdW5zaWduZWQgaW50IG1heF9vcmRlcl9mcm9tX29mZnNldCh1bnNpZ25lZCBpbnQgb2Zmc2V0KVxuLS1cbm1tL2todWdlcGFnZWQuYy0xNTcwLS8qXG5tbS9raHVnZXBhZ2VkLmM6MTU3MTogKiBtdGhwX2NvbGxhcHNlKCkgY29uc3VtZXMgdGhlIGJpdG1hcCB0aGF0IGlzIGdlbmVyYXRlZCBkdXJpbmdcbm1tL2todWdlcGFnZWQuYy0xNTcyLSAqIGNvbGxhcHNlX3NjYW5fcG1kKCkgdG8gZGV0ZXJtaW5lIHdoYXQgcmVnaW9ucyBhbmQgbVRIUCBvcmRlcnMgZml0IGJlc3QuXG4tLVxubW0va2h1Z2VwYWdlZC5jLTE1ODYtICovXG5tbS9raHVnZXBhZ2VkLmM6MTU4NzpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBtdGhwX2NvbGxhcHNlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxubW0va2h1Z2VwYWdlZC5jLTE1ODgtXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50IHJlZmVyZW5jZWQsIGludCB1bm1hcHBlZCxcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MTY4OT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTcyOS1cdCAqIHNjYW4gYWxsIHBhZ2VzIHRvIHBvcHVsYXRlIHRoZSBiaXRtYXAgZm9yIG1USFAgY29sbGFwc2UuIFRoZSBiaXRtYXBcbm1tL2todWdlcGFnZWQuYzoxNzMwOlx0ICogaXMgdGhlbiBjaGVja2VkIGFnYWluIGluIG10aHBfY29sbGFwc2UoKSBmb3IgZWFjaCBhdHRlbXB0ZWQgb3JkZXIuXG5tbS9raHVnZXBhZ2VkLmMtMTczMS1cdCAqL1xuLS1cbm1tL2todWdlcGFnZWQuYy0xODA3LVx0XHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcbm1tL2todWdlcGFnZWQuYzoxODA4Olx0XHRyZXN1bHQgPSBtdGhwX2NvbGxhcHNlKG1tLCBzdGFydF9hZGRyLCByZWZlcmVuY2VkLFxubW0va2h1Z2VwYWdlZC5jLTE4MDktXHRcdFx0XHQgICAgICAgY3R4LnVubWFwcGVkLCBjYywgZW5hYmxlZF9vcmRlcnMpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5MjQ0CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKkFuYWx5emluZyB0aGUgRnVuY3Rpb24gQ2FsbDogYG10aHBfY29sbGFwc2UoKWAqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBUaGUgbWVudGFsIHRyaWdnZXIgaGVyZSBpcyBzZWVpbmcgdGhhdCBmdW5jdGlvbiBjYWxsOiBgbXRocF9jb2xsYXBzZSgpYC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGltbWVkaWF0ZWx5IHN0YXJ0IHBhcnNpbmcgd2hhdCB0aGF0ICptZWFucyouIEJhc2VkIG9uIHRoZSBuYW1pbmcgY29udmVudGlvbiAoYXNzdW1pbmcgdGhpcyBpcyBteSBvd24gY29kZWJhc2Ugb3Igb25lIEkmIzM5O20gdmVyeSBmYW1pbGlhciB3aXRoKSwgdGhlICYjMzQ7bXRocCYjMzQ7IHN0cm9uZ2x5IHN1Z2dlc3RzIHRoaXMgaXMgcmVsYXRlZCB0byBzb21ldGhpbmcgbGlrZSAmIzM0O011bHRpLXRocmVhZGVkIEhpZXJhcmNoaWNhbCBQcm9jZXNzaW5nLCYjMzQ7IG9yIG1heWJlIGEgc2ltaWxhciBzdHJ1Y3R1cmUgdGhhdCB1dGlsaXplcyBjb2xsYXBzZSBvcGVyYXRpb24gZm9yIHBhcmFsbGVsaXNtLiBUaGUgbmFtZSAmIzM0O2NvbGxhcHNlJiMzNDsgaXMgY3JpdGljYWwgaGVyZS4gSXQgaGludHMgYXQgc29tZSBraW5kIG9mIHJlZHVjdGlvbiBvciBhZ2dyZWdhdGlvbiBwcm9jZXNzIGFwcGxpZWQgdG8gYSBoaWVyYXJjaGljYWwgb3IgcGFyYWxsZWwgZGF0YSBzdHJ1Y3R1cmUuIEkmIzM5O20gYWxyZWFkeSBhbnRpY2lwYXRpbmcga2V5IGVsZW1lbnRzIG9mIGl0IG1pZ2h0IGJlIHJlbGF0ZWQgdG8gZWl0aGVyIGRhdGEgcmVkdWN0aW9uIChhICYjMzk7Y29sbGFwc2UmIzM5OyBpbnRvIGFnZ3JlZ2F0ZSBkYXRhKSBvciB0aHJlYWQgc3luY2hyb25pemF0aW9uIGFuZCB3YWl0aW5nLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgaGllcmFyY2hpY2FsIGFzcGVjdCBhbmQgdGhyZWFkaW5nIHJlbGF0aW9uc2hpcCBvZiB0aGF0IHNwZWNpZmljIGNvbnRleHQgdG8gdW5kZXJzdGFuZCB3aGF0IHR5cGUgb2YgaW5mb3JtYXRpb24gYW5kIGRhdGEgaXMgcGFzc2VkLiBUaGUgZ29hbCB3b3VsZCBsaWtlbHkgYmUgdG8gcmVkdWNlIHRoZSBjb21wbGV4aXR5IG9mIHRoZSBkYXRhIGJ5IG1lcmdpbmcgb3IgZ3JvdXBpbmcgZGF0YSBpbiBhbiBvcmRlcmx5IGZhc2hpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjQwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0va2h1Z2VwYWdlZC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTU4NywKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNTg3Olx0c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgbXRocF9jb2xsYXBzZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbjE1ODg6XHRcdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgcmVmZXJlbmNlZCwgaW50IHVubWFwcGVkLFxuMTU4OTpcdFx0XHRzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsIHVuc2lnbmVkIGxvbmcgZW5hYmxlZF9vcmRlcnMpXG4xNTkwOlx0e1xuMTU5MTpcdFx0dW5zaWduZWQgaW50IG5yX29jY3VwaWVkX3B0ZXMsIG5yX3B0ZXMsIG1heF9wdGVzX25vbmU7XG4xNTkyOlx0XHRlbnVtIHNjYW5fcmVzdWx0IGxhc3RfcmVzdWx0ID0gU0NBTl9GQUlMO1xuMTU5MzpcdFx0aW50IGNvbGxhcHNlZCA9IDA7XG4xNTk0Olx0XHRib29sIGFsbG9jX2ZhaWxlZCA9IGZhbHNlO1xuMTU5NTpcdFx0dW5zaWduZWQgbG9uZyBjb2xsYXBzZV9hZGRyZXNzO1xuMTU5NjpcdFx0dW5zaWduZWQgaW50IG9mZnNldCA9IDA7XG4xNTk3Olx0XHR1bnNpZ25lZCBpbnQgb3JkZXIgPSBIUEFHRV9QTURfT1JERVI7XG4xNTk4Olx0XG4xNTk5Olx0XHR3aGlsZSAob2Zmc2V0IFx1MDAzYyBIUEFHRV9QTURfTlIpIHtcbjE2MDA6XHRcdFx0bnJfcHRlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4xNjAxOlx0XG4xNjAyOlx0XHRcdGlmICghdGVzdF9iaXQob3JkZXIsIFx1MDAyNmVuYWJsZWRfb3JkZXJzKSlcbjE2MDM6XHRcdFx0XHRnb3RvIG5leHRfb3JkZXI7XG4xNjA0Olx0XG4xNjA1Olx0XHRcdG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCBOVUxMLCBvcmRlcik7XG4xNjA2Olx0XHRcdG5yX29jY3VwaWVkX3B0ZXMgPSBiaXRtYXBfd2VpZ2h0X2Zyb20oY2MtXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMsIG9mZnNldCxcbjE2MDc6XHRcdFx0XHRcdFx0XHQgICAgICBvZmZzZXQgJiM0MzsgbnJfcHRlcyk7XG4xNjA4Olx0XG4xNjA5Olx0XHRcdC8qXG4xNjEwOlx0XHRcdCAqIFN3YXAgUFRFcyBhY2NlcHRlZCBkdXJpbmcgdGhlIHNjYW4gYXJlIGNvdW50ZWQgaW4gQHVubWFwcGVkLFxuMTYxMTpcdFx0XHQgKiBub3QgaW4gdGhlIHByZXNlbnQtUFRFIGJpdG1hcC4gQWNjb3VudCB0aGVtIGZvciB0aGUgUE1ELW9yZGVyXG4xNjEyOlx0XHRcdCAqIGNhbmRpZGF0ZS5cbjE2MTM6XHRcdFx0ICovXG4xNjE0Olx0XHRcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuMTYxNTpcdFx0XHRcdG5yX29jY3VwaWVkX3B0ZXMgJiM0Mzs9IHVubWFwcGVkO1xuMTYxNjpcdFxuMTYxNzpcdFx0XHRpZiAobnJfb2NjdXBpZWRfcHRlcyBcdTAwM2U9IG5yX3B0ZXMgLSBtYXhfcHRlc19ub25lKSB7XG4xNjE4Olx0XHRcdFx0ZW51bSBzY2FuX3Jlc3VsdCByZXQ7XG4xNjE5Olx0XG4xNjIwOlx0XHRcdFx0Y29sbGFwc2VfYWRkcmVzcyA9IGFkZHJlc3MgJiM0Mzsgb2Zmc2V0ICogUEFHRV9TSVpFO1xuMTYyMTpcdFx0XHRcdHJldCA9IGNvbGxhcHNlX2h1Z2VfcGFnZShtbSwgY29sbGFwc2VfYWRkcmVzcywgcmVmZXJlbmNlZCxcbjE2MjI6XHRcdFx0XHRcdFx0XHQgdW5tYXBwZWQsIGNjLCBvcmRlcik7XG4xNjIzOlx0XG4xNjI0Olx0XHRcdFx0c3dpdGNoIChyZXQpIHtcbjE2MjU6XHRcdFx0XHQvKiBDYXNlcyB3aGVyZSB3ZSBjb250aW51ZSB0byBuZXh0IGNvbGxhcHNlIGNhbmRpZGF0ZSAqL1xuMTYyNjpcdFx0XHRcdGNhc2UgU0NBTl9TVUNDRUVEOlxuMTYyNzpcdFx0XHRcdFx0Y29sbGFwc2VkICYjNDM7PSBucl9wdGVzO1xuMTYyODpcdFx0XHRcdFx0ZmFsbHRocm91Z2g7XG4xNjI5Olx0XHRcdFx0Y2FzZSBTQ0FOX1BURV9NQVBQRURfSFVHRVBBR0U6XG4xNjMwOlx0XHRcdFx0XHRnb3RvIG5leHRfb2Zmc2V0O1xuMTYzMTpcdFx0XHRcdC8qIENhc2VzIHdoZXJlIGxvd2VyIG9yZGVycyBtaWdodCBzdGlsbCBzdWNjZWVkICovXG4xNjMyOlx0XHRcdFx0Y2FzZSBTQ0FOX0FMTE9DX0hVR0VfUEFHRV9GQUlMOlxuMTYzMzpcdFx0XHRcdFx0YWxsb2NfZmFpbGVkID0gdHJ1ZTtcbjE2MzQ6XHRcdFx0XHRcdGZhbGx0aHJvdWdoO1xuMTYzNTpcdFx0XHRcdGNhc2UgU0NBTl9MQUNLX1JFRkVSRU5DRURfUEFHRTpcbjE2MzY6XHRcdFx0XHRjYXNlIFNDQU5fRVhDRUVEX05PTkVfUFRFOlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDMzNQoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDI0ODkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHlzaXMgb2YgSHVnZSBQYWdlIENvbGxhcHNlIENvZGUgQ2hhbmdlcyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgcHJvY2VzcyBmb2N1c2VkIG9uIHRoZSBmbG93IG9mIGBtdGhwX2NvbGxhcHNlKClgIGNhbGxpbmcgYGNvbGxhcHNlX2h1Z2VfcGFnZSgpYC4gVGhlIGtleSBjb25jZXJuIHdhcyB0aGUgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gZHJvcHBpbmcgYW5kIHJlYWNxdWlyaW5nIHRoZSBtbWFwX2xvY2sgYW5kIHRoZSBtb2RpZmljYXRpb24gb2YgUFRFcy4gVGhlIHJldmFsaWRhdGlvbiB0aHJvdWdoIGBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZSgpYCBzZWVtZWQgbGlrZSBhIHBvdGVudGlhbCBzYWZlZ3VhcmQuCgpNeSBtaW5kIHRoZW4ganVtcGVkIHRvIHRoZSBjcml0aWNhbCBwb2ludDogdGhlIGhhbmRsaW5nIG9mIG5vbi1hbm9ueW1vdXMgcGFnZXMgd2l0aGluIGFuIGFub255bW91cyBWTUEuIFNwZWNpZmljYWxseSwgSSBjb25zaWRlcmVkIHNjZW5hcmlvcyBsaWtlIHplcm8gcGFnZXMsIEtTTSBwYWdlcywgYW5kIHBhZ2VzIGZyb20gZmlsZXMuIFRoZSBgdm1faW5zZXJ0X3BhZ2UoKWAgZnVuY3Rpb24mIzM5O3MgYWJpbGl0eSB0byBtYXAgbm9uLWFub24gcGFnZXMgaW50byBhbnkgVk1BIHJhaXNlZCBhIHJlZCBmbGFnLiBUaGlzIGJyb3VnaHQgdGhlIGBWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oY3R4LSZndDtmb2xpbyksIGN0eC0mZ3Q7Zm9saW8pO2AgY2hlY2ssIHdoaWNoIHJlcGxhY2VkIGEgYFZNX0JVR19PTl9GT0xJT2AgZnJvbSB0aGUgb2xkZXIgY29kZS4gU28gdGhlIGNoYW5nZSByZXN1bHRlZCBpbiBhIGRvd25ncmFkZSBmcm9tIGEgQlVHIHRvIGEgV0FSTi4gQW5kIGFsc28gdGhlIGNvZGUgbm93IFdBUk5TIGluIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCB3aGVyZSBpdCB1c2VkIHRvIGp1c3QgcmV0dXJuLgoKSSB3ZW50IGludG8gaW52ZXN0aWdhdGluZyB3aGF0IGhhcHBlbnMgaW5zaWRlIGBjb2xsYXBzZV9jaGVja19wdGUoKWAsIHdoZXJlIGl0JiMzOTtzIGNhbGxlZCBmcm9tIGJvdGggYGNvbGxhcHNlX3NjYW5fcG1kKClgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYC4gVGhlIGFkZGl0aW9uIG9mIHRoZSBXQVJOIGluIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSwgYXMgaXQgaW50cm9kdWNlcyBhIHdhcm5pbmcgd2hlcmUgcHJldmlvdXNseSwgdGhlcmUgd2FzIG5vbmUuIEkgd29uZGVyZWQgaWYgdGhpcyBhZGRzIGEgd2FybmluZy4KCkkgY2hlY2tlZCBgcHRlX2lzX3JlZmVyZW5jZWQoKWAsIGNvbXBhcmluZyB0aGUgb2xkIGFuZCBuZXcgaW5saW5lIGNvZGUuIEl0JiMzOTtzIHVuY2hhbmdlZCwgd2hpY2ggaXMgZ29vZC4gVGhlbiwgSSBsb29rZWQgYXQgdGhlIGhhbmRsaW5nIG9mIHNoYXJlZCBwYWdlcyBhbmQgdW5tYXBwZWQgcGFnZXMgd2l0aGluIGJvdGggYGNvbGxhcHNlX3NjYW5fcG1kKClgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCwgYW5kIHRoZXNlIHNlY3Rpb25zIGFyZSBhbHNvIHRoZSBzYW1lLiBUaGUgVUZGRCAodXNlcmZhdWx0ZmQpIGhhbmRsaW5nIGlzIGFsc28gY29uc2lzdGVudCBhY3Jvc3MgYm90aCBvbGQgYW5kIG5ldyBjb2RlLgoKRmluYWxseSwgdGhlIGNoYW5nZSB0byBgY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oKWAgYWRkcyBhIG5ldyBmdW5jdGlvbiB0aGF0IGluaXRpYWxpemVzIHRoZSBzY2FuLCBob3dldmVyIHRoZSBjb2RlIGFsc28gaGFzIGEgYGJpdG1hcF96ZXJvKClgIGNhbGwgdGhhdCB3YXMgKm5vdCogaW4gYGNvbGxhcHNlX3NjYW5fZmlsZSgpYCBiZWZvcmUuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgYW5kIGBjb2xsYXBzZV9zY2FuX2ZpbGUoKWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjQwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbGxhcHNlX3NjYW5fZmlsZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9raHVnZXBhZ2VkLmM9MjI2OT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTI3MDAtXG5tbS9raHVnZXBhZ2VkLmM6MjcwMTpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG5tbS9raHVnZXBhZ2VkLmMtMjcwMi1cdFx0dW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgcGdvZmZfdCBzdGFydCxcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MjgxMT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zaW5nbGVfcG1kKHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMjgzMy1yZXRyeTpcbm1tL2todWdlcGFnZWQuYzoyODM0Olx0cmVzdWx0ID0gY29sbGFwc2Vfc2Nhbl9maWxlKG1tLCBhZGRyLCBmaWxlLCBwZ29mZiwgY2MpO1xubW0va2h1Z2VwYWdlZC5jLTI4MzUtXG4tLVxubW0vbXJlbWFwLmM9MTk3PXN0YXRpYyBpbnQgbW92ZV9wdGVzKHN0cnVjdCBwYWdldGFibGVfbW92ZV9jb250cm9sICpwbWMsXG4tLVxubW0vbXJlbWFwLmMtMjQ2LVx0Lypcbm1tL21yZW1hcC5jOjI0NzpcdCAqIE5vdyBuZXdfcHRlIGlzIG5vbmUsIHNvIGNvbGxhcHNlX3NjYW5fZmlsZSgpIHBhdGggY2FuIG5vdCBmaW5kXG5tbS9tcmVtYXAuYy0yNDgtXHQgKiB0aGlzIGJ5IHRyYXZlcnNpbmcgZmlsZS1cdTAwM2VmX21hcHBpbmcsIHNvIHRoZXJlIGlzIG5vIGNvbmN1cnJlbmN5IHdpdGhcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjM2ODEKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAzMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIGhvdyBJJiMzOTtkIGFwcHJvYWNoIHRoaXMgdGFzaywgYXMgaWYgdGhlc2Ugd2VyZSBteSBpbnRlcm5hbCB0aG91Z2h0czoKCioqQW5hbHl6aW5nIGBjb2xsYXBzZV9zY2FuX2ZpbGUoKWAgZm9yIGBjYy0mZ3Q7bXRocF9wcmVzZW50X3B0ZXNgIFVzYWdlKioKClJpZ2h0LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYGNjLSZndDttdGhwX3ByZXNlbnRfcHRlc2AgaXMgYmVpbmcgdXNlZC4gVGhlIG1vc3QgbG9naWNhbCBwbGFjZSB0byBzdGFydCBpcyB3aXRoaW4gdGhlIGBjb2xsYXBzZV9zY2FuX2ZpbGUoKWAgZnVuY3Rpb24uIEkgd2FudCB0byBzZWUgaWYgdGhpcyBwYXJ0aWN1bGFyIG1lbWJlciBvZiB0aGUgYGNjYCAocHJlc3VtYWJseSBzb21lIGtpbmQgb2YgY29udHJvbCBjb250ZXh0IG9yIGNhY2hlIHN0cnVjdHVyZSkgaXMgYWN0dWFsbHkgYWNjZXNzZWQgYW5kIG1hbmlwdWxhdGVkIHdpdGhpbiB0aGF0IGZ1bmN0aW9uLiBJJiMzOTtsbCBuZWVkIHRvIGNhcmVmdWxseSBleGFtaW5lIHRoZSBjb2RlIHdpdGhpbiBgY29sbGFwc2Vfc2Nhbl9maWxlKClgIHRvIGNvbmZpcm0gaXRzIHVzYWdlLiBLbm93aW5nIHdoZXJlIHRoaXMgdmFyaWFibGUgaXMgdXNlZCBpcyBjcml0aWNhbCBmb3IgdW5kZXJzdGFuZGluZyBpdHMgcHVycG9zZSBhbmQgaW1wYWN0LiBJJiMzOTtsbCBuZWVkIHRvIGNoZWNrIHRoZSBmdW5jdGlvbiwgbGluZSBieSBsaW5lLCB0byBzZWUgaWYgdGhlIHZhcmlhYmxlIGlzIGRpcmVjdGx5IHVzZWQgb3IgaWYgYW5vdGhlciB2YXJpYWJsZSB3aGljaCB1c2VzIGl0IGlzIHVzZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjQwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0va2h1Z2VwYWdlZC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjcwMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyNzAxOlx0c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuMjcwMjpcdFx0XHR1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBmaWxlICpmaWxlLCBwZ29mZl90IHN0YXJ0LFxuMjcwMzpcdFx0XHRzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXG4yNzA0Olx0e1xuMjcwNTpcdFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCBOVUxMLCBIUEFHRV9QTURfT1JERVIpO1xuMjcwNjpcdFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpO1xuMjcwNzpcdFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IE5VTEw7XG4yNzA4Olx0XHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZpbGUtXHUwMDNlZl9tYXBwaW5nO1xuMjcwOTpcdFx0WEFfU1RBVEUoeGFzLCBcdTAwMjZtYXBwaW5nLVx1MDAzZWlfcGFnZXMsIHN0YXJ0KTtcbjI3MTA6XHRcdGludCBwcmVzZW50LCBzd2FwO1xuMjcxMTpcdFx0aW50IG5vZGUgPSBOVU1BX05PX05PREU7XG4yNzEyOlx0XHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcbjI3MTM6XHRcbjI3MTQ6XHRcdHByZXNlbnQgPSAwO1xuMjcxNTpcdFx0c3dhcCA9IDA7XG4yNzE2Olx0XHRjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7XG4yNzE3Olx0XHRyY3VfcmVhZF9sb2NrKCk7XG4yNzE4Olx0XHR4YXNfZm9yX2VhY2goXHUwMDI2eGFzLCBmb2xpbywgc3RhcnQgJiM0MzsgSFBBR0VfUE1EX05SIC0gMSkge1xuMjcxOTpcdFx0XHRpZiAoeGFzX3JldHJ5KFx1MDAyNnhhcywgZm9saW8pKVxuMjcyMDpcdFx0XHRcdGNvbnRpbnVlO1xuMjcyMTpcdFxuMjcyMjpcdFx0XHRpZiAoeGFfaXNfdmFsdWUoZm9saW8pKSB7XG4yNzIzOlx0XHRcdFx0c3dhcCAmIzQzOz0gMSBcdTAwM2NcdTAwM2MgeGFzX2dldF9vcmRlcihcdTAwMjZ4YXMpO1xuMjcyNDpcdFx0XHRcdGlmIChzd2FwIFx1MDAzZSBtYXhfcHRlc19zd2FwKSB7XG4yNzI1Olx0XHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TV0FQX1BURTtcbjI3MjY6XHRcdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSk7XG4yNzI3Olx0XHRcdFx0XHRicmVhaztcbjI3Mjg6XHRcdFx0XHR9XG4yNzI5Olx0XHRcdFx0Y29udGludWU7XG4yNzMwOlx0XHRcdH1cbjI3MzE6XHRcbjI3MzI6XHRcdFx0aWYgKCFmb2xpb190cnlfZ2V0KGZvbGlvKSkge1xuMjczMzpcdFx0XHRcdHhhc19yZXNldChcdTAwMjZ4YXMpO1xuMjczNDpcdFx0XHRcdGNvbnRpbnVlO1xuMjczNTpcdFx0XHR9XG4yNzM2Olx0XG4yNzM3Olx0XHRcdGlmICh1bmxpa2VseShmb2xpbyAhPSB4YXNfcmVsb2FkKFx1MDAyNnhhcykpKSB7XG4yNzM4Olx0XHRcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbjI3Mzk6XHRcdFx0XHR4YXNfcmVzZXQoXHUwMDI2eGFzKTtcbjI3NDA6XHRcdFx0XHRjb250aW51ZTtcbjI3NDE6XHRcdFx0fVxuMjc0MjpcdFxuMjc0MzpcdFx0XHRpZiAoaXNfcG1kX29yZGVyKGZvbGlvX29yZGVyKGZvbGlvKSkpIHtcbjI3NDQ6XHRcdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9NQVBQRURfSFVHRVBBR0U7XG4yNzQ1Olx0XHRcdFx0LypcbjI3NDY6XHRcdFx0XHQgKiBQTUQtc2l6ZWQgVEhQIGltcGxpZXMgdGhhdCB3ZSBjYW4gb25seSB0cnlcbjI3NDc6XHRcdFx0XHQgKiByZXRyYWN0aW5nIHRoZSBQVEUgdGFibGUuXG4yNzQ4Olx0XHRcdFx0ICovXG4yNzQ5Olx0XHRcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbjI3NTA6XHRcdFx0XHRicmVhaztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjQ3MjAKCQkJCQkJCW91dHB1dDogMTkKCQkJCQkJCXRob3VnaHRzOiAyNjI3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIENvbGxhcHNlIENvZGUgQ2hhbmdlcyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgd2FzIGZvY3VzZWQgb24gY29uZmlybWluZyB0aGF0IGNlcnRhaW4gb3B0aW1pemF0aW9ucyBpbiBgY29sbGFwc2Vfc2Nhbl9maWxlKClgIHdvdWxkbiYjMzk7dCBpbmFkdmVydGVudGx5IGltcGFjdCB0aGUgb3ZlcmFsbCBjb2xsYXBzZSBsb2dpYy4gU3BlY2lmaWNhbGx5LCB0aGUgemVyb2luZyBvZiBgY2MtJmd0O210aHBfcHJlc2VudF9wdGVzYCBpbiB0aGF0IHNwZWNpZmljIGZ1bmN0aW9uIGFwcGVhcmVkIHNhZmUsIGFzIGl0JiMzOTtzIG5vdCBkaXJlY3RseSB1dGlsaXplZCB3aXRoaW4gdGhlIGZ1bmN0aW9uJiMzOTtzIHNjb3BlLiBIb3dldmVyLCB0aGlzIHRyaWdnZXJlZCBhIG5lZWQgdG8gbW9yZSByaWdvcm91c2x5IGludmVzdGlnYXRlIHRoZSBzdXJyb3VuZGluZyBjb2RlLgoKVGhlIGZpcnN0IGFyZWEgb2YgY29uY2VybiB3YXMgYXJvdW5kIHRoZSBsYXp5ZnJlZSBoYW5kbGluZywgc3BlY2lmaWNhbGx5IHdpdGhpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBhbmQgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYC4gSXQmIzM5O3MgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZDogd2Ugd2FudCB0byBwcmVzZXJ2ZSBsYXp5ZnJlZSBwYWdlcyBpZiB0aGUgVk1BIGhhcyB0aGUgYFZNX0RST1BQQUJMRWAgZmxhZyBzZXQsIGFuZCB0aGUgcGFnZSBpcyBhY3R1YWxseSBsYXp5ZnJlZSBhbmQgbm90IGRpcnR5LiBUaGUgY2hlY2sgaW4gdGhlIG5ldyBjb2RlIHVzaW5nIHRoZSBjb250ZXh0IHN0cnVjdHVyZSAoYGN0eGApIGFwcGVhcnMgZnVuY3Rpb25hbGx5IGlkZW50aWNhbCB0byB0aGUgb2xkZXIgaW1wbGVtZW50YXRpb24uIFdlIGFyZSBqdXN0IHVzaW5nIHRoZSBjb250ZXh0IHRvIHBhc3MgZGF0YSwgYXMgaXMgcHJvcGVyLgoKTmV4dCwgSSBsb29rZWQgYXQgdGhlICYjMzQ7eW91bmcmIzM0OyBwYWdlIGNoZWNrLCB3aGljaCBkZXRlcm1pbmVzIGlmIGEgUFRFIGlzICYjMzQ7eW91bmcmIzM0OyBlbm91Z2ggdG8ganVzdGlmeSBjb2xsYXBzaW5nLiBUaGUgbG9naWMgd2l0aGluIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgIGFuZCBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgYXBwZWFycyB0byBiZSBpZGVudGljYWwgYXMgd2VsbC4gVGhlIG9sZCBgcHRlX3lvdW5nKClgIGFuZCBmb2xpbyBjaGVja3MsIGFzIHdlbGwgYXMgdGhlIE1NVSBub3RpZmllciBjaGVjaywgaGF2ZSBiZWVuIGNvbnNvbGlkYXRlZCBpbnRvIGBwdGVfaXNfcmVmZXJlbmNlZCgpYCwgYnV0IHRoZSBiZWhhdmlvciBpcywgZnJvbSB3aGF0IEkgY2FuIHRlbGwsIGV4YWN0bHkgdGhlIHNhbWUuCgpUaGUgbG9naWMgaW4gYGNvbGxhcHNlX3NjYW5fcG1kKClgIHRoYXQgZGV0ZXJtaW5lcyBpZiBhIGNvbGxhcHNlIHNob3VsZCBiZSBza2lwcGVkIGR1ZSB0byBhIGxhY2sgb2YgcmVmZXJlbmNlZCBwYWdlcyBhbHNvIGFwcGVhcnMgdG8gYmUgaWRlbnRpY2FsLgoKVGhlIG1vc3QgaW50ZXJlc3RpbmcgYXJlYSB0byBsb29rIGF0IHdhcyByZWxhdGVkIHRvIHVubWFwcGVkIFBURXMuIEluIHRoZSBvbGRlciBjb2RlLCBhIHNpbXBsZSBpbnRlZ2VyIHZhcmlhYmxlIGB1bm1hcHBlZGAgd2FzIHVzZWQgdG8gdHJhY2sgdGhlIG51bWJlciBvZiB1bm1hcHBlZCBQVEVzLiBUaGUgbmV3IGNvZGUsIGhvd2V2ZXIsIGxldmVyYWdlcyBhIGNvbnRleHQgc3RydWN0dXJlIGBjdHhgLCBhbmQgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIG9sZCBgdW5tYXBwZWRgIHZhcmlhYmxlIGlzIG5vdyBgY3R4LnVubWFwcGVkYC4gSSBoYWQgdG8gY29uZmlybSB0aGF0IGBjdHgudW5tYXBwZWRgIHdhcyBpbml0aWFsaXplZCB0byB0aGUgY29ycmVjdCB2YWx1ZSwgYW5kIGFsc28gdGhlIGNvcnJlY3QgYmVoYXZpb3Igb2YgdGhlIGxvZ2ljIHRoYXQgdXNlcyB0aGUgYHVubWFwcGVkYCB2YWx1ZXMgYW5kIGNvdW50cywgYmFzZWQgb24gdGhlIGBtYXhfcHRlc19zd2FwYCBwYXJhbWV0ZXIuIEJhc2VkIG9uIEMmIzM5O3Mgc3RydWN0dXJlIGluaXRpYWxpemF0aW9uIHJ1bGVzLCBhcyBpdCBpcyAqbm90KiBleHBsaWNpdGx5IGluaXRpYWxpemVkIGluIHRoZSBzdHJ1Y3QsIGl0IHdvdWxkIGRlZmF1bHQgdG8gemVyby4gVGhlIGluY3JlbWVudCBsb2dpYyBpcyBjb25zaXN0ZW50IGFzIHdlbGwuIFNvIGl0IGJlaGF2ZXMgaWRlbnRpY2FsbHkuCgpUaGUgY2hlY2tzIGZvciBgY3R4Lm5vbmVfb3JfemVyb2AsIGBjdHguc2hhcmVkYCwgYW5kIHRoZSBhc3NpZ25tZW50IG9mIGBjdHguZm9saW9gIGFuZCBgY3R4LnJlc3VsdGAgd2VyZSB0aGVuIGNvbmZpcm1lZCB0byBiZSBoYW5kbGVkIGNvcnJlY3RseSwgY29uZmlybWluZyB0aGF0IHRoZSBjb250ZXh0IHN0cnVjdCBiZWhhdmVkIGxpa2UgdGhlIG9sZCB2YXJpYWJsZXMuCgpMYXN0bHksIHRoZSBgY291bnRfY29sbGFwc2VfZXZlbnQoKWAgZnVuY3Rpb24gd2FzIGNvbXBhcmVkLCB0byBlbnN1cmUgbm8gbG9naWMgY2hhbmdlIHdhcyBtYWRlIHRvIHRoZSBzdGF0cy4gVGhlIGxvZ2ljIGlzIGlkZW50aWNhbC4gVGhpcyBhcHBlYXJzIHRvIGJlIGNvcnJlY3QsIGFuZCB0aGF0IGBjb3VudF92bV9ldmVudCgpYCBpcyBjYWxsZWQgd2l0aCBgVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFYCBpcyBjb3JyZWN0LgoKQWZ0ZXIgcmV2aWV3aW5nIHRoZXNlIGFyZWFzLCB0aGUgY29uY2x1c2lvbiBpcyB0aGF0IHRoZXJlIGFyZSAqbm8gZnVuY3Rpb25hbCBjaGFuZ2VzKi4gVGhlIGNvZGUgdXNlcyBhIGNvbnRleHQgc3RydWN0IGFuZCBpbmxpbmVzIHNvbWUgZnVuY3Rpb25zLCBidXQgdGhlIGJlaGF2aW9yIGlzIHRoZSBzYW1lLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt2bV9ub3JtYWxfZm9saW8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvcHJvYy90YXNrX21tdS5jPTE2OTA9c3RhdGljIGlubGluZSBib29sIHB0ZV9pc19waW5uZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgcHRlKVxuLS1cbmZzL3Byb2MvdGFza19tbXUuYy0xNjk5LVx0XHRyZXR1cm4gZmFsc2U7XG5mcy9wcm9jL3Rhc2tfbW11LmM6MTcwMDpcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlKTtcbmZzL3Byb2MvdGFza19tbXUuYy0xNzAxLVx0aWYgKCFmb2xpbylcbi0tXG5mcy9wcm9jL3Rhc2tfbW11LmM9MTc3MD1zdGF0aWMgaW50IGNsZWFyX3JlZnNfcHRlX3JhbmdlKHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5mcy9wcm9jL3Rhc2tfbW11LmMtMTgxNS1cbmZzL3Byb2MvdGFza19tbXUuYzoxODE2Olx0XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIGFkZHIsIHB0ZW50KTtcbmZzL3Byb2MvdGFza19tbXUuYy0xODE3LVx0XHRpZiAoIWZvbGlvKVxuLS1cbmluY2x1ZGUvbGludXgvbW0uaD0zMTQzPWV4dGVybiB2b2lkIHVzZXJfc2htX3VubG9jayhzaXplX3QsIHN0cnVjdCB1Y291bnRzICopO1xuaW5jbHVkZS9saW51eC9tbS5oLTMxNDQtXG5pbmNsdWRlL2xpbnV4L21tLmg6MzE0NTpzdHJ1Y3QgZm9saW8gKnZtX25vcm1hbF9mb2xpbyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuaW5jbHVkZS9saW51eC9tbS5oLTMxNDYtXHRcdFx0ICAgICBwdGVfdCBwdGUpO1xuaW5jbHVkZS9saW51eC9tbS5oPTMxNDc9c3RydWN0IHBhZ2UgKnZtX25vcm1hbF9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG5pbmNsdWRlL2xpbnV4L21tLmgtMzE0OC1cdFx0XHQgICAgIHB0ZV90IHB0ZSk7XG5pbmNsdWRlL2xpbnV4L21tLmg6MzE0OTpzdHJ1Y3QgZm9saW8gKnZtX25vcm1hbF9mb2xpb19wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5pbmNsdWRlL2xpbnV4L21tLmgtMzE1MC1cdFx0XHRcdCAgdW5zaWduZWQgbG9uZyBhZGRyLCBwbWRfdCBwbWQpO1xuLS1cbm1tL2RhbW9uL3ZhZGRyLmM9Mzg5PXN0YXRpYyBpbnQgZGFtb25feW91bmdfcG1kX2VudHJ5KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9kYW1vbi92YWRkci5jLTQwNC1cdFx0XHRnb3RvIGh1Z2Vfb3V0O1xubW0vZGFtb24vdmFkZHIuYzo0MDU6XHRcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvX3BtZCh3YWxrLVx1MDAzZXZtYSwgYWRkciwgcG1kZSk7XG5tbS9kYW1vbi92YWRkci5jLTQwNi1cdFx0aWYgKCFmb2xpbylcbi0tXG5tbS9kYW1vbi92YWRkci5jLTQyMy1cdFx0Z290byBvdXQ7XG5tbS9kYW1vbi92YWRkci5jOjQyNDpcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHdhbGstXHUwMDNldm1hLCBhZGRyLCBwdGVudCk7XG5tbS9kYW1vbi92YWRkci5jLTQyNS1cdGlmICghZm9saW8pXG4tLVxubW0vZGFtb24vdmFkZHIuYz02MzU9c3RhdGljIGludCBkYW1vc192YV9taWdyYXRlX3BtZF9lbnRyeShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vZGFtb24vdmFkZHIuYy02NTMtXHRcdFx0Z290byBodWdlX291dDtcbm1tL2RhbW9uL3ZhZGRyLmM6NjU0Olx0XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpb19wbWQod2Fsay1cdTAwM2V2bWEsIGFkZHIsIHBtZGUpO1xubW0vZGFtb24vdmFkZHIuYy02NTUtXHRcdGlmICghZm9saW8pXG4tLVxubW0vZGFtb24vdmFkZHIuYy02NzYtXHRcdFx0Y29udGludWU7XG5tbS9kYW1vbi92YWRkci5jOjY3NzpcdFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8od2Fsay1cdTAwM2V2bWEsIGFkZHIsIHB0ZW50KTtcbm1tL2RhbW9uL3ZhZGRyLmMtNjc4LVx0XHRpZiAoIWZvbGlvKVxuLS1cbm1tL2RhbW9uL3ZhZGRyLmM9Nzk1PXN0YXRpYyBpbnQgZGFtb3NfdmFfc3RhdF9wbWRfZW50cnkocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbm1tL2RhbW9uL3ZhZGRyLmMtODE0LVxubW0vZGFtb24vdmFkZHIuYzo4MTU6XHRcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvX3BtZCh2bWEsIGFkZHIsIHBtZGUpO1xubW0vZGFtb24vdmFkZHIuYy04MTYtXG4tLVxubW0vZGFtb24vdmFkZHIuYy04MzktXG5tbS9kYW1vbi92YWRkci5jOjg0MDpcdFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGVudCk7XG5tbS9kYW1vbi92YWRkci5jLTg0MS1cbi0tXG5tbS9odWdlX21lbW9yeS5jPTIyNzg9dm1fZmF1bHRfdCBkb19odWdlX3BtZF9udW1hX3BhZ2Uoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0yMzA3LVxubW0vaHVnZV9tZW1vcnkuYzoyMzA4Olx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW9fcG1kKHZtYSwgaGFkZHIsIHBtZCk7XG5tbS9odWdlX21lbW9yeS5jLTIzMDktXHRpZiAoIWZvbGlvKVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9MjQ2Mj1zdGF0aWMgc3RydWN0IGZvbGlvICpub3JtYWxfb3Jfc29mdGxlYWZfZm9saW9fcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMjQ2NS1cdGlmIChpc19wcmVzZW50KVxubW0vaHVnZV9tZW1vcnkuYzoyNDY2Olx0XHRyZXR1cm4gdm1fbm9ybWFsX2ZvbGlvX3BtZCh2bWEsIGFkZHIsIHBtZHZhbCk7XG5tbS9odWdlX21lbW9yeS5jLTI0NjctXG4tLVxubW0va2h1Z2VwYWdlZC5jPTc0Nz1zdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGVfdCBwdGV2YWwsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTc3OC1cbm1tL2todWdlcGFnZWQuYzo3Nzk6XHRjdHgtXHUwMDNlZm9saW8gPSB2bV9ub3JtYWxfZm9saW8oY3R4LVx1MDAzZXZtYSwgYWRkciwgcHRldmFsKTtcbm1tL2todWdlcGFnZWQuYy03ODAtXHRpZiAodW5saWtlbHkoIWN0eC1cdTAwM2Vmb2xpbykgfHwgdW5saWtlbHkoZm9saW9faXNfem9uZV9kZXZpY2UoY3R4LVx1MDAzZWZvbGlvKSkpXG4tLVxubW0va3NtLmM9NjE2PXN0YXRpYyBpbnQgYnJlYWtfa3NtX3BtZF9lbnRyeShwbWRfdCAqcG1kcCwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCxcbi0tXG5tbS9rc20uYy02MzgtXHRcdGlmIChwdGVfcHJlc2VudChwdGUpKSB7XG5tbS9rc20uYzo2Mzk6XHRcdFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8od2Fsay1cdTAwM2V2bWEsIGFkZHIsIHB0ZSk7XG5tbS9rc20uYy02NDAtXHRcdH0gZWxzZSBpZiAoIXB0ZV9ub25lKHB0ZSkpIHtcbi0tXG5tbS9tYWR2aXNlLmM9MzUzPXN0YXRpYyBpbnQgbWFkdmlzZV9jb2xkX29yX3BhZ2VvdXRfcHRlX3JhbmdlKHBtZF90ICpwbWQsXG4tLVxubW0vbWFkdmlzZS5jLTQ3NS1cbm1tL21hZHZpc2UuYzo0NzY6XHRcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xubW0vbWFkdmlzZS5jLTQ3Ny1cdFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXG4tLVxubW0vbWFkdmlzZS5jPTY1Mj1zdGF0aWMgaW50IG1hZHZpc2VfZnJlZV9wdGVfcmFuZ2UocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbm1tL21hZHZpc2UuYy03MDQtXG5tbS9tYWR2aXNlLmM6NzA1Olx0XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIGFkZHIsIHB0ZW50KTtcbm1tL21hZHZpc2UuYy03MDYtXHRcdGlmICghZm9saW8gfHwgZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pKVxuLS1cbm1tL21lbW9yeS5jPTgxOT1zdHJ1Y3QgcGFnZSAqdm1fbm9ybWFsX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9tZW1vcnkuYy04MjgtLyoqXG5tbS9tZW1vcnkuYzo4Mjk6ICogdm1fbm9ybWFsX2ZvbGlvKCkgLSBHZXQgdGhlIFwmIzM0O3N0cnVjdCBmb2xpb1wmIzM0OyBhc3NvY2lhdGVkIHdpdGggYSBQVEVcbm1tL21lbW9yeS5jLTgzMC0gKiBAdm1hOiBUaGUgVk1BIG1hcHBpbmcgdGhlIEBwdGUuXG4tLVxubW0vbWVtb3J5LmMtODM5LSAqL1xubW0vbWVtb3J5LmM6ODQwOnN0cnVjdCBmb2xpbyAqdm1fbm9ybWFsX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG5tbS9tZW1vcnkuYy04NDEtXHRcdFx0ICAgIHB0ZV90IHB0ZSlcbi0tXG5tbS9tZW1vcnkuYz04NjM9c3RydWN0IHBhZ2UgKnZtX25vcm1hbF9wYWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbm1tL21lbW9yeS5jLTg3Mi0vKipcbm1tL21lbW9yeS5jOjg3MzogKiB2bV9ub3JtYWxfZm9saW9fcG1kKCkgLSBHZXQgdGhlIFwmIzM0O3N0cnVjdCBmb2xpb1wmIzM0OyBhc3NvY2lhdGVkIHdpdGggYSBQTURcbm1tL21lbW9yeS5jLTg3NC0gKiBAdm1hOiBUaGUgVk1BIG1hcHBpbmcgdGhlIEBwbWQuXG4tLVxubW0vbWVtb3J5LmMtODgzLSAqL1xubW0vbWVtb3J5LmM6ODg0OnN0cnVjdCBmb2xpbyAqdm1fbm9ybWFsX2ZvbGlvX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbm1tL21lbW9yeS5jLTg4NS1cdFx0XHRcdCAgdW5zaWduZWQgbG9uZyBhZGRyLCBwbWRfdCBwbWQpXG4tLVxubW0vbWVtb3J5LmM9NjI4ND1zdGF0aWMgdm1fZmF1bHRfdCBkb19udW1hX3BhZ2Uoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXG4tLVxubW0vbWVtb3J5LmMtNjMxOS1cbm1tL21lbW9yeS5jOjYzMjA6XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIHZtZi1cdTAwM2VhZGRyZXNzLCBwdGUpO1xubW0vbWVtb3J5LmMtNjMyMS1cdGlmICghZm9saW8gfHwgZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pKVxuLS1cbm1tL21lbXBvbGljeS5jPTY4Nz1zdGF0aWMgaW50IHF1ZXVlX2ZvbGlvc19wdGVfcmFuZ2UocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbm1tL21lbXBvbGljeS5jLTcyMy1cdFx0fVxubW0vbWVtcG9saWN5LmM6NzI0Olx0XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIGFkZHIsIHB0ZW50KTtcbm1tL21lbXBvbGljeS5jLTcyNS1cdFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXG4tLVxubW0vbWVtcG9saWN5LmMtNzI5LVx0XHQvKlxubW0vbWVtcG9saWN5LmM6NzMwOlx0XHQgKiB2bV9ub3JtYWxfZm9saW8oKSBmaWx0ZXJzIG91dCB6ZXJvIHBhZ2VzLCBidXQgdGhlcmUgbWlnaHRcbm1tL21lbXBvbGljeS5jLTczMS1cdFx0ICogc3RpbGwgYmUgcmVzZXJ2ZWQgZm9saW9zIHRvIHNraXAsIHBlcmhhcHMgaW4gYSBWRFNPLlxuLS1cbm1tL21sb2NrLmM9MzUwPXN0YXRpYyBpbnQgbWxvY2tfcHRlX3JhbmdlKHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9tbG9jay5jLTM4Ny1cdFx0XHRjb250aW51ZTtcbm1tL21sb2NrLmM6Mzg4Olx0XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIGFkZHIsIHB0ZW50KTtcbm1tL21sb2NrLmMtMzg5LVx0XHRpZiAoIWZvbGlvIHx8IGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcbi0tXG5tbS9tcmVtYXAuYz0xNzg9c3RhdGljIGludCBtcmVtYXBfZm9saW9fcHRlX2JhdGNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vbXJlbWFwLmMtMTg5LVxubW0vbXJlbWFwLmM6MTkwOlx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGUpO1xubW0vbXJlbWFwLmMtMTkxLVx0aWYgKCFmb2xpbyB8fCAhZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXG4tLVxubW0vdXNlcmZhdWx0ZmQuYz0xMjgwPXN0YXRpYyBzdHJ1Y3QgZm9saW8gKmNoZWNrX3B0ZXNfZm9yX2JhdGNoZWRfbW92ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnNyY192bWEsXG4tLVxubW0vdXNlcmZhdWx0ZmQuYy0xMjk0LVxubW0vdXNlcmZhdWx0ZmQuYzoxMjk1Olx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8oc3JjX3ZtYSwgc3JjX2FkZHIsIG9yaWdfc3JjX3B0ZSk7XG5tbS91c2VyZmF1bHRmZC5jLTEyOTYtXHRpZiAoIWZvbGlvIHx8ICFmb2xpb190cnlsb2NrKGZvbGlvKSlcbi0tXG5tbS91c2VyZmF1bHRmZC5jPTE1MDM9c3RhdGljIGxvbmcgbW92ZV9wYWdlc19wdGVzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqZHN0X3BtZCwgcG1kX3QgKnNyY19wbWQsXG4tLVxubW0vdXNlcmZhdWx0ZmQuYy0xNjE5LVxubW0vdXNlcmZhdWx0ZmQuYzoxNjIwOlx0XHRcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHNyY192bWEsIHNyY19hZGRyLCBvcmlnX3NyY19wdGUpO1xubW0vdXNlcmZhdWx0ZmQuYy0xNjIxLVx0XHRcdGlmICghZm9saW8gfHwgIVBhZ2VBbm9uRXhjbHVzaXZlKFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UpKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjQwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMwODkyCgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogNDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGZyb20gbXkgcGVyc3BlY3RpdmUgYXMgc29tZW9uZSB3ZWxsLXZlcnNlZCBpbiBtZW1vcnkgbWFuYWdlbWVudDoKCioqRGlnZ2luZyBpbnRvIGB2bV9ub3JtYWxfZm9saW8oKWAqKgoKUmlnaHQsIHNvIGB2bV9ub3JtYWxfZm9saW8oKWAgaXMgZXNzZW50aWFsbHkgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiwgYSB3cmFwcGVyLCBpc24mIzM5O3QgaXQ/IEl0IGFwcGVhcnMgdG8gYmUgbm90aGluZyBtb3JlIHRoYW4gYSBzaW1wbGlmaWVkIHdheSB0byBvYnRhaW4gYSBmb2xpbyBiYXNlZCBvbiBhIG5vcm1hbCBwYWdlLCBzcGVjaWZpY2FsbHkgYnkgY2FsbGluZyBgcGFnZV9mb2xpbyh2bV9ub3JtYWxfcGFnZSgpKWAuIFRoYXQmIzM5O3MgdGhlIGNvcmUgb2YgaXRzIGZ1bmN0aW9uYWxpdHkuCgpUaGUgaW1wbGljYXRpb24gaXMgdGhhdCBpdCBoZWxwcyB0byByZWR1Y2UgcmVwZXRpdGlvbi4gSWYgYSBsb3Qgb2YgY29kZSBuZWVkcyB0byBvcGVyYXRlIG9uIHRoZSBmb2xpbyBvZiBhIG5vcm1hbCBwYWdlLCB0aGlzIGZ1bmN0aW9uIGp1c3QgcHJvdmlkZXMgYSBzaG9ydGhhbmQgbWV0aG9kLiBUaGUgZGV0YWlscyBhcmUgYWJzdHJhY3RlZCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgY2FsbGVyIGRvZXMgbm90IG5lZWQgdG8gcmVwZWF0ZWRseSBjYWxsIGBwYWdlX2ZvbGlvKHZtX25vcm1hbF9wYWdlKCkpYC4KCkxldCYjMzk7cyBkZWx2ZSBkZWVwZXIgYW5kIGNvbmZpcm0gdGhhdCBieSBleGFtaW5pbmcgdGhlIGltcGxlbWVudGF0aW9uIG9mIGB2bV9ub3JtYWxfZm9saW8oKWAgaXRzZWxmLiBXZSBjYW4gY29uZmlybSB3aGV0aGVyIGl0IGlzIGFjdHVhbGx5IGp1c3QgYSBzaW1wbGUgd3JhcHBlciBmdW5jdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnkuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDgzOSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgODM5Olx0ICovXG4gODQwOlx0c3RydWN0IGZvbGlvICp2bV9ub3JtYWxfZm9saW8oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbiA4NDE6XHRcdFx0XHQgICAgcHRlX3QgcHRlKVxuIDg0MjpcdHtcbiA4NDM6XHRcdHN0cnVjdCBwYWdlICpwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGUpO1xuIDg0NDpcdFxuIDg0NTpcdFx0aWYgKHBhZ2UpXG4gODQ2Olx0XHRcdHJldHVybiBwYWdlX2ZvbGlvKHBhZ2UpO1xuIDg0NzpcdFx0cmV0dXJuIE5VTEw7XG4gODQ4Olx0fVxuIDg0OTpcdFxuIDg1MDpcdCNpZmRlZiBDT05GSUdfUEdUQUJMRV9IQVNfSFVHRV9MRUFWRVNcbiA4NTE6XHQvKipcbiA4NTI6XHQgKiB2bV9ub3JtYWxfcGFnZV9wbWQoKSAtIEdldCB0aGUgXCYjMzQ7c3RydWN0IHBhZ2VcJiMzNDsgYXNzb2NpYXRlZCB3aXRoIGEgUE1EXG4gODUzOlx0ICogQHZtYTogVGhlIFZNQSBtYXBwaW5nIHRoZSBAcG1kLlxuIDg1NDpcdCAqIEBhZGRyOiBUaGUgYWRkcmVzcyB3aGVyZSB0aGUgQHBtZCBpcyBtYXBwZWQuXG4gODU1Olx0ICogQHBtZDogVGhlIFBNRC5cbiA4NTY6XHQgKlxuIDg1NzpcdCAqIEdldCB0aGUgXCYjMzQ7c3RydWN0IHBhZ2VcJiMzNDsgYXNzb2NpYXRlZCB3aXRoIGEgUFRFLiBTZWUgX192bV9ub3JtYWxfcGFnZSgpXG4gODU4Olx0ICogZm9yIGRldGFpbHMgb24gXCYjMzQ7bm9ybWFsXCYjMzQ7IGFuZCBcJiMzNDtzcGVjaWFsXCYjMzQ7IG1hcHBpbmdzLlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMTQ5OQoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDc4OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBQb3RlbnRpYWwgS2h1Z2VwYWdlZCBXYXJuaW5nIENvbmRpdGlvbioqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIGxvb2tpbmcgYXQgdGhpcyBjb2RlIGFuZCBpdCBsb29rcyBsaWtlIGEgc3VidGxlIGNoYW5nZSBoYXMgYmVlbiBpbnRyb2R1Y2VkOiB0aGF0IGluIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCwgdGhlcmUmIzM5O3MgYSBuZXcgYFZNX1dBUk5fT05fRk9MSU9gIGNhbGwuIFByZXZpb3VzbHksIGl0IHNpbXBseSByZXR1cm5lZCBgU0NBTl9QQUdFX0FOT05gLiBUaGUgcXVlc3Rpb24gaXMsIGNhbiB3ZSB0cmlnZ2VyIHRoaXMgd2FybmluZz8KCk15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IGl0JiMzOTtzIHJlbGF0ZWQgdG8ga2h1Z2VwYWdlZCBhdHRlbXB0aW5nIHRvIHNjYW4gYSBub24tYW5vbnltb3VzIHBhZ2Ugd2l0aGluIHdoYXQgaXQgKnRoaW5rcyogaXMgYW4gYW5vbnltb3VzIFZNQS4gVGhlIGNvZGUgcGF0aCBpbmNsdWRlcyBhIGNoZWNrIGAhZm9saW9fdGVzdF9hbm9uKGN0eC0mZ3Q7Zm9saW8pYC4gU28sIHRoZSBjcnV4IG9mIHRoZSBwcm9ibGVtIGxpZXMgaW4gdGhlIHBvc3NpYmlsaXR5IG9mIG1hcHBpbmcgYSBub24tYW5vbnltb3VzIHBhZ2UgKmludG8qIGFuIGFub255bW91cyBWTUEuCgpNeSBmaXJzdCBpbnR1aXRpb24gaXMgdGhhdCBgdm1faW5zZXJ0X3BhZ2UoKWAgaXMgdGhlIGtleS4gRHJpdmVycyBvZnRlbiB1c2UgdGhpcywgYnV0IHR5cGljYWxseSB3aXRoaW4gKnRoZWlyKiBzcGVjaWZpYyBWTUFzLCB3aGljaCBhcmVuJiMzOTt0IGFub255bW91cy4gQ291bGQgYSB1c2VyIHNvbWVob3cgbGV2ZXJhZ2UgYHZtX2luc2VydF9wYWdlKClgIG9uIGEgYE1BUF9BTk9OWU1PVVNgLWNyZWF0ZWQgVk1BPyBEcml2ZXJzIHR5cGljYWxseSBoYW5kbGUgYHZtX2luc2VydF9wYWdlKClgIGluIHRoZWlyIGBtbWFwYCBoYW5kbGVyLCB3aGVyZSB0aGUgVk1BJiMzOTtzIGFscmVhZHkgc2V0IHVwLiBTbywgdGhpcyB3b3VsZG4mIzM5O3Qgbm9ybWFsbHkgaGFwcGVuLgoKSSYjMzk7bSBydWxpbmcgb3V0IGEgZmV3IHBvdGVudGlhbCBhdmVudWVzOiBgT19ESVJFQ1RgIHJlYWRzIGludG8gYW5vbnltb3VzIG1lbW9yeSwgYnV0IHRoZSBwYWdlcyB0aGVtc2VsdmVzIGFyZSBzdGlsbCBhbm9ueW1vdXMuIGB2bXNwbGljZWAgbWFwcyB1c2VyIG1lbW9yeSB0byBhIHBpcGUgYnV0IGRvZXNuJiMzOTt0IGNoYW5nZSBhbm9ueW1pdHkuIGBtcmVtYXBgIGNhbiBtb3ZlIGEgVk1BLCBidXQgaXQgZG9lc24mIzM5O3QgdG91Y2ggdGhlIGFub24gc3RhdHVzLiBgdXNlcmZhdWx0ZmRgJiMzOTtzIGBVRkZESU9fQ09QWWAgdXNlcyBhbm9uIHBhZ2VzLCBhbmQgYFVGRkRJT19DT05USU5VRWAgaXMgZm9yIHNobWVtL2h1Z2V0bGIuIEtTTSBwYWdlcyBhcmUgYWx3YXlzIGFub255bW91cywgYXMgYXJlIHplcm8gcGFnZXMuCgpUaGVuIEkgcGF1c2VkIHRvIHRoaW5rIGFib3V0IGByZW1hcF9wZm5fcmFuZ2VgIOKAkyBJJiMzOTttIHByZXR0eSBzdXJlIGl0IG1hcHMgaW50byBQRk5NQVAgcmVnaW9ucywgYW5kIHRodXMgYHZtX25vcm1hbF9mb2xpbygpYCB3aWxsIHJldHVybiBOVUxMLiBBbHNvIGB2bV9pbnNlcnRfcGFnZWAgY291bGQgc2V0IG1peGVkIG1hcCwgYnV0IHRoZSBwYWdlIGl0c2VsZiBpcyBzdGlsbCB0aGUgY29ycmVjdCBvbmUuCgpTbyB0aGUgY2hhbGxlbmdlIGlzIHRvIGZpbmQgYSB3YXkgdG8gZ2V0IGEgZHJpdmVyIHRvIGNhbGwgYHZtX2luc2VydF9wYWdlKClgIG9uIGEgVk1BIGNyZWF0ZWQgdmlhIGBtbWFwKE1BUF9BTk9OWU1PVVMpYC4gV2hhdCBjYW4gdHJpZ2dlciB0aGlzPyBgdXByb2JlYCBpbnNlcnRzIGEgYnJlYWtwb2ludCBwYWdlLCBpcyB0aGF0IGFub24/IEFuZCB0aGVuIHRoZXJlJiMzOTtzIGB4b2xfYWRkX3ZtYSgpYCBjcmVhdGVzIGEgc3BlY2lhbCBWTUEuIFB0cmFjZSB1c2VzIGBnZXRfdXNlcl9wYWdlcygpYC4gYG1hZHZpc2UoTUFEVl9GUkVFKWAga2VlcHMgaXQgYW5vbiwgYE1BRFZfSFdQT0lTT05gIHBvaXNvbnMuIEkgY29uc2lkZXIgT19ESVJFQ1Qgd2l0aCBHVVAuIFRoZW4gdGhlIHRob3VnaHQgdG8gY29uc2lkZXIgaWYga2h1Z2VwYWdlZCBzY2FucyBhIGZpbGUgVk1BLgoKV2FpdCwgdGhlIGtleSBpcyB0aGUgc2NhbiBwYXRoISBJIHJlYWxpemVkIGBraHVnZXBhZ2VkYCBzY2FucyBmaWxlIFZNQXMgdmlhIGBjb2xsYXBzZV9zY2FuX2ZpbGUoKWAsIG5vdCBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAuIFNvIHRoZSBwcm9ibGVtIEkgd2FzIHRoaW5raW5nIGFib3V0IG1pZ2h0IG5vdCBiZSBwb3NzaWJsZS4gSG93ZXZlciwgaXMgdGhhdCBzdGF0ZW1lbnQgY29ycmVjdD8gVGltZSB0byBnbyBiYWNrIHRvIHRoZSBjb2RlIGFuZCBjaGVjayBga2h1Z2VwYWdlZF9zY2FuX3BtZCgpYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a2h1Z2VwYWdlZF9zY2FuX3BtZCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oPTQ5PVNDQU5fU1RBVFVTXG4tLVxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC01NS1cbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5Lmg6NTY6VFJBQ0VfRVZFTlQobW1fa2h1Z2VwYWdlZF9zY2FuX3BtZCxcbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgtNTctXG4tLVxua2VybmVsL2JwZi9idGYuYz02NjU2PXN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX3Jhd190cF9udWxsX2FyZ3MgcmF3X3RwX251bGxfYXJnc1tdID0ge1xuLS1cbmtlcm5lbC9icGYvYnRmLmMtNjcwNS1cdC8qIGh1Z2VfbWVtb3J5ICovXG5rZXJuZWwvYnBmL2J0Zi5jOjY3MDY6XHR7IFwmIzM0O21tX2todWdlcGFnZWRfc2Nhbl9wbWRcJiMzNDssIDB4MTAgfSxcbmtlcm5lbC9icGYvYnRmLmMtNjcwNy1cdHsgXCYjMzQ7bW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVcJiMzNDssIDB4MSB9LFxuLS1cbm1tL2todWdlcGFnZWQuYz0xNjg5PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLS1cbm1tL2todWdlcGFnZWQuYy0xODEzLW91dDpcbm1tL2todWdlcGFnZWQuYzoxODE0Olx0dHJhY2VfbW1fa2h1Z2VwYWdlZF9zY2FuX3BtZChtbSwgZm9saW8sIHJlZmVyZW5jZWQsXG5tbS9raHVnZXBhZ2VkLmMtMTgxNS1cdFx0XHRcdCAgICAgY3R4Lm5vbmVfb3JfemVybywgcmVzdWx0LCBjdHgudW5tYXBwZWQpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMzMzNQoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDQ2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3Mgc2VlLi4uCgoqKklkZW50aWZ5aW5nIGEgQ29kZSBDaGFuZ2UqKgoKV2FpdCBhIG1pbnV0ZSwgKmtodWdlcGFnZWRfc2Nhbl9wbWQoKSogaGFzIGJlZW4gcmVuYW1lZCB0byAqY29sbGFwc2Vfc2Nhbl9wbWQoKSo/IFRoYXQmIzM5O3MgYSBzaWduaWZpY2FudCBjaGFuZ2UsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoYXQuIExldCYjMzk7cyB0cmFjZSB0aGlzIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGNvZGUgZm9yIGEgYml0LiBOZWVkIHRvIGNoZWNrIHdoYXQgKmtodWdlcGFnZWRfc2Nhbl9wbWQqIHVzZWQgdG8gZG8uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjQxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2todWdlcGFnZWRfc2Nhbl9wbWQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaD00OT1TQ0FOX1NUQVRVU1xuLS1cbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgtNTUtXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oOjU2OlRSQUNFX0VWRU5UKG1tX2todWdlcGFnZWRfc2Nhbl9wbWQsXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTU3LVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9NjY1Nj1zdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9yYXdfdHBfbnVsbF9hcmdzIHJhd190cF9udWxsX2FyZ3NbXSA9IHtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTY3MDUtXHQvKiBodWdlX21lbW9yeSAqL1xua2VybmVsL2JwZi9idGYuYzo2NzA2Olx0eyBcJiMzNDttbV9raHVnZXBhZ2VkX3NjYW5fcG1kXCYjMzQ7LCAweDEwIH0sXG5rZXJuZWwvYnBmL2J0Zi5jLTY3MDctXHR7IFwmIzM0O21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlXCYjMzQ7LCAweDEgfSxcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MTY4OT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTgxMy1vdXQ6XG5tbS9raHVnZXBhZ2VkLmM6MTgxNDpcdHRyYWNlX21tX2todWdlcGFnZWRfc2Nhbl9wbWQobW0sIGZvbGlvLCByZWZlcmVuY2VkLFxubW0va2h1Z2VwYWdlZC5jLTE4MTUtXHRcdFx0XHQgICAgIGN0eC5ub25lX29yX3plcm8sIHJlc3VsdCwgY3R4LnVubWFwcGVkKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzM4NTAKCQkJCQkJCW91dHB1dDogMjAKCQkJCQkJCXRob3VnaHRzOiAyMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRob3NlIHRob3VnaHRzIGZyb20gYSBmaXJzdC1wZXJzb24sIGV4cGVydCBwZXJzcGVjdGl2ZSwgYWltaW5nIGZvciBhIGZ1bHNvbWUgcmVuZGVyaW5nOgoKKipJbnZlc3RpZ2F0aW5nIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCoqCgpSaWdodCwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBoYXBwZW5pbmcgd2l0aCB0aGlzIHBhcnRpY3VsYXIgZnVuY3Rpb24sIGBjb2xsYXBzZV9zY2FuX3BtZCgpYC4gVGhhdCYjMzk7cyB0aGUga2V5LiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgd2hlcmUgaXMgdGhpcyBmdW5jdGlvbiBhY3R1YWxseSAqdXNlZCo/IFRoYXQmIzM5O3MgdGhlIG1vc3QgY3J1Y2lhbCBwaWVjZSBvZiBpbmZvcm1hdGlvbiB0byB1bmRlcnN0YW5kIGl0cyByb2xlIHdpdGhpbiB0aGUgYnJvYWRlciBzeXN0ZW0uIEkgbmVlZCB0byB0cmFjZSBpdHMgY2FsbCBzaXRlcywgc2VlIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0JiMzOTtzIGJlaW5nIGludm9rZWQuIEtub3dpbmcgdGhlIGNhbGxpbmcgZnVuY3Rpb25zIGFuZCB0aGVpciBhc3NvY2lhdGVkIGRhdGEgc3RydWN0dXJlcyB3aWxsIGdpdmUgbWUgdGhlIGNydWNpYWwgY29udGV4dCBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBpcyBzdXBwb3NlZCB0byBhY2hpZXZlLiBJdOKAmXMgdGhlIHVzdWFsIGRlYnVnZ2luZyBwcm9jZXNzOiB1bmRlcnN0YW5kIHRoZSB3aGVyZSBiZWZvcmUgdGhlIHdoeS4gSSBrbm93IHdoZXJlIHRvIHN0YXJ0IHRob3VnaC4gVGltZSB0byBodW50IGRvd24gdGhvc2UgY2FsbHMhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjQxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbGxhcHNlX3NjYW5fcG1kJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2todWdlcGFnZWQuYz0xMjI0PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNoZWNrX3BtZF9zdGlsbF92YWxpZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTIzOC0gKiBCcmluZyBtaXNzaW5nIHBhZ2VzIGluIGZyb20gc3dhcCwgdG8gY29tcGxldGUgVEhQIGNvbGxhcHNlLlxubW0va2h1Z2VwYWdlZC5jOjEyMzk6ICogT25seSBkb25lIGlmIGNvbGxhcHNlX3NjYW5fcG1kKCkgYmVsaWV2ZXMgaXQgaXMgd29ydGh3aGlsZS5cbm1tL2todWdlcGFnZWQuYy0xMjQwLSAqXG4tLVxubW0va2h1Z2VwYWdlZC5jPTE1NjI9c3RhdGljIHVuc2lnbmVkIGludCBtYXhfb3JkZXJfZnJvbV9vZmZzZXQodW5zaWduZWQgaW50IG9mZnNldClcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMTU3MS0gKiBtdGhwX2NvbGxhcHNlKCkgY29uc3VtZXMgdGhlIGJpdG1hcCB0aGF0IGlzIGdlbmVyYXRlZCBkdXJpbmdcbm1tL2todWdlcGFnZWQuYzoxNTcyOiAqIGNvbGxhcHNlX3NjYW5fcG1kKCkgdG8gZGV0ZXJtaW5lIHdoYXQgcmVnaW9ucyBhbmQgbVRIUCBvcmRlcnMgZml0IGJlc3QuXG5tbS9raHVnZXBhZ2VkLmMtMTU3My0gKlxuLS1cbm1tL2todWdlcGFnZWQuYz0xNTg3PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IG10aHBfY29sbGFwc2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4tLVxubW0va2h1Z2VwYWdlZC5jLTE2ODgtXG5tbS9raHVnZXBhZ2VkLmM6MTY4OTpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbm1tL2todWdlcGFnZWQuYy0xNjkwLVx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLFxuLS1cbm1tL2todWdlcGFnZWQuYz0yODExPXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NpbmdsZV9wbWQodW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbm1tL2todWdlcGFnZWQuYy0yODIzLVx0aWYgKHZtYV9pc19hbm9ueW1vdXModm1hKSkge1xubW0va2h1Z2VwYWdlZC5jOjI4MjQ6XHRcdHJlc3VsdCA9IGNvbGxhcHNlX3NjYW5fcG1kKG1tLCB2bWEsIGFkZHIsIGxvY2tfZHJvcHBlZCwgY2MpO1xubW0va2h1Z2VwYWdlZC5jLTI4MjUtXHRcdGdvdG8gZW5kO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNDU1NgoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIGl0OgoKKipGb2N1c2luZyBvbiBgY29sbGFwc2Vfc2luZ2xlX3BtZCgpYCoqCgpSaWdodCwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgY29kZSwgYW5kIHRoZSBjb250ZXh0IGlzIHRoYXQgdGhlIGZ1bmN0aW9uIGluIHF1ZXN0aW9uIGhlcmUgaXMgYGNvbGxhcHNlX3NpbmdsZV9wbWQoKWAuIFRoYXQmIzM5O3MgdGhlIGtleS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGZ1bmN0aW9uIGlzIGRvaW5nIGFuZCB3aGVyZSBpdCYjMzk7cyBjYWxsZWQgZnJvbS4gVGhhdCYjMzk7cyBteSBzdGFydGluZyBwb2ludC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIHNpZ25pZmljYW5jZSBvZiB0aGlzIHNwZWNpZmljIGZ1bmN0aW9uLiBJcyBpdCBhIGNvcmUgY29tcG9uZW50PyBJcyBpdCB1c2VkIGZyZXF1ZW50bHk/IFdoYXQgYXJlIHRoZSBpbnB1dHM/IFdoYXQgYXJlIHRoZSBvdXRwdXRzPyBHb3R0YSBkcmlsbCBkb3duIGludG8gdGhlIGRldGFpbHMgb2YgKnRoaXMqIHBhcnRpY3VsYXIgZnVuY3Rpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjQxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbGxhcHNlX3NpbmdsZV9wbWQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0va2h1Z2VwYWdlZC5jPTI3MDE9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLS1cbm1tL2todWdlcGFnZWQuYy0yODEwLSAqL1xubW0va2h1Z2VwYWdlZC5jOjI4MTE6c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2luZ2xlX3BtZCh1bnNpZ25lZCBsb25nIGFkZHIsXG5tbS9raHVnZXBhZ2VkLmMtMjgxMi1cdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIGJvb2wgKmxvY2tfZHJvcHBlZCxcbi0tXG5tbS9raHVnZXBhZ2VkLmM9Mjg2OD1zdGF0aWMgdm9pZCBjb2xsYXBzZV9zY2FuX21tX3Nsb3QodW5zaWduZWQgaW50IHByb2dyZXNzX21heCxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMjkzOC1cbm1tL2todWdlcGFnZWQuYzoyOTM5Olx0XHRcdCpyZXN1bHQgPSBjb2xsYXBzZV9zaW5nbGVfcG1kKGtodWdlcGFnZWRfc2Nhbi5hZGRyZXNzLFxubW0va2h1Z2VwYWdlZC5jLTI5NDAtXHRcdFx0XHRcdFx0ICAgICAgdm1hLCBcdTAwMjZsb2NrX2Ryb3BwZWQsIGNjKTtcbi0tXG5tbS9raHVnZXBhZ2VkLmM9MzIwOT1pbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzI1Ny1cbm1tL2todWdlcGFnZWQuYzozMjU4Olx0XHRyZXN1bHQgPSBjb2xsYXBzZV9zaW5nbGVfcG1kKGFkZHIsIHZtYSwgXHUwMDI2bW1hcF91bmxvY2tlZCwgY2MpO1xubW0va2h1Z2VwYWdlZC5jLTMyNTktXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjQxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM1MDc5CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogNTMwNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipSZWZsZWN0aW5nIG9uIHRoZSBDaGFuZ2VzIHRvIEFub255bW91cyBWTUEgSGFuZGxpbmcqKgoKT2theSwgc28gSSYjMzk7bSBkaXZpbmcgaW50byB0aGlzIHBhdGNoIHRoYXQgc2VlbXMgdG8gYmUgYWJvdXQgcmVmYWN0b3Jpbmcgc29tZSBjb2RlIHJlbGF0ZWQgdG8gY29sbGFwc2luZyBodWdlIHBhZ2VzLCBzcGVjaWZpY2FsbHkgaW4gdGhlIGNvbnRleHQgb2YgYW5vbnltb3VzIFZNQXMuIEluaXRpYWxseSwgaXQgbG9va2VkIGxpa2UgYSBzaW1wbGUgY2xlYW4tdXAsIGJ1dCB0aGUgbW9yZSBJIGRpZywgdGhlIG1vcmUgSSByZWFsaXplIGl0IGhhcyBmdW5jdGlvbmFsIGltcGxpY2F0aW9ucy4KClRoZSBjb3JlIG9mIHRoZSBwYXRjaCByZXZvbHZlcyBhcm91bmQgdGhpcyBgY29sbGFwc2VfY2hlY2tfcHRlKClgIGZ1bmN0aW9uLiBJdCYjMzk7cyBlc3NlbnRpYWxseSBleHRyYWN0aW5nIHRoZSBsb2dpYyBmb3IgY2hlY2tpbmcgcGFnZSB0YWJsZSBlbnRyaWVzIHRoYXQgd2FzIHByZXZpb3VzbHkgZHVwbGljYXRlZCBpbiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgYW5kIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgLiBUaGUgcHJpbWFyeSBmb2N1cyBhcHBlYXJzIHRvIGJlIG9uIGNvbmZpcm1pbmcgaWYgcGFnZXMgd2l0aGluIHRoZSB2aXJ0dWFsIG1lbW9yeSBhcmVhIGFyZSBhY3R1YWxseSBhbm9ueW1vdXMsIHdoaWNoIGlzIGNyaXRpY2FsIGZvciBwcm9wZXIgY29sbGFwc2UgYmVoYXZpb3IuCgpJbml0aWFsbHksIEkgcG9uZGVyZWQ6IElzIGl0IGV2ZW4gKnBvc3NpYmxlKiB0byBoYXZlIGEgbm9uLWFub255bW91cyBwYWdlIHdpdGhpbiBhbiBhbm9ueW1vdXMgVk1BPyBJIHN0YXJ0ZWQgcnVubmluZyB0aHJvdWdoIHRoZSB3YXlzIGEgdXNlciBtaWdodCB0cnkgdG8gc25lYWsgYSBub24tYW5vbiBwYWdlIGluLiBgbW1hcChNQVBfQU5PTllNT1VTKWAgZm9sbG93ZWQgYnkgYHZtc3BsaWNlYCwgYG1yZW1hcGAsIGB1c2VyZmF1bHRmZGAsIGFsbCBraW5kcyBvZiBtYWR2aXNlIGNhbGxzLCBgaW9fdXJpbmdgLCBgYnBmYC4uLiBpdCBzZWVtZWQgdW5saWtlbHksIGJvcmRlcmluZyBvbiBpbXBvc3NpYmxlLCB3aXRob3V0IGEgcmF0aGVyIHNlcmlvdXMga2VybmVsIGJ1Zy4gSXQgc2VlbXMgdGhhdCBgL2Rldi96ZXJvYCBpcyBlcXVpdmFsZW50IHRvIHVzaW5nIGBNQVBfQU5PTllNT1VTYCwgc28gZXZlbiB0aGF0IGRvZXNuJiMzOTt0IGNoYW5nZSBhbnl0aGluZy4KCkhvd2V2ZXIsIHRoZSBjaGFuZ2UgZnJvbSBgVk1fQlVHX09OX0ZPTElPYCB0byBgVk1fV0FSTl9PTl9GT0xJT2Agd2hlbiBhIG5vbi1hbm9ueW1vdXMgZm9saW8gaXMgZW5jb3VudGVyZWQgaXMgdGhlIGtleSBoZXJlLiBJbiB0aGUgb2xkIGNvZGUsIHRoaXMgd291bGQgaGF2ZSB0cmlnZ2VyZWQgYSBrZXJuZWwgcGFuaWMuIFdpdGggdGhlIHBhdGNoLCB0aGUgc3lzdGVtIG5vdyAqd2FybnMqIGFuZCBjb250aW51ZXMuIFRoaXMgaXMgdGhlIGNyaXRpY2FsIGNoYW5nZS4gQW5kIHRoYXQgd2FybmluZyBhcHBsaWVzIHRvIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBhcyB3ZWxsLgoKVGhlIGludGVyZXN0aW5nIHF1ZXN0aW9uIGlzIHRoZW46ICpDYW4qIHRoaXMgd2FybmluZyBldmVyIGJlIHRyaWdnZXJlZD8gVGhlIGNvZGUgYXBwZWFycyB0byBiZSBkZXNpZ25lZCB0byBwcmV2ZW50IHRoaXMgc2l0dWF0aW9uLiBJdCYjMzk7cyBhIGRlZmVuc2l2ZSBjaGVjaywgYW4gZXh0cmEgbGF5ZXIgb2Ygc2FuaXR5LiBZZXQsIHRoZSBwYXRjaCBpcyBmcm9tIHN5ei1jbHVzdGVyLCB3aGljaCBtaWdodCBtZWFuIHRoYXQgdGhpcyBjb25kaXRpb24gaXMsIGluIGZhY3QsIHJlYWNoYWJsZSBpbiBzb21lIHdlaXJkIGNvcm5lciBjYXNlLgoKVGhlIHZ1bG5lcmFiaWxpdHkgY29tZXMgZnJvbSB0aGUgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9uLiAgVGhlIG1tYXBfbG9jayBpcyBkcm9wcGVkIGJldHdlZW4gdGhlIHNjYW4gYW5kIHRoZSBjb2xsYXBzZSBhdHRlbXB0LiBBbm90aGVyIHRocmVhZCBtaWdodCBjaGFuZ2UgdGhlIG1hcHBpbmdzLiBIb3dldmVyLCB0aGUgcmV2YWxpZGF0aW9uIHN0ZXAgaW4gYGNvbGxhcHNlX2h1Z2VfcGFnZSgpYCBzZWVtcyB0byBoYW5kbGUgdGhhdCBieSBjYWxsaW5nIGBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZSgpYC4KClNvLCBpdCBzZWVtcyB0aGF0IGlmIGEgdXNlciAqY291bGQqIHNvbWVob3cgbWFwIGEgbm9uLWFub255bW91cyBwYWdlIGludG8gYW4gYW5vbnltb3VzIFZNQSAocGVyaGFwcyB0aHJvdWdoIGEgY29tcGxleCByYWNlIGNvbmRpdGlvbiwgYSBkZXZpY2UgZHJpdmVyIHdpdGggYSBkb2RneSBpb2N0bCwgb3IgYSBzdWJ0bGUgaW50ZXJhY3Rpb24gd2l0aCBhIG5ldyBrZXJuZWwgZmVhdHVyZSksIHRoZSBvbGQgY29kZSB3b3VsZCBoYXZlIHBhbmlja2VkLiBUaGlzIHBhdGNoIHJlcGxhY2VzIHRoYXQgd2l0aCBhIHdhcm5pbmcgYW5kIGEgZ3JhY2VmdWwgZmFsbGJhY2suIFRoaXMgbm93IG9mZmVycyBzeXprYWxsZXIgYSB3YXkgdG8gdGVzdCBmb3IgdGhvc2UgY29uZGl0aW9ucyBhbmQgcG90ZW50aWFsbHkgZXhwb3NlIGEgc3VidGxlIGJ1ZywgZXZlbiBpZiBJJiMzOTttIG5vdCBlbnRpcmVseSBjb252aW5jZWQgc3VjaCBhIHNjZW5hcmlvIGlzIGVhc2lseSBhY2hpZXZhYmxlLiBJJiMzOTtsbCBuZWVkIHRvIGdvIHNlYXJjaCBmb3IgYFNDQU5fUEFHRV9BTk9OYCBpbiB0aGUga2VybmVsIHRvIHNlZSBpZiB0aGVyZSBpcyBoaXN0b3J5IG9uIHRoaXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O1NDQU5fUEFHRV9BTk9OJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgtMjYtXHRFTSggU0NBTl9QQUdFX0xPQ0ssXHRcdFwmIzM0O3BhZ2VfbG9ja2VkXCYjMzQ7KVx0XHRcdFxcXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oOjI3Olx0RU0oIFNDQU5fUEFHRV9BTk9OLFx0XHRcJiMzNDtwYWdlX25vdF9hbm9uXCYjMzQ7KVx0XHRcXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC0yOC1cdEVNKCBTQ0FOX1BBR0VfTEFaWUZSRUUsXHRcdFwmIzM0O3BhZ2VfbGF6eWZyZWVcJiMzNDspXHRcdFxcXG4tLVxubW0va2h1Z2VwYWdlZC5jPTMzPWVudW0gc2Nhbl9yZXN1bHQge1xuLS1cbm1tL2todWdlcGFnZWQuYy00OS1cdFNDQU5fUEFHRV9MT0NLLFxubW0va2h1Z2VwYWdlZC5jOjUwOlx0U0NBTl9QQUdFX0FOT04sXG5tbS9raHVnZXBhZ2VkLmMtNTEtXHRTQ0FOX1BBR0VfTEFaWUZSRUUsXG4tLVxubW0va2h1Z2VwYWdlZC5jPTc0Nz1zdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGVfdCBwdGV2YWwsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTc5Mi1cdFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGN0eC1cdTAwM2Vmb2xpbyksIGN0eC1cdTAwM2Vmb2xpbyk7XG5tbS9raHVnZXBhZ2VkLmM6NzkzOlx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfQU5PTik7XG5tbS9raHVnZXBhZ2VkLmMtNzk0LVx0fVxuLS1cbm1tL2todWdlcGFnZWQuYz0xMTUzPXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4tLVxubW0va2h1Z2VwYWdlZC5jLTExODYtXHRpZiAoZXhwZWN0X2Fub24gXHUwMDI2XHUwMDI2ICghKCp2bWFwKS1cdTAwM2Vhbm9uX3ZtYSB8fCAhdm1hX2lzX2Fub255bW91cygqdm1hcCkpKVxubW0va2h1Z2VwYWdlZC5jOjExODc6XHRcdHJldHVybiBTQ0FOX1BBR0VfQU5PTjtcbm1tL2todWdlcGFnZWQuYy0xMTg4LVx0cmV0dXJuIFNDQU5fU1VDQ0VFRDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDE1MDkKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiA1MjMyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKlJlZmFjdG9yaW5nIEFuYWx5c2lzIG9mIGtodWdlcGFnZWQuYyBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIHN0YXJpbmcgYXQgdGhpcyBwYXRjaCwgYW5kIG15IGluaXRpYWwgdGhvdWdodCB3YXMsICYjMzQ7SXMgdGhpcyBqdXN0IGEgcmVmYWN0b3JpbmcsIG9yIGFyZSB3ZSBsb29raW5nIGF0IGEgYnVnIHdhaXRpbmcgdG8gaGFwcGVuPyYjMzQ7IGBTQ0FOX1BBR0VfQU5PTmAgaXMgZmxhZ2dlZCBpbiBgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoKWAsIGJ1dCBgY29sbGFwc2VfY2hlY2tfcHRlKClgIGlzIHdoZXJlIGl0JiMzOTtzIHNwZWNpZmljYWxseSByZXR1cm5lZCBmb3IgYSBwYWdlLiBTbywgaWYgdGhhdCB3YXJuaW5nIHRyaWdnZXJzLCBpdCYjMzk7cyBhIGJ1ZywgcmlnaHQ/CgpBZnRlciBkaWdnaW5nIGluLCBpdCAqc2VlbXMqIGxpa2UgYSBwdXJlIHJlZmFjdG9yaW5nIHRoYXQgY29uc29saWRhdGVzIFBURSBjaGVja2luZyBsb2dpYyB1c2luZyBhIGhlbHBlciBmdW5jdGlvbiwgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCwgYmV0d2VlbiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgYW5kIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgLiBUaGUgdXBzaG90IGlzIHRoZSBtZXJnaW5nIG9mIGEgYFZNX0JVR19PTl9GT0xJT2Agd2l0aCBhIHNpbGVudCByZXR1cm4gaW50byBhIHNpbmdsZSBgVk1fV0FSTl9PTl9GT0xJT2AgJiM0MzsgcmV0dXJuLCB3aGljaCwgb24gdGhlIGZhY2Ugb2YgaXQsIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UsIGJ1dCBhcyBhIHNpZGUgZWZmZWN0LgoKTXkgZXhwZXJ0IGd1dCB0ZWxscyBtZSB0aGlzIGNvdWxkIGJlIGEgbWluZWZpZWxkIGZvciBidWdzLCBldmVuIGlmIHNlZW1pbmdseSBtaW5vci4gUmVmYWN0b3JpbmcgY29yZSBNTSBjb2RlIGxpa2UgdGhpcz8gUmlza3kgYnVzaW5lc3MuIEl04oCZcyB3b3J0aCBjaGVja2luZyBpZiB0aGUgbG9naWMgd2FzIHBlcmZlY3RseSBwcmVzZXJ2ZWQgYWNyb3NzIHRoZSBjaGFuZ2UuIEZvciBpbnN0YW5jZSwgdGhlIGluaXRpYWxpemF0aW9uIG9mIGBjdHgudW5tYXBwZWRgIGJlaW5nIGAwYCBpbiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgYW5kIGAtMWAgaW4gYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAgaGFkIG1lIG9uIGFsZXJ0LgoKVGhhbmtmdWxseSwgYWZ0ZXIgYSBsaW5lLWJ5LWxpbmUgY29tcGFyaXNvbiwgYW5kIGEgZGVlcCBicmVhdGgsIGl0IGFwcGVhcnMgdGhlIGF1dGhvciB3YXMgbWV0aWN1bG91c2x5IGNhcmVmdWwuIFRoZSBvbGQgbG9naWMgZm9yIFBURSBwcmVzZW5jZSwgVUZGRCBjaGVja3MsIHNoYXJlZCBwYWdlIGNoZWNrcyAoYGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWRgKSwgYW5kIGV2ZW4gdGhlIGxhenlmcmVlIGNoZWNrcyAoYGZvbGlvX3Rlc3RfbGF6eWZyZWVgKSBhcmUgcHJlc2VydmVkISBUaGUgb3JpZ2luYWwgY29kZSB1c2VkIHRvIGxvb2sgbGlrZSB0aGlzOgoKYGBgYwoJaWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7CgkgICAgLi4uCgl9CgpgYGAKCldoZXJlIHRoZSBjb2RlIG5vdyBsb29rcyBsaWtlIHRoaXM6CgpgYGBjCiAgICBpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpCiAgICB7CgkgICAgaWYgKGN0eC0mZ3Q7dW5tYXBwZWQgPT0gLTEpCgkJICAgIHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX05PTl9QUkVTRU5UKTsKICAgIH0KYGBgCgpUaGUgZGlmZmVyZW5jZSBiZWluZyB0aGUgdW5tYXBwZWQgY29udGV4dCB3aGljaCwgYWZ0ZXIgaW5zcGVjdGlvbiwgaXMgaGFuZGxlZCBjb3JyZWN0bHkuIEFuZCB0aGUgcmVtYWluaW5nIGNoZWNrcy4KCkhvd2V2ZXIsIHRoZSBjaGFuZ2UgaW50cm9kdWNlcyB0aGUgdXNlIG9mIGEgYGN0eGAgaW4gdGhlIG5ldyBoZWxwZXIgZnVuY3Rpb24uIFRoaXMgaXMgYWxsIHZlcnkgZ29vZCwgYnV0IHdoYXQgYWJvdXQgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBmb2xpbyBjaGVja3MgYXJlIGRvbmU/IEFmdGVyIGNhcmVmdWwgY29uc2lkZXJhdGlvbiwgaXQgdHVybnMgb3V0IHRoYXQgdGhlIGBmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbylgIGNoZWNrICppcyogY29ycmVjdGx5IHBlcmZvcm1lZCAqYWZ0ZXIqIHRoZSBgZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChmb2xpbylgIGNoZWNrLCBhcyBpdCB3YXMgaW4gdGhlIG9sZCBjb2RlLgoKQWxzbywgdGhlIGBmb2xpb2AgaXMgdXBkYXRlZCBhdCB0aGUgY29ycmVjdCB0aW1lLgoKV2FpdCBhIHNlY29uZCAtICppcyogdGhlcmUgYSBkaWZmZXJlbmNlPyBMZXQmIzM5O3MgY2hlY2sgYGNvbGxhcHNlX3NjYW5fcG1kKClgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCAqYWdhaW4qLiBUaGUgbG9naWMgZm9yIGRldGVjdGluZyBzd2FwcGVkIFBURXMgd2l0aCBVRkZEIGVuYWJsZWQgKGBwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbClgKSBhbmQgd3JpdGUgcHJvdGVjdGlvbiBpcyBpbnRhY3QuIFRoZSBzYW1lIGNhbiBiZSBzYWlkIGZvciBob3cgdGhlIHJlZmVyZW5jZSBjb3VudGluZyBpcyBoYW5kbGVkLgoKT2theSwgc28gdGhlIE9OTFkgZnVuY3Rpb25hbCBjaGFuZ2UgaXMgdGhlIGBWTV9XQVJOX09OX0ZPTElPYCBmb3Igbm9uLWFub255bW91cyBmb2xpb3MuCgpOb3csIHNob3VsZCBJIHJlY29tbWVuZCBmdXp6aW5nIHRoaXMsIGRlc3BpdGUgdGhlIHJpZ29yb3VzIGNoZWNrcz8gVGhpcyBwYXRjaCAqZG9lcyogdG91Y2ggY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjb2RlLiBSZWZhY3RvcmluZyBwYXRjaGVzIGluIGNvcmUgTU0gKmFyZSogd29ydGggZnV6emluZywgZXZlbiBpZiBJJiMzOTttIG5vdCBzZWVpbmcgYW55IGltbWVkaWF0ZSByZWQgZmxhZ3MuIFRoZXkgY2FuIGVhc2lseSBpbnRyb2R1Y2Ugc3VidGxlIGJ1Z3MsIHN1Y2ggYXMgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgb3Igd3JvbmcgcmV0dXJuIHZhbHVlcy4KCldhaXQsIGJhY2sgdG8gdGhvc2Ugc3VidGxldGllcy4gTGV04oCZcyBkbyBhIGZpbmFsIGRlZXAtZGl2ZSBjaGVjay4KCmBjdHgudW5tYXBwZWRgLCB3aGljaCBpcyBub3QgZXhwbGljaXRseSBpbml0aWFsaXplZCBpbiB0aGUgc3RydWN0LCBpcyB6ZXJvLWluaXRpYWxpemVkIGJ5IEMuIE5vIGlzc3VlcyB0aGVyZS4gYGN0eC5yZXN1bHRgIGlzIHByb3Blcmx5IGhhbmRsZWQgYnkgYHB0ZV9jaGVja19mYWlsKClgLiBBbmQgYGN0eC5mb2xpb2AgaXMgY29ycmVjdGx5IHNldCB3aXRoaW4gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBiZWZvcmUgaXQmIzM5O3MgdXNlZC4KCkJ1dCB3YWl0LCBpZiBgcHRlX25vbmVfb3JfemVybyhwdGV2YWwpYCByZXR1cm5zIHRydWUsIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgcmV0dXJucyBgUFRFX0NIRUNLX0NPTlRJTlVFYC4gYGN0eC0mZ3Q7Zm9saW9gICppc24mIzM5O3QqIHVwZGF0ZWQgaW4gdGhhdCBjYXNlLiBTbywgd2hlbiB0aGUgbG9vcCBjb250aW51ZXMsIGBjdHgtJmd0O2ZvbGlvYCBob2xkcyB0aGUgdmFsdWUgZnJvbSB0aGUgKnByZXZpb3VzKiBpdGVyYXRpb24uIERvZXMgdGhpcyBtYXR0ZXI/IEFmdGVyIGNoZWNraW5nIHRoZSBjb2RlLCBpdCB0dXJucyBvdXQgdGhpcyBpcyBob3cgdGhlIG9sZCBjb2RlICphbHNvKiB3b3JrZWQhIGBmb2xpb2AgaXMgdXNlZCBsYXRlciBpbiBgdHJhY2VfbW1fa2h1Z2VwYWdlZF9zY2FuX3BtZCgpYC4gU28gdGhlIGJlaGF2aW9yIGlzIHByZXNlcnZlZC4KCkluIGZhY3QsIHRoZSBsb2dpYyBmb3IgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAgaXMgYWxzbyBleGFjdGx5IHRoZSBzYW1lIQoKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7VFJBQ0VfRVZFTlRcXChtbV9raHVnZXBhZ2VkX3NjYW5fcG1kJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5Lmg9NDk9U0NBTl9TVEFUVVNcbi0tXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTU1LVxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaDo1NjpUUkFDRV9FVkVOVChtbV9raHVnZXBhZ2VkX3NjYW5fcG1kLFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC01Ny1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDc4OTEKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAyMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6CgoqKkRpdmluZyBpbnRvIHRoZSBIdWdlIE1lbW9yeSBFdmVudHMqKgoKT2theSwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nIHdpdGggdGhlc2UgaHVnZSBtZW1vcnkgZXZlbnRzLCBzbyBJJiMzOTttIGdvaW5nIHRvIGp1bXAgaW50byB0aGUgY29kZS4gU3BlY2lmaWNhbGx5LCBJJiMzOTttIGFpbWluZyBmb3IgYGluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmhgLCBhbmQgSSB0aGluayB0aGUganVpY3kgc3R1ZmYgc3RhcnRzIGFyb3VuZCBsaW5lIDU2LiBJJiMzOTttIGV4cGVjdGluZyB0byBmaW5kIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIHJlbGV2YW50IHRyYWNlcG9pbnRzIG9yIHN0cnVjdHVyZXMgdGhlcmUuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBzb2xpZCBmb3VuZGF0aW9uIGZvciBpbnRlcnByZXRpbmcgdGhlIHRyYWNlIGRhdGEgSSYjMzk7bSBzZWVpbmcgYW5kIGRpYWdub3NpbmcgYW55IHBvdGVudGlhbCBpc3N1ZXMuIExpbmUgNTYgaXMganVzdCBhIHN0YXJ0aW5nIHBvaW50LCBvZiBjb3Vyc2U7IEkmIzM5O2xsIGxpa2VseSBiZSBzY2FubmluZyBhcm91bmQgdGhhdCBhcmVhIHRvIGdldCB0aGUgZnVsbCBwaWN0dXJlLiBMZXQmIzM5O3Mgc2VlIHdoYXQgZ2VtcyB3ZSBmaW5kLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2luY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1NiwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDU2Olx0VFJBQ0VfRVZFTlQobW1fa2h1Z2VwYWdlZF9zY2FuX3BtZCxcbiAgNTc6XHRcbiAgNTg6XHRcdFRQX1BST1RPKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuICA1OTpcdFx0XHQgaW50IHJlZmVyZW5jZWQsIGludCBub25lX29yX3plcm8sIGludCBzdGF0dXMsIGludCB1bm1hcHBlZCksXG4gIDYwOlx0XG4gIDYxOlx0XHRUUF9BUkdTKG1tLCBmb2xpbywgcmVmZXJlbmNlZCwgbm9uZV9vcl96ZXJvLCBzdGF0dXMsIHVubWFwcGVkKSxcbiAgNjI6XHRcbiAgNjM6XHRcdFRQX1NUUlVDVF9fZW50cnkoXG4gIDY0Olx0XHRcdF9fZmllbGQoc3RydWN0IG1tX3N0cnVjdCAqLCBtbSlcbiAgNjU6XHRcdFx0X19maWVsZCh1bnNpZ25lZCBsb25nLCBwZm4pXG4gIDY2Olx0XHRcdF9fZmllbGQoaW50LCByZWZlcmVuY2VkKVxuICA2NzpcdFx0XHRfX2ZpZWxkKGludCwgbm9uZV9vcl96ZXJvKVxuICA2ODpcdFx0XHRfX2ZpZWxkKGludCwgc3RhdHVzKVxuICA2OTpcdFx0XHRfX2ZpZWxkKGludCwgdW5tYXBwZWQpXG4gIDcwOlx0XHQpLFxuICA3MTpcdFxuICA3MjpcdFx0VFBfZmFzdF9hc3NpZ24oXG4gIDczOlx0XHRcdF9fZW50cnktXHUwMDNlbW0gPSBtbTtcbiAgNzQ6XHRcdFx0X19lbnRyeS1cdTAwM2VwZm4gPSBmb2xpbyA/IGZvbGlvX3Bmbihmb2xpbykgOiAtMTtcbiAgNzU6XHRcdFx0X19lbnRyeS1cdTAwM2VyZWZlcmVuY2VkID0gcmVmZXJlbmNlZDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDg0MjEKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiA5MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duOgoKKipBbmFseXppbmcgVGhhdCBGb2xpbyBQRk4gQ2hlY2sqKgoKQWxyaWdodCwgdGhhdCBgZm9saW8gPyBmb2xpb19wZm4oZm9saW8pIDogLTFgIHNuaXBwZXQgaXMgaW50ZXJlc3RpbmcuIEl0JiMzOTtzIGEgbmljZSwgc2FmZSB3YXkgdG8gaGFuZGxlIGEgTlVMTCBmb2xpbzsgbm8gc3VycHJpc2VzIHRoZXJlLiBBbmQganVzdCB0byBjb25maXJtLCB0aGlua2luZyBhYm91dCBpdC4uLiBldmVuIGlmIGl0JiMzOTtzIGEgem9uZSBkZXZpY2UgZm9saW8sIGBmb2xpb19wZm4oKWAgc2hvdWxkIGJlIHBlcmZlY3RseSBzYWZlLCByaWdodD8gWWVwLCBpdCBpcy4gU28sIHRoaXMgZGlzY3JlcGFuY3ksIHRoaXMgY29uZGl0aW9uYWwgaW4gdGhlIGNvZGUsIGlzIGNvbXBsZXRlbHkgYmVuaWduLiBJdCBqdXN0IGFsdGVycyB0aGUgcGh5c2ljYWwgcGFnZSBudW1iZXIgbG9nZ2VkIGluIHRoZSB0cmFjZXBvaW50IGluIHRoaXMgKnNwZWNpZmljKiBlcnJvciBjb25kaXRpb24uIEl0JiMzOTtzIG5vdCBpbnRyb2R1Y2luZyBhIGJ1ZyBvciBhbnl0aGluZyBwcm9ibGVtYXRpYy4gSnVzdCBhIGxvZ2dpbmcgZGV0YWlsLgoKSG1tLCBidXQgd2FpdC4uLiBJIG5lZWQgdG8gY29uc2lkZXIgdGhlIGJpZ2dlciBwaWN0dXJlIGhlcmUuIFdoYXQmIzM5O3MgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoaXMgYW5kIGB0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYD8gSXMgdGhlcmUgYW55IGludGVyYWN0aW9uIHdpdGggdGhhdCBmdW5jdGlvbiB0aGF0IEkgbmVlZCB0byBiZSBhd2FyZSBvZj8gTGV0IG1lIHRoaW5rIHRocm91Z2ggdGhlIGltcGxpY2F0aW9ucyBvZiB0aGF0IGZvciBhIG1vbWVudC4uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtUUkFDRV9FVkVOVFxcKG1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5Lmg9OTA9VFJBQ0VfRVZFTlQobW1fY29sbGFwc2VfaHVnZV9wYWdlLFxuLS1cbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgtMTE2LVxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaDoxMTc6VFJBQ0VfRVZFTlQobW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUsXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTExOC1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDg4NjQKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiA2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBJJiMzOTttIHJlYWR5LiBMZXQmIzM5O3MgZ2V0IHRvIGl0LiBIZXJlJiMzOTtzIGEgc3VtbWFyeSwgaW4gdGhlIGZpcnN0IHBlcnNvbiwgYXNzdW1pbmcgSSYjMzk7bSB0aGUgZXhwZXJ0OgoKKipJbml0aWFsIEFzc2Vzc21lbnQgYW5kIFByb2Nlc3NpbmcqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBUaGUgaW5pdGlhbCBzdGVwIGlzLCBvZiBjb3Vyc2UsIHRvIHJlYWQgdGhlIHRleHQuIEl0JiMzOTtzIHRoZSBmb3VuZGF0aW9uIG9mIGFueSBhbmFseXNpcy4gV2UgbmVlZCB0byBwYXJzZSB0aGUgbGFuZ3VhZ2UsIGdyYXNwIHRoZSBjb3JlIGlkZWFzLCBhbmQgYmVnaW4gdG8gZm9ybSBhbiBpbnRlcm5hbCBtb2RlbCBvZiBpdHMgYXJndW1lbnQgb3IgY29udGVudC4gRGVwZW5kaW5nIG9uIHRoZSBmaWVsZCwgSeKAmW0gaW1tZWRpYXRlbHkgc2VhcmNoaW5nIGZvciBzcGVjaWZpYyBrZXl3b3JkcyBvciBjb25jZXB0cywgcGVyaGFwcyByZWxhdGVkIHRvIG1ldGhvZG9sb2dpZXMsIHJlc3VsdHMsIG9yIGltcGxpY2F0aW9ucy4gTXkgcHJpb3Iga25vd2xlZGdlIGFuZCBleHBlcmllbmNlIHdpbGwgaW1tZWRpYXRlbHkgc3RhcnQgdG8gaW5mb3JtIHRoZSBwcm9jZXNzLiBJJiMzOTttIG5vdCBqdXN0IHBhc3NpdmVseSBhYnNvcmJpbmc7IEkmIzM5O20gYWN0aXZlbHkgZmlsdGVyaW5nLCBjYXRlZ29yaXppbmcsIGFuZCBxdWVzdGlvbmluZyBhcyBJIGdvLiBEb2VzIHRoaXMgYWxpZ24gd2l0aCBleGlzdGluZyBsaXRlcmF0dXJlPyBBcmUgdGhlcmUgYW55IGltbWVkaWF0ZSByZWQgZmxhZ3MsIHBlcmhhcHMgaW5jb25zaXN0ZW5jaWVzIG9yIHVuc3VwcG9ydGVkIGNsYWltcz8gSXTigJlzIGEgdmVyeSBkeW5hbWljIHByb2Nlc3MsIHRoaXMgaW5pdGlhbCByZWFkLiBJJiMzOTttIHRyeWluZyB0byBnZXQgYSBzZW5zZSBvZiB0aGUgYXV0aG9yJiMzOTtzIGludGVudCBhbmQgc2NvcGUgcXVpY2tseS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGlzIGFsbCBhYm91dCEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtpbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTE3LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMTc6XHRUUkFDRV9FVkVOVChtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSxcbiAxMTg6XHRcbiAxMTk6XHRcdFRQX1BST1RPKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBub25lX29yX3plcm8sXG4gMTIwOlx0XHRcdCBpbnQgcmVmZXJlbmNlZCwgaW50IHN0YXR1cywgdW5zaWduZWQgaW50IG9yZGVyKSxcbiAxMjE6XHRcbiAxMjI6XHRcdFRQX0FSR1MoZm9saW8sIG5vbmVfb3JfemVybywgcmVmZXJlbmNlZCwgc3RhdHVzLCBvcmRlciksXG4gMTIzOlx0XG4gMTI0Olx0XHRUUF9TVFJVQ1RfX2VudHJ5KFxuIDEyNTpcdFx0XHRfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIHBmbilcbiAxMjY6XHRcdFx0X19maWVsZChpbnQsIG5vbmVfb3JfemVybylcbiAxMjc6XHRcdFx0X19maWVsZChpbnQsIHJlZmVyZW5jZWQpXG4gMTI4Olx0XHRcdF9fZmllbGQoaW50LCBzdGF0dXMpXG4gMTI5Olx0XHRcdF9fZmllbGQodW5zaWduZWQgaW50LCBvcmRlcilcbiAxMzA6XHRcdCksXG4gMTMxOlx0XG4gMTMyOlx0XHRUUF9mYXN0X2Fzc2lnbihcbiAxMzM6XHRcdFx0X19lbnRyeS1cdTAwM2VwZm4gPSBmb2xpbyA/IGZvbGlvX3Bmbihmb2xpbykgOiAtMTtcbiAxMzQ6XHRcdFx0X19lbnRyeS1cdTAwM2Vub25lX29yX3plcm8gPSBub25lX29yX3plcm87XG4gMTM1Olx0XHRcdF9fZW50cnktXHUwMDNlcmVmZXJlbmNlZCA9IHJlZmVyZW5jZWQ7XG4gMTM2Olx0XHRcdF9fZW50cnktXHUwMDNlc3RhdHVzID0gc3RhdHVzO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0OTQ0MgoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDIyODkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQXNzZXNzbWVudCBvZiB0aGUgUGF0Y2gmIzM5O3MgSW1wYWN0IGFuZCB0aGUgTmVlZCBmb3IgRnV6emluZyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBwcmltYXJ5IGNvbmNlcm4gaXMgZW5zdXJpbmcgdGhpcyByZWZhY3RvcmluZyBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IHN1YnRsZSByZWdyZXNzaW9ucywgZXNwZWNpYWxseSBnaXZlbiBpdHMgdG91Y2ggb24gY29yZSBNTSBjb21wb25lbnRzIGxpa2Uga2h1Z2VwYWdlZC4gVGhlIGNvcmUgZnVuY3Rpb25hbCBjaGFuZ2UgYm9pbHMgZG93biB0byByZXBsYWNpbmcgYSBgVk1fQlVHX09OX0ZPTElPYCB3aXRoIGEgYFZNX1dBUk5fT05fRk9MSU9gIGFuZCB0aGUgY29ycmVzcG9uZGluZyByZXR1cm4gdmFsdWUuIEkgYWxzbyBhZGRlZCBgVk1fV0FSTl9PTl9GT0xJT2AgaW4gYGNvbGxhcHNlX3NjYW5fcG1kKClgLiBJdCBzZWVtcyB0aGF0IHRoZSBsb2dpYyYjMzk7cyBvdmVyYWxsIGJlaGF2aW9yIGlzIG1haW50YWluZWQuCgpTcGVjaWZpY2FsbHksIEkmIzM5O3ZlIGNoZWNrZWQgbXVsdGlwbGUgc2VjdGlvbnM6IFRoZSBoYW5kbGluZyBvZiBOVUxMIHZhbHVlcywgY2hlY2tzIG9uIHZhcmlvdXMgYGN0eGAgZmllbGRzIChgdW5tYXBwZWRgLCBgc2hhcmVkYCwgYG5vbmVfb3JfemVyb2ApIGFuZCB0aGVpciBpbnRlcmFjdGlvbnMgd2l0aCBsaW1pdHMsIGluY2x1ZGluZyBsb29raW5nIGludG8gYGNvbGxhcHNlX21heF9wdGVzX25vbmUoKWAgYW5kIGhvdyB0aGF0IGlzIGRlZmluZWQgYW5kIHVzZWQsIGFuZCB0aGUgaW5pdGlhbGl6YXRpb24gYGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKWAuIFRoaXMgc2VlbXMgY29ycmVjdC4gSSBzcGVudCBhIGZhaXIgYml0IG9mIHRpbWUgb24gYGNvbGxhcHNlX3NjYW5fZmlsZSgpYCBhbmQgY29uZmlybWluZyB0aGUgYWRkaXRpb24gb2YgYGJpdG1hcF96ZXJvYCBpcyBzYWZlIHRoZXJlLiBNeSBmb2N1cyB3YXMgcHJpbWFyaWx5IG9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgdG8gZW5zdXJlIHRoYXQgdGhlIGxvZ2ljIGlzIGlkZW50aWNhbCwgcGF5aW5nIHBhcnRpY3VsYXIgYXR0ZW50aW9uIHRvIHRoZSBpbnRlcmFjdGlvbnMgYmV0d2VlbiBgcHRlX25vbmVfb3JfemVybygpYCBhbmQgYHB0ZV9wcmVzZW50KClgLCBhbmQgaG93IHRoZXkgZmxvdyB0aHJvdWdoIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgLiBUaGUgYmVoYXZpb3Igc2VlbXMgaWRlbnRpY2FsLgoKV2hpbGUgdGhlIHNlbWFudGljIGNoYW5nZSBzZWVtcyBsaW1pdGVkLCB0aGUgaW50cm9kdWN0aW9uIG9mIHRoZSBgVk1fV0FSTl9PTl9GT0xJT2AgaXMgYSBwb3RlbnRpYWwgdHJpZ2dlciBmb3IgYW4gZWRnZSBjYXNlIHdoZXJlIGEgbm9uLWFub24gZm9saW8gbWlnaHQgZ2V0IG1hcHBlZCBpbnRvIGFub24gVk1BLiBHaXZlbiB0aGUgY29yZSBNTSBuYXR1cmUgb2YgdGhlIGNoYW5nZXMsIHRoZSByaXNrIG9mIHJlZ3Jlc3Npb25zLCBhbmQgdGhlIHBvdGVudGlhbCBmb3IgYSBzdWJ0bGUgZWRnZSBjYXNlIHdpdGggdGhlIHdhcm5pbmcsIGl0JiMzOTtzIHBydWRlbnQgdG8gdHJlYXQgdGhpcyBhcyBhIGNhbmRpZGF0ZSBmb3IgZnV6emluZy4gSSYjMzk7bGwgZmxhZyBgV29ydGhGdXp6aW5nPXRydWVgLgoKRm9yIGZ1enppbmcgdGFyZ2V0cywgSSYjMzk7bGwgZm9jdXMgb24gdGhlIGNyaXRpY2FsIGZ1bmN0aW9uczogYGNvbGxhcHNlX2NoZWNrX3B0ZWAsIGBjb2xsYXBzZV9zY2FuX3BtZGAsIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYCBhbmQgYG10aHBfY29sbGFwc2VgLiBJJiMzOTtsbCB3YW50IHRvIGVuc3VyZSB0aGF0IEkgaGF2ZSBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGVuYWJsZWQuIEkgY2FuIGFsc28gbG9vayBhdCBgUkVBRF9PTkxZX1RIUF9GT1JfRlNgLCBidXQgaXQgbWlnaHQgbm90IGJlIHJlbGV2YW50LiBJIHdpbGwgYWxzbyBlbmFibGUgYFVTRVJGQVVMVEZEYCwgc2luY2UgdGhlcmUmIzM5O3MgdGhlIGNoZWNrIGZvciBgcHRlX3VmZmRgIGluIHRoZSBjb2RlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZz04Mjk9Y29uZmlnIE1NX0lEXG4tLVxubW0vS2NvbmZpZy04MzEtXG5tbS9LY29uZmlnOjgzMjptZW51Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFXG5tbS9LY29uZmlnLTgzMy1cdGJvb2wgXCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydFwmIzM0O1xuLS1cbm1tL0tjb25maWc9ODUwPWNob2ljZVxuLS1cbm1tL0tjb25maWctODU1LVxubW0vS2NvbmZpZzo4NTY6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXG5tbS9LY29uZmlnLTg1Ny1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTg2Mi1cbm1tL0tjb25maWc6ODYzOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0Vcbm1tL0tjb25maWctODY0LVx0XHRib29sIFwmIzM0O21hZHZpc2VcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTg3MS1cbm1tL0tjb25maWc6ODcyOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX05FVkVSXG5tbS9LY29uZmlnLTg3My1cdFx0Ym9vbCBcJiMzNDtuZXZlclwmIzM0O1xuLS1cbm1tL0tjb25maWc9ODc5PWNob2ljZVxuLS1cbm1tL0tjb25maWctODg4LVxubW0vS2NvbmZpZzo4ODk6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9ORVZFUlxubW0vS2NvbmZpZy04OTAtXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTg5OC1cbm1tL0tjb25maWc6ODk5Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQUxXQVlTXG5tbS9LY29uZmlnLTkwMC1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTkwNi1cbm1tL0tjb25maWc6OTA3Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfV0lUSElOX1NJWkVcbm1tL0tjb25maWctOTA4LVx0XHRib29sIFwmIzM0O3dpdGhpbl9zaXplXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MTQtXG5tbS9LY29uZmlnOjkxNTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FEVklTRVxubW0vS2NvbmZpZy05MTYtXHRcdGJvb2wgXCYjMzQ7YWR2aXNlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz05MjQ9Y2hvaWNlXG4tLVxubW0vS2NvbmZpZy05MzMtXG5tbS9LY29uZmlnOjkzNDpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX05FVkVSXG5tbS9LY29uZmlnLTkzNS1cdFx0Ym9vbCBcJiMzNDtuZXZlclwmIzM0O1xuLS1cbm1tL0tjb25maWctOTQyLVxubW0vS2NvbmZpZzo5NDM6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BTFdBWVNcbm1tL0tjb25maWctOTQ0LVx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuLS1cbm1tL0tjb25maWctOTUwLVxubW0vS2NvbmZpZzo5NTE6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9XSVRISU5fU0laRVxubW0vS2NvbmZpZy05NTItXHRcdGJvb2wgXCYjMzQ7d2l0aGluX3NpemVcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk1OC1cbm1tL0tjb25maWc6OTU5Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQURWSVNFXG5tbS9LY29uZmlnLTk2MC1cdFx0Ym9vbCBcJiMzNDthZHZpc2VcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTk6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTI5ODYKCQkJCQkJCW91dHB1dDogMTkKCQkJCQkJCXRob3VnaHRzOiAzMjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgUmVhc29uaW5nIGZvciBTZWxlY3RpbmcgUmVsZXZhbnQgU3ltYm9scyoqCgpPa2F5LCBzbyBJJiMzOTttIGZvY3VzaW5nIG9uIHRoZSBzaWduaWZpY2FudCBjb25maWd1cmF0aW9ucyBhbmQgQVBJIGVudHJ5IHBvaW50cyByZWxhdGVkIHRvIFRyYW5zcGFyZW50IEh1Z2UgUGFnZXMgKFRIUCkgZm9yIHRoaXMgdGFzay4gVGhlIHByaW1hcnkgY29uZmlndXJhdGlvbiBJIG5lZWQgdG8gY29uc2lkZXIgaXMsIG9mIGNvdXJzZSwgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYC4gSSYjMzk7bGwgYWxzbyBicmluZyBpbiBgVVNFUkZBVUxURkRgIHNpbmNlIGl0JiMzOTtzIGxpa2VseSByZWxldmFudCB0byB0aGUgb3ZlcmFsbCBwaWN0dXJlIG9mIFRIUCBtYW5hZ2VtZW50LgoKTm93LCBJJiMzOTttIGF0IHRoZSBwb2ludCB3aGVyZSBJIG5lZWQgdG8gc2VsZWN0IGZ1bmN0aW9ucy4gVGhlIGluc3RydWN0aW9ucyBzcGVjaWZ5IGEgcHJlZmVyZW5jZSBmb3Igbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5IHBvaW50cyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zLiBJIG5lZWQgdG8gYmUgY2FyZWZ1bCBoZXJlIGJlY2F1c2UgdGhlIGNvbXBpbGVyIGNhbiBpbmxpbmUuCgpMZXQgbWUgZG91YmxlLWNoZWNrIGBjb2xsYXBzZV9jaGVja19wdGVgLiBZZXAsIGl0JiMzOTtzIHN0YXRpYzoKCmBgYGMKc3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBjb2xsYXBzZV9jaGVja19wdGUocHRlX3QgcHRldmFsLAoJCXVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgpCmBgYAoKVGhlcmVmb3JlLCBJICp3b24mIzM5O3QqIGluY2x1ZGUgaXQuIEl0JiMzOTtzIGxpa2VseSBpbmxpbmVkLCBhbmQgbm90IGEgc3VpdGFibGUgZW50cnkgcG9pbnQuCgpJbnN0ZWFkLCBJIGNvbnNpZGVyZWQ6IGBjb2xsYXBzZV9zY2FuX3BtZGAsIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYCwgYG10aHBfY29sbGFwc2VgLCBhbmQgYGNvbGxhcHNlX2h1Z2VfcGFnZWAuIEJ1dCwgSSBxdWlja2x5IHJlYWxpemVkIHRoYXQgdGhvc2UgYXJlIGFsbCBhbHNvIHN0YXRpYyEgU28gdGhleSBhcmUgbm90IHdoYXQgSSBuZWVkLgoKSSBuZWVkIHRvIGZpbmQgdGhlIG5vbi1zdGF0aWMgZW50cnlwb2ludHMuIEhtbSwgSSBrbm93IGBraHVnZXBhZ2VkX3NjYW5fbW1fc2xvdGAgaXMgc3RhdGljLCBhbmQgYGtodWdlcGFnZWRgIGl0c2VsZiAodGhlIGtlcm5lbCB0aHJlYWQpIGlzIGFsc28gc3RhdGljLiBBaCEgV2FpdCBhIG1pbnV0ZSwgYG1hZHZpc2VfY29sbGFwc2VgICpzaG91bGQqIGJlIG5vbi1zdGF0aWMuIEkmIzM5O2xsIGRvdWJsZSBjaGVjayB0aGF0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttYWR2aXNlX2NvbGxhcHNlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdD0zNDY9QSBoaWdoZXIgdmFsdWUgbWF5IGluY3JlYXNlIG1lbW9yeSBmb290cHJpbnQgZm9yIHNvbWUgd29ya2xvYWRzLlxuLS1cbkRvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdC0zNTMtXG5Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3Q6MzU0OiAgIEN1cnJlbnRseSwgbWFkdmlzZV9jb2xsYXBzZSBvbmx5IHN1cHBvcnRzIGNvbGxhcHNpbmcgdG8gUE1ELXNpemVkIFRIUHNcbkRvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdC0zNTUtICAgYW5kIGRvZXMgbm90IGF0dGVtcHQgbVRIUCBjb2xsYXBzZXMuXG4tLVxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NTExPWludCBodWdlcGFnZV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB2bV9mbGFnc190ICp2bV9mbGFncyxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTUxMi1cdFx0ICAgICBpbnQgYWR2aWNlKTtcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjUxMzppbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTUxNC1cdFx0ICAgICB1bnNpZ25lZCBsb25nIGVuZCwgYm9vbCAqbG9ja19kcm9wcGVkKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD03MTI9c3RhdGljIGlubGluZSBpbnQgaHVnZXBhZ2VfbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC03MTctXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo3MTg6c3RhdGljIGlubGluZSBpbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTcxOS1cdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsXG4tLVxubW0va2h1Z2VwYWdlZC5jPTMxNzI9Ym9vbCBjdXJyZW50X2lzX2todWdlcGFnZWQodm9pZClcbi0tXG5tbS9raHVnZXBhZ2VkLmMtMzE3Ni1cbm1tL2todWdlcGFnZWQuYzozMTc3OnN0YXRpYyBpbnQgbWFkdmlzZV9jb2xsYXBzZV9lcnJubyhlbnVtIHNjYW5fcmVzdWx0IHIpXG5tbS9raHVnZXBhZ2VkLmMtMzE3OC17XG4tLVxubW0va2h1Z2VwYWdlZC5jLTMyMDgtXG5tbS9raHVnZXBhZ2VkLmM6MzIwOTppbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbm1tL2todWdlcGFnZWQuYy0zMjEwLVx0XHQgICAgIHVuc2lnbmVkIGxvbmcgZW5kLCBib29sICpsb2NrX2Ryb3BwZWQpXG4tLVxubW0va2h1Z2VwYWdlZC5jLTMyOTYtXHRyZXR1cm4gdGhwcyA9PSAoKGhlbmQgLSBoc3RhcnQpIFx1MDAzZVx1MDAzZSBIUEFHRV9QTURfU0hJRlQpID8gMFxubW0va2h1Z2VwYWdlZC5jOjMyOTc6XHRcdFx0OiBtYWR2aXNlX2NvbGxhcHNlX2Vycm5vKGxhc3RfZmFpbCk7XG5tbS9raHVnZXBhZ2VkLmMtMzI5OC19XG4tLVxubW0vbWFkdmlzZS5jPTEzMzg9c3RhdGljIGludCBtYWR2aXNlX3ZtYV9iZWhhdmlvcihzdHJ1Y3QgbWFkdmlzZV9iZWhhdmlvciAqbWFkdl9iZWhhdmlvcilcbi0tXG5tbS9tYWR2aXNlLmMtMTM2Mi1cdGNhc2UgTUFEVl9DT0xMQVBTRTpcbm1tL21hZHZpc2UuYzoxMzYzOlx0XHRyZXR1cm4gbWFkdmlzZV9jb2xsYXBzZSh2bWEsIHJhbmdlLVx1MDAzZXN0YXJ0LCByYW5nZS1cdTAwM2VlbmQsXG5tbS9tYWR2aXNlLmMtMTM2NC1cdFx0XHRcdTAwMjZtYWR2X2JlaGF2aW9yLVx1MDAzZWxvY2tfZHJvcHBlZCk7XG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTIzMT1zdGF0aWMgdm9pZCBmaWxsX21lbW9yeShpbnQgKnAsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0yNDQtICovXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MjQ1OnN0YXRpYyBpbnQgbWFkdmlzZV9jb2xsYXBzZV9yZXRyeSh2b2lkICpwLCB1bnNpZ25lZCBsb25nIHNpemUpXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMjQ2LXtcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM9MjYzPXN0YXRpYyB2b2lkICphbGxvY19ocGFnZShzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0yNzYtXHRrc2Z0X3ByaW50X21zZyhcJiMzNDtBbGxvY2F0ZSBodWdlIHBhZ2UuLi5cJiMzNDspO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjI3NzpcdGlmIChtYWR2aXNlX2NvbGxhcHNlX3JldHJ5KHAsIGhwYWdlX3BtZF9zaXplKSlcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0yNzgtXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttYWR2aXNlKE1BRFZfQ09MTEFQU0UpXCYjMzQ7KTtcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM9NTA0PXN0YXRpYyBib29sIGlzX2Fub24oc3RydWN0IG1lbV9vcHMgKm9wcylcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNTA4LVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjUwOTpzdGF0aWMgdm9pZCBfX21hZHZpc2VfY29sbGFwc2UoY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBpbnQgbnJfaHBhZ2VzLFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTUxMC1cdFx0XHQgICAgICAgc3RydWN0IG1lbV9vcHMgKm9wcywgYm9vbCBleHBlY3QpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTUzMi1cdG1hZHZpc2UocCwgbnJfaHBhZ2VzICogaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjUzMzpcdHJldCA9IG1hZHZpc2VfY29sbGFwc2VfcmV0cnkocCwgbnJfaHBhZ2VzICogaHBhZ2VfcG1kX3NpemUpO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTUzNC1cdGlmICgoKGJvb2wpcmV0KSA9PSBleHBlY3QpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTU0My1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzo1NDQ6c3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNTQ1LVx0XHRcdCAgICAgc3RydWN0IG1lbV9vcHMgKm9wcywgYm9vbCBleHBlY3QpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTU0OS1cdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1VuZXhwZWN0ZWQgaHVnZSBwYWdlXFxuXCYjMzQ7KTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzo1NTA6XHRfX21hZHZpc2VfY29sbGFwc2UobXNnLCBwLCBucl9ocGFnZXMsIG9wcywgZXhwZWN0KTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy01NTEtfVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYz02MjA9c3RhdGljIHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0IF9fbWFkdmlzZV9jb250ZXh0ID0ge1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjYyMTpcdC5jb2xsYXBzZSA9IFx1MDAyNm1hZHZpc2VfY29sbGFwc2UsXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNjIyLVx0LmVuZm9yY2VfcHRlX3NjYW5fbGltaXRzID0gZmFsc2UsXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTk4OD1zdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTEwNDUtXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MTA0NjpzdGF0aWMgdm9pZCBtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMTA0Ny1cdFx0XHRcdFx0ICAgc3RydWN0IG1lbV9vcHMgKm9wcylcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMTA1Ni1cdC8qIGMtXHUwMDNlY29sbGFwc2UoKSB3aWxsIGZpbmQgYSBodWdlcGFnZSBhbmQgY29tcGxhaW4gLSBjYWxsIGRpcmVjdGx5LiAqL1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjEwNTc6XHRfX21hZHZpc2VfY29sbGFwc2UoXCYjMzQ7UmUtY29sbGFwc2UgUE1ELW1hcHBlZCBodWdlcGFnZVwmIzM0OywgcCwgMSwgb3BzLCB0cnVlKTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0xMDU4LVx0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM9MTIwOD1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTEzMjYtXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MTMyNzpcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzoxMzI4Olx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzoxMzI5Olx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzoxMzMwOlx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgc2htZW1fb3BzKTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0xMzMxLVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxOTo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NTg1MwoJCQkJCQkJb3V0cHV0OiAxNjAKCQkJCQkJCXRob3VnaHRzOiA1MTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgUG90ZW50aWFsIEZ1enppbmcgRW50cnlwb2ludHMqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBjb2RlIGFuZCB0cnlpbmcgdG8gZmlndXJlIG91dCB0aGUgYmVzdCBwb2ludHMgdG8gdGFyZ2V0IGZvciBmdXp6aW5nLiBUaGUgZ29hbCwgYXMgSSB1bmRlcnN0YW5kIGl0LCBpcyB0byBmaW5kIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50cywgYXMgdGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgdGhhdCByZXByZXNlbnQgdGhlICYjMzQ7ZnJvbnQgZG9vciYjMzQ7IG9mIHRoZSBmdW5jdGlvbmFsaXR5IHdlIHdhbnQgdG8gdGVzdC4gSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucywgYmVpbmcgaW5saW5lZCBieSB0aGUgY29tcGlsZXIsIGFyZSBlc3NlbnRpYWxseSBoaWRkZW4gd2l0aGluIHRoZSBsYXJnZXIgc3RydWN0dXJlcyBhbmQgZG9uJiMzOTt0IG9mZmVyIGFzIGNsZWFyIGEgdGVzdGluZyBzdXJmYWNlLgoKSW5pdGlhbGx5LCBJIGlkZW50aWZpZWQgYG1hZHZpc2VfY29sbGFwc2VgIGFzIGEga2V5IGNhbmRpZGF0ZS4gSXQmIzM5O3MgYSBub24tc3RhdGljIGVudHJ5cG9pbnQsIHBlcmZlY3QuIEkgbmVlZCB0byBpbmNsdWRlIGl0IGluIEZvY3VzU3ltYm9scy4gSSBhbHNvIGxvb2tlZCBhdCBga2h1Z2VwYWdlZGAsIGJ1dCB0aGF0JiMzOTtzIGEgc3RhdGljIGtlcm5lbCB0aHJlYWQg4oCTIHNvIGl0JiMzOTtzIG91dC4gVGhlbiwgSSBsb29rZWQgYXQgYGtodWdlcGFnZWRfc2Nhbl9wbWRgLCBidXQgdGhhdCYjMzk7cyBiZWVuIHJlbmFtZWQgdG8gYGNvbGxhcHNlX3NjYW5fcG1kYC4gYGtodWdlcGFnZWRfc2Nhbl9tbV9zbG90YCBpcyBhbHNvIG5vdCBhcHByb3ByaWF0ZS4gQWZ0ZXIgbW9yZSBpbnZlc3RpZ2F0aW9uLCBga2h1Z2VwYWdlZF9lbnRlcmAgYW5kIGBraHVnZXBhZ2VkX2VudGVyX3ZtYWAgYWxzbyBzZWVtIHRvIGZpdCB0aGUgYmlsbCBhcyBub24tc3RhdGljIGZ1bmN0aW9ucy4KCkhvd2V2ZXIsIHRoZSBwcm9tcHQgcmVhbGx5IGVtcGhhc2l6ZXMgcHJlZmVycmluZyB0aGUgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnRzLiBTbywgSSBuZWVkIHRvIHN0YXkgZm9jdXNlZCBvbiBgbWFkdmlzZV9jb2xsYXBzZWAuCgpCYXNlZCBvbiBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBwYXRjaCBhbmQgdGhlIGdvYWwsIHRoZSBtb3N0IGVmZmVjdGl2ZSBlbnRyeXBvaW50IHNlZW1zIHRvIGJlIGBtYWR2aXNlX2NvbGxhcHNlYC4gSSYjMzk7bSBnb2luZyB0byBzdGljayB3aXRoIHRoYXQuCgpUaGUgYnJvYWRlciBjb250ZXh0IHN1Z2dlc3RzIHRoaXMgZW50cnlwb2ludCBpcyB3b3J0aCBmdXp6aW5nLCB0aGF0JiMzOTtzIGNsZWFyLiBUaGUgcGF0Y2ggcmVmYWN0b3JzIHNvbWUgUFRFIGNoZWNraW5nIGxvZ2ljLCBhbmQgYG1hZHZpc2UoTUFEVl9DT0xMQVBTRSlgIGFuZCBga2h1Z2VwYWdlZGAgY2FuIGhlbHAgdmVyaWZ5IHRoYXQgdGhpcyBjaGFuZ2UgZG9lc24mIzM5O3QgaW50cm9kdWNlIHJlZ3Jlc3Npb25zLCBzcGVjaWZpY2FsbHkgYXJvdW5kIFBURSBzY2FubmluZyBvciB1bmluaXRpYWxpemVkIHZhcmlhYmxlIHVzYWdlLgoKTm93LCBsZXQmIzM5O3MgbWFrZSBzdXJlIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHNldCBhcHByb3ByaWF0ZWx5LiBJIG5lZWQgdG8gY2hlY2sgYFVTRVJGQVVMVEZEYCBiZWNhdXNlIHRoZSBjb2RlIGFwcGVhcnMgdG8gdXNlIGBwdGVfdWZmZGAuIEkmIzM5O3ZlIGNvbmZpcm1lZCB0aGF0IGBVU0VSRkFVTFRGRGAgaXMgaW5kZWVkIG5lZWRlZC4gQWxzbywgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBpcyBlc3NlbnRpYWwgYmVjYXVzZSBib3RoIGBraHVnZXBhZ2VkYCBhbmQgYG1hZHZpc2VfY29sbGFwc2VgIGFyZSBwYXJ0IG9mIHRoZSBUSFAgZnVuY3Rpb25hbGl0eS4KClNvLCBoZXJlJiMzOTtzIHRoZSBwbGFuOgoKKiAgICoqV29ydGhGdXp6aW5nOioqIGB0cnVlYAoqICAgKipGb2N1c1N5bWJvbHM6KiogYFsmIzM0O21hZHZpc2VfY29sbGFwc2UmIzM0O11gCiogICAqKkVuYWJsZUNvbmZpZ3M6KiogYFsmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssICYjMzQ7VVNFUkZBVUxURkQmIzM0O11gCiogICAqKlJlYXNvbmluZzoqKiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgUFRFIGNoZWNraW5nIGxvZ2ljIGZvciBUSFAgY29sbGFwc2UgaW50byBhIG5ldyBoZWxwZXIgZnVuY3Rpb24gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYC4gSXQgYWxzbyBtb2RpZmllcyB0aGUgYmVoYXZpb3Igd2hlbiBhIG5vbi1hbm9ueW1vdXMgZm9saW8gaXMgZW5jb3VudGVyZWQgaW4gYW4gYW5vbnltb3VzIFZNQSwgY2hhbmdpbmcgYSBgVk1fQlVHX09OX0ZPTElPYCB0byBhIGBWTV9XQVJOX09OX0ZPTElPYCBhbmQgcmV0dXJuaW5nIGFuIGVycm9yLiBGdXp6aW5nIGBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpYCBhbmQgYGtodWdlcGFnZWRgIGNhbiBoZWxwIHZlcmlmeSB0aGF0IHRoaXMgcmVmYWN0b3JpbmcgZG9lc24mIzM5O3QgaW50cm9kdWNlIHN1YnRsZSByZWdyZXNzaW9ucyBpbiBQVEUgc2Nhbm5pbmcgb3IgdW5pbml0aWFsaXplZCB2YXJpYWJsZSB1c2FnZS4mIzM0OwoKSSYjMzk7bSBjb25maWRlbnQgaW4gdGhpcyBhc3Nlc3NtZW50LiBJJiMzOTttIGdvaW5nIHRvIGNhbGwgYHNldC1yZXN1bHRzYCBub3cuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDE5OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtVU0VSRkFVTFRGRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O21hZHZpc2VfY29sbGFwc2UmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIFBURSBjaGVja2luZyBsb2dpYyBmb3IgVEhQIGNvbGxhcHNlIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGNvbGxhcHNlX2NoZWNrX3B0ZSgpLiBJdCBhbHNvIG1vZGlmaWVzIHRoZSBiZWhhdmlvciB3aGVuIGEgbm9uLWFub255bW91cyBmb2xpbyBpcyBlbmNvdW50ZXJlZCBpbiBhbiBhbm9ueW1vdXMgVk1BLCBjaGFuZ2luZyBhIFZNX0JVR19PTl9GT0xJTyB0byBhIFZNX1dBUk5fT05fRk9MSU8gYW5kIHJldHVybmluZyBhbiBlcnJvci4gRnV6emluZyBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpIGFuZCBraHVnZXBhZ2VkIGNhbiBoZWxwIHZlcmlmeSB0aGF0IHRoaXMgcmVmYWN0b3JpbmcgZG9lc24mIzM5O3QgaW50cm9kdWNlIHN1YnRsZSByZWdyZXNzaW9ucyBpbiBQVEUgc2Nhbm5pbmcgb3IgdW5pbml0aWFsaXplZCB2YXJpYWJsZSB1c2FnZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OywKICAgICYjMzQ7VVNFUkZBVUxURkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDttYWR2aXNlX2NvbGxhcHNlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBQVEUgY2hlY2tpbmcgbG9naWMgZm9yIFRIUCBjb2xsYXBzZSBpbnRvIGEgbmV3IGhlbHBlciBmdW5jdGlvbiBjb2xsYXBzZV9jaGVja19wdGUoKS4gSXQgYWxzbyBtb2RpZmllcyB0aGUgYmVoYXZpb3Igd2hlbiBhIG5vbi1hbm9ueW1vdXMgZm9saW8gaXMgZW5jb3VudGVyZWQgaW4gYW4gYW5vbnltb3VzIFZNQSwgY2hhbmdpbmcgYSBWTV9CVUdfT05fRk9MSU8gdG8gYSBWTV9XQVJOX09OX0ZPTElPIGFuZCByZXR1cm5pbmcgYW4gZXJyb3IuIEZ1enppbmcgbWFkdmlzZShNQURWX0NPTExBUFNFKSBhbmQga2h1Z2VwYWdlZCBjYW4gaGVscCB2ZXJpZnkgdGhhdCB0aGlzIHJlZmFjdG9yaW5nIGRvZXNuJiMzOTt0IGludHJvZHVjZSBzdWJ0bGUgcmVncmVzc2lvbnMgaW4gUFRFIHNjYW5uaW5nIG9yIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgdXNhZ2UuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTozODo1OS4wNjQ1MDcwNzVaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyOTg4MDY4OTA1ODUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgICBcIlVTRVJGQVVMVEZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibWFkdmlzZV9jb2xsYXBzZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBQVEUgY2hlY2tpbmcgbG9naWMgZm9yIFRIUCBjb2xsYXBzZSBpbnRvIGEgbmV3IGhlbHBlciBmdW5jdGlvbiBjb2xsYXBzZV9jaGVja19wdGUoKS4gSXQgYWxzbyBtb2RpZmllcyB0aGUgYmVoYXZpb3Igd2hlbiBhIG5vbi1hbm9ueW1vdXMgZm9saW8gaXMgZW5jb3VudGVyZWQgaW4gYW4gYW5vbnltb3VzIFZNQSwgY2hhbmdpbmcgYSBWTV9CVUdfT05fRk9MSU8gdG8gYSBWTV9XQVJOX09OX0ZPTElPIGFuZCByZXR1cm5pbmcgYW4gZXJyb3IuIEZ1enppbmcgbWFkdmlzZShNQURWX0NPTExBUFNFKSBhbmQga2h1Z2VwYWdlZCBjYW4gaGVscCB2ZXJpZnkgdGhhdCB0aGlzIHJlZmFjdG9yaW5nIGRvZXNuJ3QgaW50cm9kdWNlIHN1YnRsZSByZWdyZXNzaW9ucyBpbiBQVEUgc2Nhbm5pbmcgb3IgdW5pbml0aWFsaXplZCB2YXJpYWJsZSB1c2FnZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6Mzg6NTkuMDY0NTEyNTY0WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzE0ODU4MTE2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgNTc4YTRkYTYwODNjNTU1MmMyNmYyYTcwZmVkOGFlOWI5YTM0OWY0MFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgVHVlIEF1ZyA0IDE5OjM4OjU3IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdFxcbmluZGV4IDE2ZjM3MTM1ZWQ4MGQuLmIxODdkNjE4NDUyZjQgMTAwNjQ0XFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XFxuKysrIGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XFxuQEAgLTIyNCw3ICsyMjQsNyBAQCBraHVnZXBhZ2VkIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIHdoZW4gYW55IFRIUCBzaXplIGlzIGVuYWJsZWRcXG4gKGVpdGhlciBvZiB0aGUgcGVyLXNpemUgYW5vbiBjb250cm9sIG9yIHRoZSB0b3AtbGV2ZWwgY29udHJvbCBhcmUgc2V0XFxuIHRvIFxcXCJhbHdheXNcXFwiIG9yIFxcXCJtYWR2aXNlXFxcIiksIGFuZCBpdCdsbCBiZSBhdXRvbWF0aWNhbGx5IHNodXRkb3duIHdoZW5cXG4gYWxsIFRIUCBzaXplcyBhcmUgZGlzYWJsZWQgKHdoZW4gYm90aCB0aGUgcGVyLXNpemUgYW5vbiBjb250cm9sIGFuZCB0aGVcXG4tdG9wLWxldmVsIGNvbnRyb2wgYXJlIFxcXCJuZXZlclxcXCIpXFxuK3RvcC1sZXZlbCBjb250cm9sIGFyZSBcXFwibmV2ZXJcXFwiKS5cXG4gXFxuIHByb2Nlc3MgVEhQIGNvbnRyb2xzXFxuIC0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuQEAgLTMwMSw3ICszMDEsOSBAQCBiZWluZyByZXBsYWNlZCBieSBhIFBNRCBtYXBwaW5nLCBvciAoMikgcGh5c2ljYWwgcGFnZXMgcmVwbGFjZWQgYnkgb25lXFxuIGh1Z2VwYWdlIG9mIHZhcmlvdXMgc2l6ZXMgKFBNRC1zaXplZCBvciBtVEhQKS4gRWFjaCBtYXkgaGFwcGVuIGluZGVwZW5kZW50bHksXFxuIG9yIHRvZ2V0aGVyLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgbWVtb3J5IGFuZCB0aGUgZmFpbHVyZXMgdGhhdCBvY2N1ci5cXG4gQXMgc3VjaCwgdGhpcyB2YWx1ZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgcm91Z2hseSBhcyBhIHNpZ24gb2YgcHJvZ3Jlc3MsXFxuLWFuZCBjb3VudGVycyBpbiAvcHJvYy92bXN0YXQgY29uc3VsdGVkIGZvciBtb3JlIGFjY3VyYXRlIGFjY291bnRpbmcpOjpcXG4rYW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZy5cXG4rUGVyLW9yZGVyIG1USFAgY29sbGFwc2Ugc3RhdGlzdGljcyBhcmUgYWxzbyBhdmFpbGFibGUgdW5kZXJcXG4rL3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2UvaHVnZXBhZ2VzLVxcdTAwM2NzaXplXFx1MDAzZWtCL3N0YXRzLyk6OlxcbiBcXG4gXFx0L3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2Uva2h1Z2VwYWdlZC9wYWdlc19jb2xsYXBzZWRcXG4gXFxuZGlmZiAtLWdpdCBhL21tL2todWdlcGFnZWQuYyBiL21tL2todWdlcGFnZWQuY1xcbmluZGV4IGIyMzdmNmU3NjYyYTUuLjMzMzhlOWRjMTFkZDAgMTAwNjQ0XFxuLS0tIGEvbW0va2h1Z2VwYWdlZC5jXFxuKysrIGIvbW0va2h1Z2VwYWdlZC5jXFxuQEAgLTY1LDYgKzY1LDEyIEBAIGVudW0gc2Nhbl9yZXN1bHQge1xcbiBcXHRTQ0FOX1BBR0VfRElSVFlfT1JfV1JJVEVCQUNLLFxcbiB9O1xcbiBcXG4rZW51bSBwdGVfY2hlY2tfcmVzdWx0IHtcXG4rXFx0UFRFX0NIRUNLX1NVQ0NFRUQsXFxuK1xcdFBURV9DSEVDS19GQUlMLFxcbitcXHRQVEVfQ0hFQ0tfQ09OVElOVUUsXFxuK307XFxuK1xcbiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFNcXG4gI2luY2x1ZGUgXFx1MDAzY3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oXFx1MDAzZVxcbiBcXG5AQCAtMTE5LDYgKzEyNSwyMCBAQCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCB7XFxuIFxcdERFQ0xBUkVfQklUTUFQKG10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcXG4gfTtcXG4gXFxuK3N0cnVjdCBwdGVfY2hlY2tfY29udGV4dCB7XFxuK1xcdHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYztcXG4rXFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7XFxuK1xcdHVuc2lnbmVkIGludCBvcmRlcjtcXG4rXFx0c3RydWN0IGZvbGlvICpmb2xpbztcXG4rXFx0aW50IG5vbmVfb3JfemVybztcXG4rXFx0aW50IHNoYXJlZDtcXG4rXFx0aW50IHVubWFwcGVkO1xcbitcXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdDtcXG4rXFx0dW5zaWduZWQgaW50IG1heF9wdGVzX25vbmU7XFxuK1xcdHVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwO1xcbitcXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc2hhcmVkO1xcbit9O1xcbitcXG4gLyoqXFxuICAqIHN0cnVjdCBraHVnZXBhZ2VkX3NjYW4gLSBjdXJzb3IgZm9yIHNjYW5uaW5nXFxuICAqIEBtbV9oZWFkOiB0aGUgaGVhZCBvZiB0aGUgbW0gbGlzdCB0byBzY2FuXFxuQEAgLTYyMCw3ICs2NDAsNyBAQCB2b2lkIF9fa2h1Z2VwYWdlZF9leGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxcbiBcXHRcXHQvKlxcbiBcXHRcXHQgKiBUaGlzIGlzIHJlcXVpcmVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0XFxuIFxcdFxcdCAqIGNvbGxhcHNlX3Rlc3RfZXhpdCgpICh3aGljaCBpcyBndWFyYW50ZWVkIHRvIHJ1blxcbi1cXHRcXHQgKiB1bmRlciBtbWFwIHNlbSByZWFkIG1vZGUpLiBTdG9wIGhlcmUgKGFmdGVyIHdlIHJldHVybiBhbGxcXG4rXFx0XFx0ICogdW5kZXIgbW1hcF9sb2NrIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbFxcbiBcXHRcXHQgKiBwYWdldGFibGVzIHdpbGwgYmUgZGVzdHJveWVkKSB1bnRpbCBraHVnZXBhZ2VkIGhhcyBmaW5pc2hlZFxcbiBcXHRcXHQgKiB3b3JraW5nIG9uIHRoZSBwYWdldGFibGVzIHVuZGVyIHRoZSBtbWFwX2xvY2suXFxuIFxcdFxcdCAqL1xcbkBAIC02MjksNiArNjQ5LDEzIEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pXFxuIFxcdH1cXG4gfVxcbiBcXG4rc3RhdGljIHZvaWQgY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKVxcbit7XFxuK1xcdG1lbXNldChjYy1cXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXFx1MDAzZW5vZGVfbG9hZCkpO1xcbitcXHRub2Rlc19jbGVhcihjYy1cXHUwMDNlYWxsb2Nfbm1hc2spO1xcbitcXHRiaXRtYXBfemVybyhjYy1cXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpO1xcbit9XFxuK1xcbiBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiB7XFxuIFxcdG5vZGVfc3RhdF9tb2RfZm9saW8oZm9saW8sXFxuQEAgLTY2NSw3NiArNjkyLDE1NiBAQCBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9wYWdlcyhwdGVfdCAqcHRlLCBwdGVfdCAqX3B0ZSxcXG4gXFx0fVxcbiB9XFxuIFxcbisvKlxcbisgKiBwdGVfaXNfcmVmZXJlbmNlZCgpIC0gQ2hlY2sgZm9yIGVub3VnaCByZWZlcmVuY2VkIFBURXMgdG8ganVzdGlmeSBjb2xsYXBzaW5nXFxuKyAqXFxuKyAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGUgcGFnZSBoYXMgYmVlblxcbisgKiByZWNlbnRseSBhY2Nlc3NlZCAoeW91bmcgcHRlKSB0byBqdXN0aWZ5IGNvbGxhcHNpbmcgdGhlIHBhZ2UuXFxuKyAqXFxuKyAqIFJldHVybjogdHJ1ZSBpZiB0aGUgcGFnZSBoYXMgYmVlbiByZWNlbnRseSBhY2Nlc3NlZC5cXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBwdGVfaXNfcmVmZXJlbmNlZChzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsIHB0ZV90IHB0ZXZhbCxcXG4rXFx0c3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcilcXG4re1xcbitcXHRyZXR1cm4gY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fFxcbitcXHRcXHRmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XFxuK1xcdFxcdG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS1cXHUwMDNldm1fbW0sIGFkZHIpKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY291bnRfY29sbGFwc2VfZXZlbnQodW5zaWduZWQgaW50IG9yZGVyLCBlbnVtIHZtX2V2ZW50X2l0ZW0gdm1fZXZlbnQsXFxuK1xcdFxcdGVudW0gbXRocF9zdGF0X2l0ZW0gbXRocF9ldmVudClcXG4re1xcbitcXHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcXG4rXFx0XFx0Y291bnRfdm1fZXZlbnQodm1fZXZlbnQpO1xcbitcXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIG10aHBfZXZlbnQpO1xcbit9XFxuK1xcbisvKlxcbisgKiBwdGVfY2hlY2tfZmFpbCgpIC0gQSBzaW1wbGUgaGVscGVyIHRvIHNldCB0aGUgcHRlX2NoZWNrX2NvbnRleHQgcmVzdWx0IGFuZFxcbisgKiByZXR1cm4gUFRFX0NIRUNLX0ZBSUwuXFxuKyAqL1xcbitzdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVja19mYWlsKHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCAqY3R4LFxcbitcXHRcXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdClcXG4re1xcbitcXHRjdHgtXFx1MDAzZXJlc3VsdCA9IHJlc3VsdDtcXG4rXFx0cmV0dXJuIFBURV9DSEVDS19GQUlMO1xcbit9XFxuK1xcbisvKlxcbisgKiBjb2xsYXBzZV9jaGVja19wdGUoKSAtIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZVxcbisgKlxcbisgKiBDaGVjayBpZiBhIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2UgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjcml0ZXJpYTpcXG4rICogLSBtYXhfcHRlXyogdmFsdWVzIGFyZSBub3QgZXhjZWVkZWRcXG4rICogLSB1ZmZkIGlzIG5vdCBhY3RpdmVcXG4rICogLSBsYXp5ZnJlZSBwcm9wZXJ0aWVzIGFyZSBub3QgcHJlc2VudFxcbisgKiAtIG9ubHkgYW5vbnltb3VzIHBhZ2VzIGFyZSBwcmVzZW50XFxuKyAqXFxuKyAqIGEgaGVscGVyIHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCBpcyB1c2VkIHRvIHBhc3MgYW5kIHN0b3JlIHJlbGV2YW50XFxuKyAqIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIGNvbGxhcHNlX2NoZWNrX3B0ZSgpIGZ1bmN0aW9uIGFuZCB0aGUgY2FsbGVyLlxcbisgKlxcbisgKiBSZXR1cm46IFBURV9DSEVDS19TVUNDRUVEIGlmIHRoZSBQVEUgaXMgc3VpdGFibGUgZm9yIGNvbGxhcHNlLFxcbisgKiAgICAgICAgIFBURV9DSEVDS19GQUlMIGlmIHRoZSBQVEUgaXMgbm90IHN1aXRhYmxlIGZvciBjb2xsYXBzZSxcXG4rICogICAgICAgICBQVEVfQ0hFQ0tfQ09OVElOVUUgaWYgdGhlIHNjYW4gc2hvdWxkIGNvbnRpbnVlIHRvIGNoZWNrIHRoZSBuZXh0IFBURS5cXG4rICovXFxuK3N0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgKmN0eClcXG4re1xcbitcXHRpZiAocHRlX25vbmVfb3JfemVybyhwdGV2YWwpKSB7XFxuK1xcdFxcdGlmICgrK2N0eC1cXHUwMDNlbm9uZV9vcl96ZXJvIFxcdTAwM2UgY3R4LVxcdTAwM2VtYXhfcHRlc19ub25lKSB7XFxuK1xcdFxcdFxcdGNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC1cXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xcbitcXHRcXHRcXHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9OT05FX1BURSk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0cmV0dXJuIFBURV9DSEVDS19DT05USU5VRTtcXG4rXFx0fVxcbitcXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcXG4rXFx0XFx0aWYgKGN0eC1cXHUwMDNldW5tYXBwZWQgPT0gLTEpXFxuK1xcdFxcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX05PTl9QUkVTRU5UKTtcXG4rXFx0XFx0aWYgKCsrY3R4LVxcdTAwM2V1bm1hcHBlZCBcXHUwMDNlIGN0eC1cXHUwMDNlbWF4X3B0ZXNfc3dhcCkge1xcbitcXHRcXHRcXHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXFx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgTVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTtcXG4rXFx0XFx0XFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfU1dBUF9QVEUpO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbCkpXFxuK1xcdFxcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xcbitcXHRcXHRyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFO1xcbitcXHR9XFxuK1xcdC8qXFxuK1xcdCAqIERvbid0IGNvbGxhcHNlIGlmIGFueSBvZiB0aGUgc21hbGwgUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkXFxuK1xcdCAqIHdyaXRlIHByb3RlY3Rpb24uIE1hcmtpbmcgdGhlIG5ldyBodWdlIHBtZCBhcyB3cml0ZSBwcm90ZWN0ZWRcXG4rXFx0ICogY291bGQgYnJpbmcgdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbCBvdXRzaWRlIG9mIHRoZVxcbitcXHQgKiByZWdpc3RlcmVkIHJhbmdlLlxcbitcXHQgKi9cXG4rXFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpXFxuK1xcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xcbitcXG4rXFx0Y3R4LVxcdTAwM2Vmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyhjdHgtXFx1MDAzZXZtYSwgYWRkciwgcHRldmFsKTtcXG4rXFx0aWYgKHVubGlrZWx5KCFjdHgtXFx1MDAzZWZvbGlvKSB8fCB1bmxpa2VseShmb2xpb19pc196b25lX2RldmljZShjdHgtXFx1MDAzZWZvbGlvKSkpXFxuK1xcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9OVUxMKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcXG4rXFx0ICogcHJlc2VydmUgdGhlIGxhenlmcmVlIHByb3BlcnR5IHdpdGhvdXQgbmVlZGluZyB0byBza2lwLlxcbitcXHQgKi9cXG4rXFx0aWYgKGN0eC1cXHUwMDNlY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgXFx1MDAyNlxcdTAwMjYgIShjdHgtXFx1MDAzZXZtYS1cXHUwMDNldm1fZmxhZ3MgXFx1MDAyNiBWTV9EUk9QUEFCTEUpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBmb2xpb190ZXN0X2xhenlmcmVlKGN0eC1cXHUwMDNlZm9saW8pIFxcdTAwMjZcXHUwMDI2ICFwdGVfZGlydHkocHRldmFsKSlcXG4rXFx0XFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0xBWllGUkVFKTtcXG4rXFxuK1xcdGlmICghZm9saW9fdGVzdF9hbm9uKGN0eC1cXHUwMDNlZm9saW8pKSB7XFxuK1xcdFxcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihjdHgtXFx1MDAzZWZvbGlvKSwgY3R4LVxcdTAwM2Vmb2xpbyk7XFxuK1xcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9BTk9OKTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoY3R4LVxcdTAwM2Vmb2xpbykpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVE9ETzogU3VwcG9ydCBzaGFyZWQgcGFnZXMgd2l0aG91dCBsZWFkaW5nIHRvIGZ1cnRoZXJcXG4rXFx0XFx0ICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhXFxuK1xcdFxcdCAqIHNoYXJlZCBtYXkgY2F1c2UgYSBmdXR1cmUgaGlnaGVyIG9yZGVyIGNvbGxhcHNlIG9uIGFcXG4rXFx0XFx0ICogcmVzY2FuIG9mIHRoZSBzYW1lIHJhbmdlLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKCsrY3R4LVxcdTAwM2VzaGFyZWQgXFx1MDAzZSBjdHgtXFx1MDAzZW1heF9wdGVzX3NoYXJlZCkge1xcbitcXHRcXHRcXHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXFx1MDAzZW9yZGVyLCBUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NIQVJFRCk7XFxuK1xcdFxcdFxcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiBQVEVfQ0hFQ0tfU1VDQ0VFRDtcXG4rfVxcbitcXG4gc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0dW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBwdGVfdCAqcHRlLCBzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MsXFxuIFxcdFxcdHVuc2lnbmVkIGludCBvcmRlciwgc3RydWN0IGxpc3RfaGVhZCAqY29tcG91bmRfcGFnZWxpc3QpXFxuIHtcXG4tXFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKTtcXG4tXFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpO1xcbiBcXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFxcdTAwM2NcXHUwMDNjIG9yZGVyO1xcbi1cXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7XFxuIFxcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMO1xcbiBcXHR1bnNpZ25lZCBsb25nIGFkZHIgPSBzdGFydF9hZGRyO1xcbi1cXHRwdGVfdCAqX3B0ZTtcXG4tXFx0aW50IG5vbmVfb3JfemVybyA9IDAsIHNoYXJlZCA9IDAsIHJlZmVyZW5jZWQgPSAwO1xcbitcXHRwdGVfdCAqX3B0ZSwgcHRldmFsO1xcbitcXHRpbnQgcmVmZXJlbmNlZCA9IDA7XFxuIFxcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xcbitcXHRlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrO1xcbitcXHRzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0ge1xcbitcXHRcXHQuY2MgPSBjYyxcXG4rXFx0XFx0LnZtYSA9IHZtYSxcXG4rXFx0XFx0Lm9yZGVyID0gb3JkZXIsXFxuK1xcdFxcdC51bm1hcHBlZCA9IC0xLCAvKiBkb24ndCBjaGVjayBzd2FwIFBURXMgKi9cXG4rXFx0XFx0Lm1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKSxcXG4rXFx0XFx0Lm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpLFxcbitcXHR9O1xcbiBcXG4gXFx0Zm9yIChfcHRlID0gcHRlOyBfcHRlIFxcdTAwM2MgcHRlICsgbnJfcGFnZXM7XFxuIFxcdCAgICAgX3B0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSkge1xcbi1cXHRcXHRwdGVfdCBwdGV2YWwgPSBwdGVwX2dldChfcHRlKTtcXG4tXFx0XFx0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xcbi1cXHRcXHRcXHRpZiAoKytub25lX29yX3plcm8gXFx1MDAzZSBtYXhfcHRlc19ub25lKSB7XFxuLVxcdFxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFO1xcbi1cXHRcXHRcXHRcXHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcXG4tXFx0XFx0XFx0XFx0XFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTtcXG4tXFx0XFx0XFx0XFx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xcbi1cXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0XFx0fVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0fVxcbi1cXHRcXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QVEVfTk9OX1BSRVNFTlQ7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHR9XFxuLVxcdFxcdGlmIChwdGVfdWZmZChwdGV2YWwpKSB7XFxuLVxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHR9XFxuLVxcdFxcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7XFxuLVxcdFxcdGlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHtcXG4tXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QQUdFX05VTEw7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHR9XFxuLVxcbi1cXHRcXHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XFxuLVxcdFxcdFZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSwgZm9saW8pO1xcbi1cXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogSWYgdGhlIHZtYSBoYXMgdGhlIFZNX0RST1BQQUJMRSBmbGFnLCB0aGUgY29sbGFwc2Ugd2lsbFxcbi1cXHRcXHQgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRpZiAoY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgXFx1MDAyNlxcdTAwMjYgISh2bWEtXFx1MDAzZXZtX2ZsYWdzIFxcdTAwMjYgVk1fRFJPUFBBQkxFKSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHQgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShmb2xpbykgXFx1MDAyNlxcdTAwMjYgIXB0ZV9kaXJ0eShwdGV2YWwpKSB7XFxuLVxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUEFHRV9MQVpZRlJFRTtcXG4rXFx0XFx0cHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7XFxuK1xcdFxcdHB0ZV9jaGVjayA9IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGV2YWwsIGFkZHIsIFxcdTAwMjZjdHgpO1xcbitcXHRcXHRmb2xpbyA9IGN0eC5mb2xpbztcXG4rXFx0XFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkge1xcbitcXHRcXHRcXHRyZXN1bHQgPSBjdHgucmVzdWx0O1xcbiBcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0fVxcbitcXHRcXHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuIFxcbi1cXHRcXHQvKiBTZWUgY29sbGFwc2Vfc2Nhbl9wbWQoKS4gKi9cXG4tXFx0XFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7XFxuLVxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdCAqIFRPRE86IFN1cHBvcnQgc2hhcmVkIHBhZ2VzIHdpdGhvdXQgbGVhZGluZyB0byBmdXJ0aGVyXFxuLVxcdFxcdFxcdCAqIG1USFAgY29sbGFwc2VzLiBDdXJyZW50bHkgYnJpbmdpbmcgaW4gbmV3IHBhZ2VzIHZpYVxcbi1cXHRcXHRcXHQgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhXFxuLVxcdFxcdFxcdCAqIHJlc2NhbiBvZiB0aGUgc2FtZSByYW5nZS5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGlmICgrK3NoYXJlZCBcXHUwMDNlIG1heF9wdGVzX3NoYXJlZCkge1xcbi1cXHRcXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFO1xcbi1cXHRcXHRcXHRcXHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcXG4tXFx0XFx0XFx0XFx0XFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NIQVJFRF9QVEUpO1xcbi1cXHRcXHRcXHRcXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcXG4tXFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0fVxcbiBcXHRcXHQvKlxcbiBcXHRcXHQgKiBUT0RPOiBJbiBzb21lIGNhc2VzIG9mIHBhcnRpYWxseS1tYXBwZWQgZm9saW9zLCB3ZSdkIGFjdHVhbGx5XFxuIFxcdFxcdCAqIHdhbnQgdG8gY29sbGFwc2UuXFxuQEAgLTc1OSw4ICs4NjYsOCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogV2UgY2FuIGRvIGl0IGJlZm9yZSBmb2xpb19pc29sYXRlX2xydSBiZWNhdXNlIHRoZVxcbi1cXHRcXHQgKiBmb2xpbyBjYW4ndCBiZSBmcmVlZCBmcm9tIHVuZGVyIHVzLiBOT1RFOiBQR19sb2NrXFxuLVxcdFxcdCAqIGlzIG5lZWRlZCB0byBzZXJpYWxpemUgYWdhaW5zdCBzcGxpdF9odWdlX3BhZ2VcXG4rXFx0XFx0ICogZm9saW8gY2FuJ3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogZm9saW8gbG9ja1xcbitcXHRcXHQgKiBpcyBuZWVkZWQgdG8gc2VyaWFsaXplIGFnYWluc3Qgc3BsaXRfaHVnZV9wYWdlKClcXG4gXFx0XFx0ICogd2hlbiBpbnZva2VkIGZyb20gdGhlIFZNLlxcbiBcXHRcXHQgKi9cXG4gXFx0XFx0aWYgKCFmb2xpb190cnlsb2NrKGZvbGlvKSkge1xcbkBAIC03ODYsNyArODkzLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0fVxcbiBcXG4gXFx0XFx0LypcXG4tXFx0XFx0ICogSXNvbGF0ZSB0aGUgcGFnZSB0byBhdm9pZCBjb2xsYXBzaW5nIGFuIGh1Z2VwYWdlXFxuK1xcdFxcdCAqIElzb2xhdGUgdGhlIGZvbGlvIHRvIGF2b2lkIGNvbGxhcHNpbmcgYSBodWdlcGFnZVxcbiBcXHRcXHQgKiBjdXJyZW50bHkgaW4gdXNlIGJ5IHRoZSBWTS5cXG4gXFx0XFx0ICovXFxuIFxcdFxcdGlmICghZm9saW9faXNvbGF0ZV9scnUoZm9saW8pKSB7XFxuQEAgLTgwMywxNCArOTEwLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxcbiBcXHRcXHRcXHRsaXN0X2FkZF90YWlsKFxcdTAwMjZmb2xpby1cXHUwMDNlbHJ1LCBjb21wb3VuZF9wYWdlbGlzdCk7XFxuIG5leHQ6XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpc1xcbi1cXHRcXHQgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZVxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdCAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcXG4tXFx0XFx0ICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XFxuLVxcdFxcdCAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVxcdTAwM2V2bV9tbSwgYWRkcikpKVxcbitcXHRcXHRpZiAocHRlX2lzX3JlZmVyZW5jZWQoY2MsIHB0ZXZhbCwgZm9saW8sIHZtYSwgYWRkcikpXFxuIFxcdFxcdFxcdHJlZmVyZW5jZWQrKztcXG4gXFx0fVxcbiBcXG5AQCAtODE4LDEzICs5MTgsMTMgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0cmVzdWx0ID0gU0NBTl9MQUNLX1JFRkVSRU5DRURfUEFHRTtcXG4gXFx0fSBlbHNlIHtcXG4gXFx0XFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xcbi1cXHRcXHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgbm9uZV9vcl96ZXJvLFxcbitcXHRcXHR0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShmb2xpbywgY3R4Lm5vbmVfb3JfemVybyxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0ICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpO1xcbiBcXHRcXHRyZXR1cm4gcmVzdWx0O1xcbiBcXHR9XFxuIG91dDpcXG4gXFx0cmVsZWFzZV9wdGVfcGFnZXMocHRlLCBfcHRlLCBjb21wb3VuZF9wYWdlbGlzdCk7XFxuLVxcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBub25lX29yX3plcm8sXFxuK1xcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgcmVmZXJlbmNlZCwgcmVzdWx0LCBvcmRlcik7XFxuIFxcdHJldHVybiByZXN1bHQ7XFxuIH1cXG5AQCAtOTA0LDcgKzEwMDQsNyBAQCBzdGF0aWMgdm9pZCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5X2ZhaWxlZChwdGVfdCAqcHRlLFxcbiBcXHQgKiBSZS1lc3RhYmxpc2ggdGhlIFBNRCB0byBwb2ludCB0byB0aGUgb3JpZ2luYWwgcGFnZSB0YWJsZVxcbiBcXHQgKiBlbnRyeS4gUmVzdG9yaW5nIFBNRCBuZWVkcyB0byBiZSBkb25lIHByaW9yIHRvIHJlbGVhc2luZ1xcbiBcXHQgKiBwYWdlcy4gU2luY2UgcGFnZXMgYXJlIHN0aWxsIGlzb2xhdGVkIGFuZCBsb2NrZWQgaGVyZSxcXG4tXFx0ICogYWNxdWlyaW5nIGFub25fdm1hX2xvY2tfd3JpdGUgaXMgdW5uZWNlc3NhcnkuXFxuK1xcdCAqIGFjcXVpcmluZyBhbm9uX3ZtYV9sb2NrX3dyaXRlKCkgaXMgdW5uZWNlc3NhcnkuXFxuIFxcdCAqL1xcbiBcXHRwbWRfcHRsID0gcG1kX2xvY2sodm1hLVxcdTAwM2V2bV9tbSwgcG1kKTtcXG4gXFx0cG1kX3BvcHVsYXRlKHZtYS1cXHUwMDNldm1fbW0sIHBtZCwgcG1kX3BndGFibGUob3JpZ19wbWQpKTtcXG5AQCAtMTA3OCw5ICsxMTc4LDkgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxcXG4gXFx0XFx0cmV0dXJuIFNDQU5fVk1BX0NIRUNLO1xcbiBcXHQvKlxcbiBcXHQgKiBBbm9uIFZNQSBleHBlY3RlZCwgdGhlIGFkZHJlc3MgbWF5IGJlIHVubWFwcGVkIHRoZW5cXG4tXFx0ICogcmVtYXBwZWQgdG8gZmlsZSBhZnRlciBraHVnZXBhZ2VkIHJlYXF1aXJlZCB0aGUgbW1hcF9sb2NrLlxcbitcXHQgKiByZW1hcHBlZCB0byBmaWxlIGFmdGVyIGtodWdlcGFnZWQgcmVhY3F1aXJlZCB0aGUgbW1hcF9sb2NrLlxcbiBcXHQgKlxcbi1cXHQgKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMgbWF5IHJldHVybiB0cnVlIGZvciBxdWFsaWZpZWQgZmlsZVxcbitcXHQgKiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoKSBtYXkgcmV0dXJuIHRydWUgZm9yIHF1YWxpZmllZCBmaWxlXFxuIFxcdCAqIHZtYXMuXFxuIFxcdCAqL1xcbiBcXHRpZiAoZXhwZWN0X2Fub24gXFx1MDAyNlxcdTAwMjYgKCEoKnZtYXApLVxcdTAwM2Vhbm9uX3ZtYSB8fCAhdm1hX2lzX2Fub255bW91cygqdm1hcCkpKVxcbkBAIC0xMTM2LDcgKzEyMzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjaGVja19wbWRfc3RpbGxfdmFsaWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIFxcbiAvKlxcbiAgKiBCcmluZyBtaXNzaW5nIHBhZ2VzIGluIGZyb20gc3dhcCwgdG8gY29tcGxldGUgVEhQIGNvbGxhcHNlLlxcbi0gKiBPbmx5IGRvbmUgaWYga2h1Z2VwYWdlZF9zY2FuX3BtZCBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLlxcbisgKiBPbmx5IGRvbmUgaWYgY29sbGFwc2Vfc2Nhbl9wbWQoKSBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLlxcbiAgKlxcbiAgKiBGb3IgbVRIUCBvcmRlcnMgdGhlIGZ1bmN0aW9uIGJhaWxzIG9uIHRoZSBmaXJzdCBzd2FwIGVudHJ5LCBiZWNhdXNlXFxuICAqIGZhdWx0aW5nIHBhZ2VzIGJhY2sgaW4gZHVyaW5nIGNvbGxhcHNlIGNvdWxkIHJlLXBvcHVsYXRlIFBURXMgdGhhdFxcbkBAIC0xMjA0LDcgKzEzMDQsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4oc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIFxcdFxcdHB0ZSA9IE5VTEw7XFxuIFxcbiBcXHRcXHQvKlxcbi1cXHRcXHQgKiBkb19zd2FwX3BhZ2UgcmV0dXJucyBWTV9GQVVMVF9SRVRSWSB3aXRoIHJlbGVhc2VkIG1tYXBfbG9jay5cXG4rXFx0XFx0ICogZG9fc3dhcF9wYWdlKCkgcmV0dXJucyBWTV9GQVVMVF9SRVRSWSB3aXRoIHJlbGVhc2VkIG1tYXBfbG9jay5cXG4gXFx0XFx0ICogTm90ZSB3ZSB0cmVhdCBWTV9GQVVMVF9SRVRSWSBhcyBWTV9GQVVMVF9FUlJPUiBoZXJlIGJlY2F1c2VcXG4gXFx0XFx0ICogd2UgZG8gbm90IHJldHJ5IGhlcmUgYW5kIHN3YXAgZW50cnkgd2lsbCByZW1haW4gaW4gcGFnZXRhYmxlXFxuIFxcdFxcdCAqIHJlc3VsdGluZyBpbiBsYXRlciBmYWlsdXJlLlxcbkBAIC0xMjQ3LDE1ICsxMzQ3LDEyIEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGFsbG9jX2NoYXJnZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKipmb2xpb3AsIHN0cnVjdCBtbV9zdHJ1XFxuIFxcdGZvbGlvID0gX19mb2xpb19hbGxvYyhnZnAsIG9yZGVyLCBub2RlLCBcXHUwMDI2Y2MtXFx1MDAzZWFsbG9jX25tYXNrKTtcXG4gXFx0aWYgKCFmb2xpbykge1xcbiBcXHRcXHQqZm9saW9wID0gTlVMTDtcXG4tXFx0XFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXFxuLVxcdFxcdFxcdGNvdW50X3ZtX2V2ZW50KFRIUF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xcbi1cXHRcXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xcbitcXHRcXHRjb3VudF9jb2xsYXBzZV9ldmVudChvcmRlciwgVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCxcXG4rXFx0XFx0XFx0XFx0ICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTtcXG4gXFx0XFx0cmV0dXJuIFNDQU5fQUxMT0NfSFVHRV9QQUdFX0ZBSUw7XFxuIFxcdH1cXG4gXFxuLVxcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxcbi1cXHRcXHRjb3VudF92bV9ldmVudChUSFBfQ09MTEFQU0VfQUxMT0MpO1xcbi1cXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQyk7XFxuK1xcdGNvdW50X2NvbGxhcHNlX2V2ZW50KG9yZGVyLCBUSFBfQ09MTEFQU0VfQUxMT0MsIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQyk7XFxuIFxcbiBcXHRpZiAodW5saWtlbHkobWVtX2Nncm91cF9jaGFyZ2UoZm9saW8sIG1tLCBnZnApKSkge1xcbiBcXHRcXHRmb2xpb19wdXQoZm9saW8pO1xcbkBAIC0xMjcxLDcgKzEzNjgsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydVxcbiB9XFxuIFxcbiAvKlxcbi0gKiBjb2xsYXBzZV9odWdlX3BhZ2UgZXhwZWN0cyB0aGUgbW1hcF9sb2NrIHRvIGJlIHVubG9ja2VkIGJlZm9yZSBlbnRlcmluZyBhbmRcXG4rICogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbW1hcF9sb2NrIHRvIGJlIHVubG9ja2VkIGJlZm9yZSBlbnRlcmluZyBhbmRcXG4gICogd2lsbCBhbHdheXMgcmV0dXJuIHdpdGggdGhlIGxvY2sgdW5sb2NrZWQsIHRvIGF2b2lkIGhvbGRpbmcgdGhlIG1tYXBfbG9ja1xcbiAgKiB3aGlsZSBhbGxvY2F0aW5nIGEgVEhQLCBhcyB0aGF0IGNvdWxkIHRyaWdnZXIgZGlyZWN0IHJlY2xhaW0vY29tcGFjdGlvbi5cXG4gICogTm90ZSB0aGF0IHRoZSBWTUEgbXVzdCBiZSByZWNoZWNrZWQgYWZ0ZXIgZ3JhYmJpbmcgdGhlIG1tYXBfbG9jayBhZ2Fpbi5cXG5AQCAtMTMxOCw3ICsxNDE1LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2VfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHNcXG4gXFxuIFxcdGlmICh1bm1hcHBlZCkge1xcbiBcXHRcXHQvKlxcbi1cXHRcXHQgKiBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9zd2FwaW4gd2lsbCByZXR1cm4gd2l0aCBtbWFwX2xvY2tcXG4rXFx0XFx0ICogX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKCkgd2lsbCByZXR1cm4gd2l0aCBtbWFwX2xvY2tcXG4gXFx0XFx0ICogcmVsZWFzZWQgd2hlbiBpdCBmYWlscy4gU28gd2UganVtcCBvdXRfbm9sb2NrIGRpcmVjdGx5IGluXFxuIFxcdFxcdCAqIHRoYXQgY2FzZS4gIENvbnRpbnVpbmcgdG8gY29sbGFwc2UgY2F1c2VzIGluY29uc2lzdGVuY3kuXFxuIFxcdFxcdCAqL1xcbkBAIC0xMzMxLDggKzE0MjgsOCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xcbiBcXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcXG4gXFx0LypcXG4gXFx0ICogUHJldmVudCBhbGwgYWNjZXNzIHRvIHBhZ2V0YWJsZXMgd2l0aCB0aGUgZXhjZXB0aW9uIG9mXFxuLVxcdCAqIGd1cF9mYXN0IGxhdGVyIGhhbmRsZWQgYnkgdGhlIHB0ZXBfY2xlYXJfZmx1c2ggYW5kIHRoZSBWTVxcbi1cXHQgKiBoYW5kbGVkIGJ5IHRoZSBhbm9uX3ZtYSBsb2NrICsgUEdfbG9jay5cXG4rXFx0ICogZ3VwX2Zhc3QgbGF0ZXIgaGFuZGxlZCBieSB0aGUgcG1kcF9jb2xsYXBzZV9mbHVzaCgpIGFuZCB0aGUgVk1cXG4rXFx0ICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayArIGZvbGlvIGxvY2suXFxuIFxcdCAqXFxuIFxcdCAqIFVGRkRJT19NT1ZFIGlzIHByZXZlbnRlZCB0byByYWNlIGFzIHdlbGwgdGhhbmtzIHRvIHRoZVxcbiBcXHQgKiBtbWFwX2xvY2suXFxuQEAgLTEzODksOSArMTQ4Niw5IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXFxuIFxcdFxcdHNwaW5fbG9jayhwbWRfcHRsKTtcXG4gXFx0XFx0Vk1fV0FSTl9PTl9PTkNFKCFwbWRfbm9uZSgqcG1kKSk7XFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIFdlIGNhbiBvbmx5IHVzZSBzZXRfcG1kX2F0IHdoZW4gZXN0YWJsaXNoaW5nXFxuK1xcdFxcdCAqIFdlIGNhbiBvbmx5IHVzZSBzZXRfcG1kX2F0KCkgd2hlbiBlc3RhYmxpc2hpbmdcXG4gXFx0XFx0ICogaHVnZXBtZHMgYW5kIG5ldmVyIGZvciBlc3RhYmxpc2hpbmcgcmVndWxhciBwbWRzIHRoYXRcXG4tXFx0XFx0ICogcG9pbnRzIHRvIHJlZ3VsYXIgcGFnZXRhYmxlcy4gVXNlIHBtZF9wb3B1bGF0ZSBmb3IgdGhhdFxcbitcXHRcXHQgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlKCkgZm9yIHRoYXRcXG4gXFx0XFx0ICovXFxuIFxcdFxcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwbWRfcGd0YWJsZShfcG1kKSk7XFxuIFxcdFxcdHNwaW5fdW5sb2NrKHBtZF9wdGwpO1xcbkBAIC0xNDM5LDcgKzE1MzYsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xcbiBcXHRcXHRcXHRzcGluX2xvY2tfbmVzdGVkKHB0ZV9wdGwsIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTtcXG4gXFx0XFx0cG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBtZF9wZ3RhYmxlKF9wbWQpKTtcXG4gXFx0XFx0bWFwX2Fub25fZm9saW9fcHRlX25vcGYoZm9saW8sIHB0ZSwgdm1hLCBzdGFydF9hZGRyLFxcbi1cXHRcXHRcXHRcXHRcXHQgIC8qdWZmZF93cD0qLyBmYWxzZSk7XFxuK1xcdFxcdFxcdFxcdFxcdCAgLyp1ZmZkPSovIGZhbHNlKTtcXG4gXFx0XFx0aWYgKHB0ZV9wdGwgIT0gcG1kX3B0bClcXG4gXFx0XFx0XFx0c3Bpbl91bmxvY2socHRlX3B0bCk7XFxuIFxcdH1cXG5AQCAtMTQ0OSwxMCArMTU0NiwxMCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xcbiBcXG4gXFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xcbiBvdXRfdXBfd3JpdGU6XFxuLVxcdGlmIChhbm9uX3ZtYV9sb2NrZWQpXFxuLVxcdFxcdGFub25fdm1hX3VubG9ja193cml0ZSh2bWEtXFx1MDAzZWFub25fdm1hKTtcXG4gXFx0aWYgKHB0ZSlcXG4gXFx0XFx0cHRlX3VubWFwKHB0ZSk7XFxuK1xcdGlmIChhbm9uX3ZtYV9sb2NrZWQpXFxuK1xcdFxcdGFub25fdm1hX3VubG9ja193cml0ZSh2bWEtXFx1MDAzZWFub25fdm1hKTtcXG4gXFx0bW1hcF93cml0ZV91bmxvY2sobW0pO1xcbiBvdXRfbm9sb2NrOlxcbiBcXHRpZiAoZm9saW8pXFxuQEAgLTE1OTMsNDIgKzE2OTAsNDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIFxcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsXFxuIFxcdFxcdGJvb2wgKmxvY2tfZHJvcHBlZCwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKVxcbiB7XFxuLVxcdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIEhQQUdFX1BNRF9PUkRFUik7XFxuLVxcdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zd2FwID0gY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChjYywgSFBBR0VfUE1EX09SREVSKTtcXG4tXFx0dW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIEhQQUdFX1BNRF9PUkRFUik7XFxuIFxcdGVudW0gdHZhX3R5cGUgdHZhX2ZsYWdzID0gY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgPyBUVkFfS0hVR0VQQUdFRCA6IFRWQV9GT1JDRURfQ09MTEFQU0U7XFxuIFxcdHBtZF90ICpwbWQ7XFxuIFxcdHB0ZV90ICpwdGUsICpfcHRlLCBwdGV2YWw7XFxuIFxcdGludCBpO1xcbi1cXHRpbnQgbm9uZV9vcl96ZXJvID0gMCwgc2hhcmVkID0gMCwgcmVmZXJlbmNlZCA9IDA7XFxuLVxcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xcbi1cXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7XFxuIFxcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMO1xcbitcXHRpbnQgcmVmZXJlbmNlZCA9IDA7XFxuK1xcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0ID0gU0NBTl9GQUlMO1xcbiBcXHR1bnNpZ25lZCBsb25nIGFkZHI7XFxuIFxcdHVuc2lnbmVkIGxvbmcgZW5hYmxlZF9vcmRlcnM7XFxuIFxcdHNwaW5sb2NrX3QgKnB0bDtcXG4tXFx0aW50IG5vZGUgPSBOVU1BX05PX05PREUsIHVubWFwcGVkID0gMDtcXG4rXFx0aW50IG5vZGUgPSBOVU1BX05PX05PREU7XFxuK1xcdGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2s7XFxuIFxcbiBcXHRWTV9CVUdfT04oc3RhcnRfYWRkciBcXHUwMDI2IH5IUEFHRV9QTURfTUFTSyk7XFxuIFxcbitcXHRzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0ge1xcbitcXHRcXHQuY2MgPSBjYyxcXG4rXFx0XFx0LnZtYSA9IHZtYSxcXG4rXFx0XFx0Lm9yZGVyID0gSFBBR0VfUE1EX09SREVSLFxcbitcXHRcXHQubWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKSxcXG4rXFx0XFx0Lm1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpLFxcbitcXHRcXHQubWF4X3B0ZXNfc2hhcmVkID0gY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKGNjLCBIUEFHRV9QTURfT1JERVIpLFxcbitcXHR9O1xcbitcXG4gXFx0cmVzdWx0ID0gZmluZF9wbWRfb3JfdGhwX29yX25vbmUobW0sIHN0YXJ0X2FkZHIsIFxcdTAwMjZwbWQpO1xcbiBcXHRpZiAocmVzdWx0ICE9IFNDQU5fU1VDQ0VFRCkge1xcbiBcXHRcXHRjYy1cXHUwMDNlcHJvZ3Jlc3MrKztcXG4gXFx0XFx0Z290byBvdXQ7XFxuIFxcdH1cXG4gXFxuLVxcdGJpdG1hcF96ZXJvKGNjLVxcdTAwM2VtdGhwX3ByZXNlbnRfcHRlcywgTUFYX1BUUlNfUEVSX1BURSk7XFxuLVxcdG1lbXNldChjYy1cXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXFx1MDAzZW5vZGVfbG9hZCkpO1xcbi1cXHRub2Rlc19jbGVhcihjYy1cXHUwMDNlYWxsb2Nfbm1hc2spO1xcbitcXHRjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7XFxuIFxcbiBcXHRlbmFibGVkX29yZGVycyA9IGNvbGxhcHNlX3Bvc3NpYmxlX29yZGVycyh2bWEsIHZtYS1cXHUwMDNldm1fZmxhZ3MsIHR2YV9mbGFncyk7XFxuIFxcbiBcXHQvKlxcbiBcXHQgKiBJZiBQTUQgaXMgdGhlIG9ubHkgZW5hYmxlZCBvcmRlciwgZW5mb3JjZSBtYXhfcHRlc19ub25lLCBvdGhlcndpc2VcXG4tXFx0ICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS5cXG4rXFx0ICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS4gVGhlIGJpdG1hcFxcbitcXHQgKiBpcyB0aGVuIGNoZWNrZWQgYWdhaW4gaW4gbXRocF9jb2xsYXBzZSgpIGZvciBlYWNoIGF0dGVtcHRlZCBvcmRlci5cXG4gXFx0ICovXFxuIFxcdGlmIChlbmFibGVkX29yZGVycyAhPSBCSVQoSFBBR0VfUE1EX09SREVSKSlcXG4tXFx0XFx0bWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7XFxuK1xcdFxcdGN0eC5tYXhfcHRlc19ub25lID0gS0hVR0VQQUdFRF9NQVhfUFRFU19MSU1JVDtcXG4gXFxuIFxcdHB0ZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgc3RhcnRfYWRkciwgXFx1MDAyNnB0bCk7XFxuIFxcdGlmICghcHRlKSB7XFxuQEAgLTE2NDQsODQgKzE3NDYsMTQgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIFxcbiBcXHRcXHRjYy1cXHUwMDNlcHJvZ3Jlc3MrKztcXG4gXFxuLVxcdFxcdGlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0aWYgKCsrbm9uZV9vcl96ZXJvIFxcdTAwM2UgbWF4X3B0ZXNfbm9uZSkge1xcbi1cXHRcXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9OT05FX1BURTtcXG4tXFx0XFx0XFx0XFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFKTtcXG4tXFx0XFx0XFx0XFx0Y291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUixcXG4tXFx0XFx0XFx0XFx0XFx0XFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9OT05FKTtcXG4tXFx0XFx0XFx0XFx0Z290byBvdXRfdW5tYXA7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0Y29udGludWU7XFxuLVxcdFxcdH1cXG4tXFx0XFx0aWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7XFxuLVxcdFxcdFxcdGlmICgrK3VubWFwcGVkIFxcdTAwM2UgbWF4X3B0ZXNfc3dhcCkge1xcbi1cXHRcXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TV0FQX1BURTtcXG4tXFx0XFx0XFx0XFx0Y291bnRfdm1fZXZlbnQoVEhQX1NDQU5fRVhDRUVEX1NXQVBfUFRFKTtcXG4tXFx0XFx0XFx0XFx0Y291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUixcXG4tXFx0XFx0XFx0XFx0XFx0XFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TV0FQKTtcXG4tXFx0XFx0XFx0XFx0Z290byBvdXRfdW5tYXA7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogQWx3YXlzIGJlIHN0cmljdCB3aXRoIHVmZmQtd3BcXG4tXFx0XFx0XFx0ICogZW5hYmxlZCBzd2FwIGVudHJpZXMuICBQbGVhc2Ugc2VlXFxuLVxcdFxcdFxcdCAqIGNvbW1lbnQgYmVsb3cgZm9yIHB0ZV91ZmZkKCkuXFxuLVxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRpZiAocHRlX3N3cF91ZmZkX2FueShwdGV2YWwpKSB7XFxuLVxcdFxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XFxuLVxcdFxcdFxcdFxcdGdvdG8gb3V0X3VubWFwO1xcbi1cXHRcXHRcXHR9XFxuLVxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXHRcXHR9XFxuLVxcdFxcdGlmIChwdGVfdWZmZChwdGV2YWwpKSB7XFxuLVxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdCAqIERvbid0IGNvbGxhcHNlIHRoZSBwYWdlIGlmIGFueSBvZiB0aGUgc21hbGxcXG4tXFx0XFx0XFx0ICogUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkIHdyaXRlIHByb3RlY3Rpb24uXFxuLVxcdFxcdFxcdCAqIEhlcmUgd2UgY2FuIGFsc28gbWFyayB0aGUgbmV3IGh1Z2UgcG1kIGFzXFxuLVxcdFxcdFxcdCAqIHdyaXRlIHByb3RlY3RlZCBpZiBhbnkgb2YgdGhlIHNtYWxsIG9uZXMgaXNcXG4tXFx0XFx0XFx0ICogbWFya2VkIGJ1dCB0aGF0IGNvdWxkIGJyaW5nIHVua25vd25cXG4tXFx0XFx0XFx0ICogdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbHMgb3V0c2lkZSBvZlxcbi1cXHRcXHRcXHQgKiB0aGUgcmVnaXN0ZXJlZCByYW5nZS4gIFNvLCBqdXN0IGJlIHNpbXBsZS5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XFxuLVxcdFxcdFxcdGdvdG8gb3V0X3VubWFwO1xcbi1cXHRcXHR9XFxuLVxcbi1cXHRcXHRwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGV2YWwpO1xcbi1cXHRcXHRpZiAodW5saWtlbHkoIXBhZ2UpIHx8IHVubGlrZWx5KGlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSkpKSB7XFxuLVxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMO1xcbi1cXHRcXHRcXHRnb3RvIG91dF91bm1hcDtcXG4tXFx0XFx0fVxcbi1cXHRcXHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XFxuLVxcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsXFxuLVxcdFxcdCAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdGlmIChjYy1cXHUwMDNlaXNfa2h1Z2VwYWdlZCBcXHUwMDI2XFx1MDAyNiAhKHZtYS1cXHUwMDNldm1fZmxhZ3MgXFx1MDAyNiBWTV9EUk9QUEFCTEUpIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdCAgICBmb2xpb190ZXN0X2xhenlmcmVlKGZvbGlvKSBcXHUwMDI2XFx1MDAyNiAhcHRlX2RpcnR5KHB0ZXZhbCkpIHtcXG4tXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QQUdFX0xBWllGUkVFO1xcbitcXHRcXHRwdGVfY2hlY2sgPSBjb2xsYXBzZV9jaGVja19wdGUocHRldmFsLCBhZGRyLCBcXHUwMDI2Y3R4KTtcXG4rXFx0XFx0Zm9saW8gPSBjdHguZm9saW87XFxuK1xcdFxcdGlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0ZBSUwpIHtcXG4rXFx0XFx0XFx0cmVzdWx0ID0gY3R4LnJlc3VsdDtcXG4gXFx0XFx0XFx0Z290byBvdXRfdW5tYXA7XFxuIFxcdFxcdH1cXG4tXFxuLVxcdFxcdGlmICghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkge1xcbi1cXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX1BBR0VfQU5PTjtcXG4tXFx0XFx0XFx0Z290byBvdXRfdW5tYXA7XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIFdlIHRyZWF0IGEgc2luZ2xlIHBhZ2UgYXMgc2hhcmVkIGlmIGFueSBwYXJ0IG9mIHRoZSBUSFBcXG4tXFx0XFx0ICogaXMgc2hhcmVkLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKSB7XFxuLVxcdFxcdFxcdGlmICgrK3NoYXJlZCBcXHUwMDNlIG1heF9wdGVzX3NoYXJlZCkge1xcbi1cXHRcXHRcXHRcXHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFO1xcbi1cXHRcXHRcXHRcXHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSk7XFxuLVxcdFxcdFxcdFxcdGNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcXG4tXFx0XFx0XFx0XFx0Z290byBvdXRfdW5tYXA7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0fVxcbitcXHRcXHRpZiAocHRlX2NoZWNrID09IFBURV9DSEVDS19DT05USU5VRSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuIFxcbiBcXHRcXHQvKiBTZXQgYml0IGZvciBvY2N1cGllZCBwYWdlcyAqL1xcbiBcXHRcXHRfX3NldF9iaXQoaSwgY2MtXFx1MDAzZW10aHBfcHJlc2VudF9wdGVzKTtcXG5AQCAtMTc0OSwzMSArMTc4MSwyMSBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogQ2hlY2sgaWYgdGhlIHBhZ2UgaGFzIGFueSBHVVAgKG9yIG90aGVyIGV4dGVybmFsKSBwaW5zLlxcbiBcXHRcXHQgKlxcbi1cXHRcXHQgKiBIZXJlIHRoZSBjaGVjayBtYXkgYmUgcmFjeTpcXG4tXFx0XFx0ICogaXQgbWF5IHNlZSBmb2xpb19tYXBjb3VudCgpIFxcdTAwM2UgZm9saW9fcmVmX2NvdW50KCkuXFxuLVxcdFxcdCAqIEJ1dCBzdWNoIGNhc2UgaXMgZXBoZW1lcmFsIHdlIGNvdWxkIGFsd2F5cyByZXRyeSBjb2xsYXBzZVxcbi1cXHRcXHQgKiBsYXRlci4gIEhvd2V2ZXIgaXQgbWF5IHJlcG9ydCBmYWxzZSBwb3NpdGl2ZSBpZiB0aGUgcGFnZVxcbi1cXHRcXHQgKiBoYXMgZXhjZXNzaXZlIEdVUCBwaW5zIChpLmUuIDUxMikuICBBbnl3YXkgdGhlIHNhbWUgY2hlY2tcXG4tXFx0XFx0ICogd2lsbCBiZSBkb25lIGFnYWluIGxhdGVyIHRoZSByaXNrIHNlZW1zIGxvdy5cXG4rXFx0XFx0ICogSGVyZSB0aGUgY2hlY2sgaXMgcmFjeSwgYnV0IHN1Y2ggY2FzZSBpcyBlcGhlbWVyYWwgYW5kXFxuK1xcdFxcdCAqIHdlIGNvdWxkIGFsd2F5cyByZXRyeSBjb2xsYXBzZSBsYXRlci4gQW55d2F5IHRoZSBzYW1lXFxuK1xcdFxcdCAqIGNoZWNrIHdpbGwgYmUgZG9uZSBhZ2FpbiBsYXRlciB0aGUgcmlzayBzZWVtcyBsb3cuXFxuIFxcdFxcdCAqL1xcbiBcXHRcXHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pKSB7XFxuIFxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUEFHRV9DT1VOVDtcXG4gXFx0XFx0XFx0Z290byBvdXRfdW5tYXA7XFxuIFxcdFxcdH1cXG4gXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpc1xcbi1cXHRcXHQgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZVxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdCAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcXG4tXFx0XFx0ICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XFxuLVxcdFxcdCAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVxcdTAwM2V2bV9tbSwgYWRkcikpKVxcbitcXHRcXHRpZiAocHRlX2lzX3JlZmVyZW5jZWQoY2MsIHB0ZXZhbCwgZm9saW8sIHZtYSwgYWRkcikpXFxuIFxcdFxcdFxcdHJlZmVyZW5jZWQrKztcXG4gXFx0fVxcbiBcXHRpZiAoY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgXFx1MDAyNlxcdTAwMjZcXG4gXFx0XFx0ICAgKCFyZWZlcmVuY2VkIHx8XFxuLVxcdFxcdCAgICAodW5tYXBwZWQgXFx1MDAyNlxcdTAwMjYgcmVmZXJlbmNlZCBcXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xcbitcXHRcXHQgICAgKGN0eC51bm1hcHBlZCBcXHUwMDI2XFx1MDAyNiByZWZlcmVuY2VkIFxcdTAwM2MgSFBBR0VfUE1EX05SIC8gMikpKSB7XFxuIFxcdFxcdHJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7XFxuIFxcdH0gZWxzZSB7XFxuIFxcdFxcdHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcXG5AQCAtMTc4MSwxNiArMTgwMywxNiBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4gb3V0X3VubWFwOlxcbiBcXHRwdGVfdW5tYXBfdW5sb2NrKHB0ZSwgcHRsKTtcXG4gXFx0aWYgKHJlc3VsdCA9PSBTQ0FOX1NVQ0NFRUQpIHtcXG4tXFx0XFx0LyogY29sbGFwc2VfaHVnZV9wYWdlIGV4cGVjdHMgdGhlIGxvY2sgdG8gYmUgZHJvcHBlZCBiZWZvcmUgY2FsbGluZyAqL1xcbitcXHRcXHQvKiBjb2xsYXBzZV9odWdlX3BhZ2UoKSBleHBlY3RzIHRoZSBsb2NrIHRvIGJlIGRyb3BwZWQgYmVmb3JlIGNhbGxpbmcgKi9cXG4gXFx0XFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XFxuIFxcdFxcdHJlc3VsdCA9IG10aHBfY29sbGFwc2UobW0sIHN0YXJ0X2FkZHIsIHJlZmVyZW5jZWQsXFxuLVxcdFxcdFxcdFxcdCAgICAgICB1bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTtcXG4rXFx0XFx0XFx0XFx0ICAgICAgIGN0eC51bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTtcXG4gXFx0XFx0LyogbW1hcF9sb2NrIHdhcyByZWxlYXNlZCBhYm92ZSwgc2V0IGxvY2tfZHJvcHBlZCAqL1xcbiBcXHRcXHQqbG9ja19kcm9wcGVkID0gdHJ1ZTtcXG4gXFx0fVxcbiBvdXQ6XFxuIFxcdHRyYWNlX21tX2todWdlcGFnZWRfc2Nhbl9wbWQobW0sIGZvbGlvLCByZWZlcmVuY2VkLFxcbi1cXHRcXHRcXHRcXHQgICAgIG5vbmVfb3JfemVybywgcmVzdWx0LCB1bm1hcHBlZCk7XFxuK1xcdFxcdFxcdFxcdCAgICAgY3R4Lm5vbmVfb3JfemVybywgcmVzdWx0LCBjdHgudW5tYXBwZWQpO1xcbiBcXHRyZXR1cm4gcmVzdWx0O1xcbiB9XFxuIFxcbkBAIC0yNjkxLDggKzI3MTMsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuIFxcbiBcXHRwcmVzZW50ID0gMDtcXG4gXFx0c3dhcCA9IDA7XFxuLVxcdG1lbXNldChjYy1cXHUwMDNlbm9kZV9sb2FkLCAwLCBzaXplb2YoY2MtXFx1MDAzZW5vZGVfbG9hZCkpO1xcbi1cXHRub2Rlc19jbGVhcihjYy1cXHUwMDNlYWxsb2Nfbm1hc2spO1xcbitcXHRjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihjYyk7XFxuIFxcdHJjdV9yZWFkX2xvY2soKTtcXG4gXFx0eGFzX2Zvcl9lYWNoKFxcdTAwMjZ4YXMsIGZvbGlvLCBzdGFydCArIEhQQUdFX1BNRF9OUiAtIDEpIHtcXG4gXFx0XFx0aWYgKHhhc19yZXRyeShcXHUwMDI2eGFzLCBmb2xpbykpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjM5OjAwLjM4MDA0OTM4WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6Mjk3NDkxMzM4MDQ5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJVU0VSRkFVTFRGRFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIm1hZHZpc2VfY29sbGFwc2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgUFRFIGNoZWNraW5nIGxvZ2ljIGZvciBUSFAgY29sbGFwc2UgaW50byBhIG5ldyBoZWxwZXIgZnVuY3Rpb24gY29sbGFwc2VfY2hlY2tfcHRlKCkuIEl0IGFsc28gbW9kaWZpZXMgdGhlIGJlaGF2aW9yIHdoZW4gYSBub24tYW5vbnltb3VzIGZvbGlvIGlzIGVuY291bnRlcmVkIGluIGFuIGFub255bW91cyBWTUEsIGNoYW5naW5nIGEgVk1fQlVHX09OX0ZPTElPIHRvIGEgVk1fV0FSTl9PTl9GT0xJTyBhbmQgcmV0dXJuaW5nIGFuIGVycm9yLiBGdXp6aW5nIG1hZHZpc2UoTUFEVl9DT0xMQVBTRSkgYW5kIGtodWdlcGFnZWQgY2FuIGhlbHAgdmVyaWZ5IHRoYXQgdGhpcyByZWZhY3RvcmluZyBkb2Vzbid0IGludHJvZHVjZSBzdWJ0bGUgcmVncmVzc2lvbnMgaW4gUFRFIHNjYW5uaW5nIG9yIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgdXNhZ2UuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDU3OGE0ZGE2MDgzYzU1NTJjMjZmMmE3MGZlZDhhZTliOWEzNDlmNDBcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIEF1ZyA0IDE5OjM4OjU3IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XG5pbmRleCAxNmYzNzEzNWVkODBkLi5iMTg3ZDYxODQ1MmY0IDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0XG4rKysgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3RcbkBAIC0yMjQsNyArMjI0LDcgQEAga2h1Z2VwYWdlZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB3aGVuIGFueSBUSFAgc2l6ZSBpcyBlbmFibGVkXG4gKGVpdGhlciBvZiB0aGUgcGVyLXNpemUgYW5vbiBjb250cm9sIG9yIHRoZSB0b3AtbGV2ZWwgY29udHJvbCBhcmUgc2V0XG4gdG8gXCJhbHdheXNcIiBvciBcIm1hZHZpc2VcIiksIGFuZCBpdCdsbCBiZSBhdXRvbWF0aWNhbGx5IHNodXRkb3duIHdoZW5cbiBhbGwgVEhQIHNpemVzIGFyZSBkaXNhYmxlZCAod2hlbiBib3RoIHRoZSBwZXItc2l6ZSBhbm9uIGNvbnRyb2wgYW5kIHRoZVxuLXRvcC1sZXZlbCBjb250cm9sIGFyZSBcIm5ldmVyXCIpXG4rdG9wLWxldmVsIGNvbnRyb2wgYXJlIFwibmV2ZXJcIikuXG4gXG4gcHJvY2VzcyBUSFAgY29udHJvbHNcbiAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuQEAgLTMwMSw3ICszMDEsOSBAQCBiZWluZyByZXBsYWNlZCBieSBhIFBNRCBtYXBwaW5nLCBvciAoMikgcGh5c2ljYWwgcGFnZXMgcmVwbGFjZWQgYnkgb25lXG4gaHVnZXBhZ2Ugb2YgdmFyaW91cyBzaXplcyAoUE1ELXNpemVkIG9yIG1USFApLiBFYWNoIG1heSBoYXBwZW4gaW5kZXBlbmRlbnRseSxcbiBvciB0b2dldGhlciwgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIG1lbW9yeSBhbmQgdGhlIGZhaWx1cmVzIHRoYXQgb2NjdXIuXG4gQXMgc3VjaCwgdGhpcyB2YWx1ZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgcm91Z2hseSBhcyBhIHNpZ24gb2YgcHJvZ3Jlc3MsXG4tYW5kIGNvdW50ZXJzIGluIC9wcm9jL3Ztc3RhdCBjb25zdWx0ZWQgZm9yIG1vcmUgYWNjdXJhdGUgYWNjb3VudGluZyk6OlxuK2FuZCBjb3VudGVycyBpbiAvcHJvYy92bXN0YXQgY29uc3VsdGVkIGZvciBtb3JlIGFjY3VyYXRlIGFjY291bnRpbmcuXG4rUGVyLW9yZGVyIG1USFAgY29sbGFwc2Ugc3RhdGlzdGljcyBhcmUgYWxzbyBhdmFpbGFibGUgdW5kZXJcbisvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9odWdlcGFnZXMtXHUwMDNjc2l6ZVx1MDAzZWtCL3N0YXRzLyk6OlxuIFxuIFx0L3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2Uva2h1Z2VwYWdlZC9wYWdlc19jb2xsYXBzZWRcbiBcbmRpZmYgLS1naXQgYS9tbS9raHVnZXBhZ2VkLmMgYi9tbS9raHVnZXBhZ2VkLmNcbmluZGV4IGIyMzdmNmU3NjYyYTUuLjMzMzhlOWRjMTFkZDAgMTAwNjQ0XG4tLS0gYS9tbS9raHVnZXBhZ2VkLmNcbisrKyBiL21tL2todWdlcGFnZWQuY1xuQEAgLTY1LDYgKzY1LDEyIEBAIGVudW0gc2Nhbl9yZXN1bHQge1xuIFx0U0NBTl9QQUdFX0RJUlRZX09SX1dSSVRFQkFDSyxcbiB9O1xuIFxuK2VudW0gcHRlX2NoZWNrX3Jlc3VsdCB7XG4rXHRQVEVfQ0hFQ0tfU1VDQ0VFRCxcbitcdFBURV9DSEVDS19GQUlMLFxuK1x0UFRFX0NIRUNLX0NPTlRJTlVFLFxuK307XG4rXG4gI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTXG4gI2luY2x1ZGUgXHUwMDNjdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmhcdTAwM2VcbiBcbkBAIC0xMTksNiArMTI1LDIwIEBAIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sIHtcbiBcdERFQ0xBUkVfQklUTUFQKG10aHBfcHJlc2VudF9wdGVzLCBNQVhfUFRSU19QRVJfUFRFKTtcbiB9O1xuIFxuK3N0cnVjdCBwdGVfY2hlY2tfY29udGV4dCB7XG4rXHRzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2M7XG4rXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTtcbitcdHVuc2lnbmVkIGludCBvcmRlcjtcbitcdHN0cnVjdCBmb2xpbyAqZm9saW87XG4rXHRpbnQgbm9uZV9vcl96ZXJvO1xuK1x0aW50IHNoYXJlZDtcbitcdGludCB1bm1hcHBlZDtcbitcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0O1xuK1x0dW5zaWduZWQgaW50IG1heF9wdGVzX25vbmU7XG4rXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc3dhcDtcbitcdHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQ7XG4rfTtcbitcbiAvKipcbiAgKiBzdHJ1Y3Qga2h1Z2VwYWdlZF9zY2FuIC0gY3Vyc29yIGZvciBzY2FubmluZ1xuICAqIEBtbV9oZWFkOiB0aGUgaGVhZCBvZiB0aGUgbW0gbGlzdCB0byBzY2FuXG5AQCAtNjIwLDcgKzY0MCw3IEBAIHZvaWQgX19raHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pXG4gXHRcdC8qXG4gXHRcdCAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gc2VyaWFsaXplIGFnYWluc3RcbiBcdFx0ICogY29sbGFwc2VfdGVzdF9leGl0KCkgKHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gcnVuXG4tXHRcdCAqIHVuZGVyIG1tYXAgc2VtIHJlYWQgbW9kZSkuIFN0b3AgaGVyZSAoYWZ0ZXIgd2UgcmV0dXJuIGFsbFxuK1x0XHQgKiB1bmRlciBtbWFwX2xvY2sgcmVhZCBtb2RlKS4gU3RvcCBoZXJlIChhZnRlciB3ZSByZXR1cm4gYWxsXG4gXHRcdCAqIHBhZ2V0YWJsZXMgd2lsbCBiZSBkZXN0cm95ZWQpIHVudGlsIGtodWdlcGFnZWQgaGFzIGZpbmlzaGVkXG4gXHRcdCAqIHdvcmtpbmcgb24gdGhlIHBhZ2V0YWJsZXMgdW5kZXIgdGhlIG1tYXBfbG9jay5cbiBcdFx0ICovXG5AQCAtNjI5LDYgKzY0OSwxMyBAQCB2b2lkIF9fa2h1Z2VwYWdlZF9leGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxuIFx0fVxuIH1cbiBcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbihzdHJ1Y3QgY29sbGFwc2VfY29udHJvbCAqY2MpXG4re1xuK1x0bWVtc2V0KGNjLVx1MDAzZW5vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLVx1MDAzZW5vZGVfbG9hZCkpO1xuK1x0bm9kZXNfY2xlYXIoY2MtXHUwMDNlYWxsb2Nfbm1hc2spO1xuK1x0Yml0bWFwX3plcm8oY2MtXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpO1xuK31cbitcbiBzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIHtcbiBcdG5vZGVfc3RhdF9tb2RfZm9saW8oZm9saW8sXG5AQCAtNjY1LDc2ICs2OTIsMTU2IEBAIHN0YXRpYyB2b2lkIHJlbGVhc2VfcHRlX3BhZ2VzKHB0ZV90ICpwdGUsIHB0ZV90ICpfcHRlLFxuIFx0fVxuIH1cbiBcbisvKlxuKyAqIHB0ZV9pc19yZWZlcmVuY2VkKCkgLSBDaGVjayBmb3IgZW5vdWdoIHJlZmVyZW5jZWQgUFRFcyB0byBqdXN0aWZ5IGNvbGxhcHNpbmdcbisgKlxuKyAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGUgcGFnZSBoYXMgYmVlblxuKyAqIHJlY2VudGx5IGFjY2Vzc2VkICh5b3VuZyBwdGUpIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZS5cbisgKlxuKyAqIFJldHVybjogdHJ1ZSBpZiB0aGUgcGFnZSBoYXMgYmVlbiByZWNlbnRseSBhY2Nlc3NlZC5cbisgKi9cbitzdGF0aWMgaW5saW5lIGJvb2wgcHRlX2lzX3JlZmVyZW5jZWQoc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjLCBwdGVfdCBwdGV2YWwsXG4rXHRzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyKVxuK3tcbitcdHJldHVybiBjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNlxuK1x0ICAgICAgIChwdGVfeW91bmcocHRldmFsKSB8fCBmb2xpb190ZXN0X3lvdW5nKGZvbGlvKSB8fFxuK1x0XHRmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XG4rXHRcdG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHZtYS1cdTAwM2V2bV9tbSwgYWRkcikpO1xuK31cbitcbitzdGF0aWMgdm9pZCBjb3VudF9jb2xsYXBzZV9ldmVudCh1bnNpZ25lZCBpbnQgb3JkZXIsIGVudW0gdm1fZXZlbnRfaXRlbSB2bV9ldmVudCxcbitcdFx0ZW51bSBtdGhwX3N0YXRfaXRlbSBtdGhwX2V2ZW50KVxuK3tcbitcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuK1x0XHRjb3VudF92bV9ldmVudCh2bV9ldmVudCk7XG4rXHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIG10aHBfZXZlbnQpO1xuK31cbitcbisvKlxuKyAqIHB0ZV9jaGVja19mYWlsKCkgLSBBIHNpbXBsZSBoZWxwZXIgdG8gc2V0IHRoZSBwdGVfY2hlY2tfY29udGV4dCByZXN1bHQgYW5kXG4rICogcmV0dXJuIFBURV9DSEVDS19GQUlMLlxuKyAqL1xuK3N0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgcHRlX2NoZWNrX2ZhaWwoc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgsXG4rXHRcdGVudW0gc2Nhbl9yZXN1bHQgcmVzdWx0KVxuK3tcbitcdGN0eC1cdTAwM2VyZXN1bHQgPSByZXN1bHQ7XG4rXHRyZXR1cm4gUFRFX0NIRUNLX0ZBSUw7XG4rfVxuK1xuKy8qXG4rICogY29sbGFwc2VfY2hlY2tfcHRlKCkgLSBDaGVjayBpZiBhIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2VcbisgKlxuKyAqIENoZWNrIGlmIGEgUFRFIGlzIHN1aXRhYmxlIGZvciBjb2xsYXBzZSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOlxuKyAqIC0gbWF4X3B0ZV8qIHZhbHVlcyBhcmUgbm90IGV4Y2VlZGVkXG4rICogLSB1ZmZkIGlzIG5vdCBhY3RpdmVcbisgKiAtIGxhenlmcmVlIHByb3BlcnRpZXMgYXJlIG5vdCBwcmVzZW50XG4rICogLSBvbmx5IGFub255bW91cyBwYWdlcyBhcmUgcHJlc2VudFxuKyAqXG4rICogYSBoZWxwZXIgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGlzIHVzZWQgdG8gcGFzcyBhbmQgc3RvcmUgcmVsZXZhbnRcbisgKiBpbmZvcm1hdGlvbiBiZXR3ZWVuIHRoZSBjb2xsYXBzZV9jaGVja19wdGUoKSBmdW5jdGlvbiBhbmQgdGhlIGNhbGxlci5cbisgKlxuKyAqIFJldHVybjogUFRFX0NIRUNLX1NVQ0NFRUQgaWYgdGhlIFBURSBpcyBzdWl0YWJsZSBmb3IgY29sbGFwc2UsXG4rICogICAgICAgICBQVEVfQ0hFQ0tfRkFJTCBpZiB0aGUgUFRFIGlzIG5vdCBzdWl0YWJsZSBmb3IgY29sbGFwc2UsXG4rICogICAgICAgICBQVEVfQ0hFQ0tfQ09OVElOVUUgaWYgdGhlIHNjYW4gc2hvdWxkIGNvbnRpbnVlIHRvIGNoZWNrIHRoZSBuZXh0IFBURS5cbisgKi9cbitzdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGVfdCBwdGV2YWwsXG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IHB0ZV9jaGVja19jb250ZXh0ICpjdHgpXG4re1xuK1x0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xuK1x0XHRpZiAoKytjdHgtXHUwMDNlbm9uZV9vcl96ZXJvIFx1MDAzZSBjdHgtXHUwMDNlbWF4X3B0ZXNfbm9uZSkge1xuK1x0XHRcdGNvdW50X2NvbGxhcHNlX2V2ZW50KGN0eC1cdTAwM2VvcmRlciwgVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFLFxuK1x0XHRcdFx0XHQgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7XG4rXHRcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9FWENFRURfTk9ORV9QVEUpO1xuK1x0XHR9XG4rXHRcdHJldHVybiBQVEVfQ0hFQ0tfQ09OVElOVUU7XG4rXHR9XG4rXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcbitcdFx0aWYgKGN0eC1cdTAwM2V1bm1hcHBlZCA9PSAtMSlcbitcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BURV9OT05fUFJFU0VOVCk7XG4rXHRcdGlmICgrK2N0eC1cdTAwM2V1bm1hcHBlZCBcdTAwM2UgY3R4LVx1MDAzZW1heF9wdGVzX3N3YXApIHtcbitcdFx0XHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSxcbitcdFx0XHRcdFx0ICAgICBNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX1NXQVApO1xuK1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fRVhDRUVEX1NXQVBfUFRFKTtcbitcdFx0fVxuK1x0XHRpZiAocHRlX3N3cF91ZmZkX2FueShwdGV2YWwpKVxuK1x0XHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX1VGRkQpO1xuK1x0XHRyZXR1cm4gUFRFX0NIRUNLX0NPTlRJTlVFO1xuK1x0fVxuK1x0LypcbitcdCAqIERvbid0IGNvbGxhcHNlIGlmIGFueSBvZiB0aGUgc21hbGwgUFRFcyBhcmUgYXJtZWQgd2l0aCB1ZmZkXG4rXHQgKiB3cml0ZSBwcm90ZWN0aW9uLiBNYXJraW5nIHRoZSBuZXcgaHVnZSBwbWQgYXMgd3JpdGUgcHJvdGVjdGVkXG4rXHQgKiBjb3VsZCBicmluZyB1c2VyZmF1bHQgbWVzc2FnZXMgdGhhdCBmYWxsIG91dHNpZGUgb2YgdGhlXG4rXHQgKiByZWdpc3RlcmVkIHJhbmdlLlxuK1x0ICovXG4rXHRpZiAocHRlX3VmZmQocHRldmFsKSlcbitcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QVEVfVUZGRCk7XG4rXG4rXHRjdHgtXHUwMDNlZm9saW8gPSB2bV9ub3JtYWxfZm9saW8oY3R4LVx1MDAzZXZtYSwgYWRkciwgcHRldmFsKTtcbitcdGlmICh1bmxpa2VseSghY3R4LVx1MDAzZWZvbGlvKSB8fCB1bmxpa2VseShmb2xpb19pc196b25lX2RldmljZShjdHgtXHUwMDNlZm9saW8pKSlcbitcdFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX05VTEwpO1xuK1xuK1x0LypcbitcdCAqIElmIHRoZSB2bWEgaGFzIHRoZSBWTV9EUk9QUEFCTEUgZmxhZywgdGhlIGNvbGxhcHNlIHdpbGxcbitcdCAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC5cbitcdCAqL1xuK1x0aWYgKGN0eC1cdTAwM2VjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNiAhKGN0eC1cdTAwM2V2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkgXHUwMDI2XHUwMDI2XG4rXHQgICAgZm9saW9fdGVzdF9sYXp5ZnJlZShjdHgtXHUwMDNlZm9saW8pIFx1MDAyNlx1MDAyNiAhcHRlX2RpcnR5KHB0ZXZhbCkpXG4rXHRcdHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUEFHRV9MQVpZRlJFRSk7XG4rXG4rXHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihjdHgtXHUwMDNlZm9saW8pKSB7XG4rXHRcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihjdHgtXHUwMDNlZm9saW8pLCBjdHgtXHUwMDNlZm9saW8pO1xuK1x0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfQU5PTik7XG4rXHR9XG4rXG4rXHRpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChjdHgtXHUwMDNlZm9saW8pKSB7XG4rXHRcdC8qXG4rXHRcdCAqIFRPRE86IFN1cHBvcnQgc2hhcmVkIHBhZ2VzIHdpdGhvdXQgbGVhZGluZyB0byBmdXJ0aGVyXG4rXHRcdCAqIG1USFAgY29sbGFwc2VzLiBDdXJyZW50bHkgYnJpbmdpbmcgaW4gbmV3IHBhZ2VzIHZpYVxuK1x0XHQgKiBzaGFyZWQgbWF5IGNhdXNlIGEgZnV0dXJlIGhpZ2hlciBvcmRlciBjb2xsYXBzZSBvbiBhXG4rXHRcdCAqIHJlc2NhbiBvZiB0aGUgc2FtZSByYW5nZS5cbitcdFx0ICovXG4rXHRcdGlmICgrK2N0eC1cdTAwM2VzaGFyZWQgXHUwMDNlIGN0eC1cdTAwM2VtYXhfcHRlc19zaGFyZWQpIHtcbitcdFx0XHRjb3VudF9jb2xsYXBzZV9ldmVudChjdHgtXHUwMDNlb3JkZXIsIFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFLFxuK1x0XHRcdFx0XHQgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcbitcdFx0XHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0cmV0dXJuIFBURV9DSEVDS19TVUNDRUVEO1xuK31cbitcbiBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHR1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsIHB0ZV90ICpwdGUsIHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYyxcbiBcdFx0dW5zaWduZWQgaW50IG9yZGVyLCBzdHJ1Y3QgbGlzdF9oZWFkICpjb21wb3VuZF9wYWdlbGlzdClcbiB7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgb3JkZXIpO1xuLVx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpO1xuIFx0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7XG4gXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDtcbiBcdHVuc2lnbmVkIGxvbmcgYWRkciA9IHN0YXJ0X2FkZHI7XG4tXHRwdGVfdCAqX3B0ZTtcbi1cdGludCBub25lX29yX3plcm8gPSAwLCBzaGFyZWQgPSAwLCByZWZlcmVuY2VkID0gMDtcbitcdHB0ZV90ICpfcHRlLCBwdGV2YWw7XG4rXHRpbnQgcmVmZXJlbmNlZCA9IDA7XG4gXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcbitcdGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBwdGVfY2hlY2s7XG4rXHRzdHJ1Y3QgcHRlX2NoZWNrX2NvbnRleHQgY3R4ID0ge1xuK1x0XHQuY2MgPSBjYyxcbitcdFx0LnZtYSA9IHZtYSxcbitcdFx0Lm9yZGVyID0gb3JkZXIsXG4rXHRcdC51bm1hcHBlZCA9IC0xLCAvKiBkb24ndCBjaGVjayBzd2FwIFBURXMgKi9cbitcdFx0Lm1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIG9yZGVyKSxcbitcdFx0Lm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgb3JkZXIpLFxuK1x0fTtcbiBcbiBcdGZvciAoX3B0ZSA9IHB0ZTsgX3B0ZSBcdTAwM2MgcHRlICsgbnJfcGFnZXM7XG4gXHQgICAgIF9wdGUrKywgYWRkciArPSBQQUdFX1NJWkUpIHtcbi1cdFx0cHRlX3QgcHRldmFsID0gcHRlcF9nZXQoX3B0ZSk7XG4tXHRcdGlmIChwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbCkpIHtcbi1cdFx0XHRpZiAoKytub25lX29yX3plcm8gXHUwMDNlIG1heF9wdGVzX25vbmUpIHtcbi1cdFx0XHRcdHJlc3VsdCA9IFNDQU5fRVhDRUVEX05PTkVfUFRFO1xuLVx0XHRcdFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG4tXHRcdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9OT05FX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfTk9ORSk7XG4tXHRcdFx0XHRnb3RvIG91dDtcbi1cdFx0XHR9XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0aWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QVEVfTk9OX1BSRVNFTlQ7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BURV9VRkZEO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXHRcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7XG4tXHRcdGlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfTlVMTDtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVxuLVx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXHRcdFZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSwgZm9saW8pO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBJZiB0aGUgdm1hIGhhcyB0aGUgVk1fRFJPUFBBQkxFIGZsYWcsIHRoZSBjb2xsYXBzZSB3aWxsXG4tXHRcdCAqIHByZXNlcnZlIHRoZSBsYXp5ZnJlZSBwcm9wZXJ0eSB3aXRob3V0IG5lZWRpbmcgdG8gc2tpcC5cbi1cdFx0ICovXG4tXHRcdGlmIChjYy1cdTAwM2Vpc19raHVnZXBhZ2VkIFx1MDAyNlx1MDAyNiAhKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fRFJPUFBBQkxFKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGZvbGlvX3Rlc3RfbGF6eWZyZWUoZm9saW8pIFx1MDAyNlx1MDAyNiAhcHRlX2RpcnR5KHB0ZXZhbCkpIHtcbi1cdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfTEFaWUZSRUU7XG4rXHRcdHB0ZXZhbCA9IHB0ZXBfZ2V0KF9wdGUpO1xuK1x0XHRwdGVfY2hlY2sgPSBjb2xsYXBzZV9jaGVja19wdGUocHRldmFsLCBhZGRyLCBcdTAwMjZjdHgpO1xuK1x0XHRmb2xpbyA9IGN0eC5mb2xpbztcbitcdFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkge1xuK1x0XHRcdHJlc3VsdCA9IGN0eC5yZXN1bHQ7XG4gXHRcdFx0Z290byBvdXQ7XG4gXHRcdH1cbitcdFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfQ09OVElOVUUpXG4rXHRcdFx0Y29udGludWU7XG4gXG4tXHRcdC8qIFNlZSBjb2xsYXBzZV9zY2FuX3BtZCgpLiAqL1xuLVx0XHRpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChmb2xpbykpIHtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFRPRE86IFN1cHBvcnQgc2hhcmVkIHBhZ2VzIHdpdGhvdXQgbGVhZGluZyB0byBmdXJ0aGVyXG4tXHRcdFx0ICogbVRIUCBjb2xsYXBzZXMuIEN1cnJlbnRseSBicmluZ2luZyBpbiBuZXcgcGFnZXMgdmlhXG4tXHRcdFx0ICogc2hhcmVkIG1heSBjYXVzZSBhIGZ1dHVyZSBoaWdoZXIgb3JkZXIgY29sbGFwc2Ugb24gYVxuLVx0XHRcdCAqIHJlc2NhbiBvZiB0aGUgc2FtZSByYW5nZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAoKytzaGFyZWQgXHUwMDNlIG1heF9wdGVzX3NoYXJlZCkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfU0hBUkVEX1BURTtcbi1cdFx0XHRcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuLVx0XHRcdFx0XHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU0hBUkVEX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQob3JkZXIsIE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU0hBUkVEKTtcbi1cdFx0XHRcdGdvdG8gb3V0O1xuLVx0XHRcdH1cbi1cdFx0fVxuIFx0XHQvKlxuIFx0XHQgKiBUT0RPOiBJbiBzb21lIGNhc2VzIG9mIHBhcnRpYWxseS1tYXBwZWQgZm9saW9zLCB3ZSdkIGFjdHVhbGx5XG4gXHRcdCAqIHdhbnQgdG8gY29sbGFwc2UuXG5AQCAtNzU5LDggKzg2Niw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXG4gXHRcdC8qXG4gXHRcdCAqIFdlIGNhbiBkbyBpdCBiZWZvcmUgZm9saW9faXNvbGF0ZV9scnUgYmVjYXVzZSB0aGVcbi1cdFx0ICogZm9saW8gY2FuJ3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogUEdfbG9ja1xuLVx0XHQgKiBpcyBuZWVkZWQgdG8gc2VyaWFsaXplIGFnYWluc3Qgc3BsaXRfaHVnZV9wYWdlXG4rXHRcdCAqIGZvbGlvIGNhbid0IGJlIGZyZWVkIGZyb20gdW5kZXIgdXMuIE5PVEU6IGZvbGlvIGxvY2tcbitcdFx0ICogaXMgbmVlZGVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IHNwbGl0X2h1Z2VfcGFnZSgpXG4gXHRcdCAqIHdoZW4gaW52b2tlZCBmcm9tIHRoZSBWTS5cbiBcdFx0ICovXG4gXHRcdGlmICghZm9saW9fdHJ5bG9jayhmb2xpbykpIHtcbkBAIC03ODYsNyArODkzLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0fVxuIFxuIFx0XHQvKlxuLVx0XHQgKiBJc29sYXRlIHRoZSBwYWdlIHRvIGF2b2lkIGNvbGxhcHNpbmcgYW4gaHVnZXBhZ2VcbitcdFx0ICogSXNvbGF0ZSB0aGUgZm9saW8gdG8gYXZvaWQgY29sbGFwc2luZyBhIGh1Z2VwYWdlXG4gXHRcdCAqIGN1cnJlbnRseSBpbiB1c2UgYnkgdGhlIFZNLlxuIFx0XHQgKi9cbiBcdFx0aWYgKCFmb2xpb19pc29sYXRlX2xydShmb2xpbykpIHtcbkBAIC04MDMsMTQgKzkxMCw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSlcbiBcdFx0XHRsaXN0X2FkZF90YWlsKFx1MDAyNmZvbGlvLVx1MDAzZWxydSwgY29tcG91bmRfcGFnZWxpc3QpO1xuIG5leHQ6XG4tXHRcdC8qXG4tXHRcdCAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpc1xuLVx0XHQgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZVxuLVx0XHQgKi9cbi1cdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcbi1cdFx0ICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XG4tXHRcdCAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVx1MDAzZXZtX21tLCBhZGRyKSkpXG4rXHRcdGlmIChwdGVfaXNfcmVmZXJlbmNlZChjYywgcHRldmFsLCBmb2xpbywgdm1hLCBhZGRyKSlcbiBcdFx0XHRyZWZlcmVuY2VkKys7XG4gXHR9XG4gXG5AQCAtODE4LDEzICs5MTgsMTMgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0cmVzdWx0ID0gU0NBTl9MQUNLX1JFRkVSRU5DRURfUEFHRTtcbiBcdH0gZWxzZSB7XG4gXHRcdHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcbi1cdFx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIG5vbmVfb3JfemVybyxcbitcdFx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIGN0eC5ub25lX29yX3plcm8sXG4gXHRcdFx0XHRcdFx0ICAgIHJlZmVyZW5jZWQsIHJlc3VsdCwgb3JkZXIpO1xuIFx0XHRyZXR1cm4gcmVzdWx0O1xuIFx0fVxuIG91dDpcbiBcdHJlbGVhc2VfcHRlX3BhZ2VzKHB0ZSwgX3B0ZSwgY29tcG91bmRfcGFnZWxpc3QpO1xuLVx0dHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoZm9saW8sIG5vbmVfb3JfemVybyxcbitcdHRyYWNlX21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKGZvbGlvLCBjdHgubm9uZV9vcl96ZXJvLFxuIFx0XHRcdFx0XHQgICAgcmVmZXJlbmNlZCwgcmVzdWx0LCBvcmRlcik7XG4gXHRyZXR1cm4gcmVzdWx0O1xuIH1cbkBAIC05MDQsNyArMTAwNCw3IEBAIHN0YXRpYyB2b2lkIF9fY29sbGFwc2VfaHVnZV9wYWdlX2NvcHlfZmFpbGVkKHB0ZV90ICpwdGUsXG4gXHQgKiBSZS1lc3RhYmxpc2ggdGhlIFBNRCB0byBwb2ludCB0byB0aGUgb3JpZ2luYWwgcGFnZSB0YWJsZVxuIFx0ICogZW50cnkuIFJlc3RvcmluZyBQTUQgbmVlZHMgdG8gYmUgZG9uZSBwcmlvciB0byByZWxlYXNpbmdcbiBcdCAqIHBhZ2VzLiBTaW5jZSBwYWdlcyBhcmUgc3RpbGwgaXNvbGF0ZWQgYW5kIGxvY2tlZCBoZXJlLFxuLVx0ICogYWNxdWlyaW5nIGFub25fdm1hX2xvY2tfd3JpdGUgaXMgdW5uZWNlc3NhcnkuXG4rXHQgKiBhY3F1aXJpbmcgYW5vbl92bWFfbG9ja193cml0ZSgpIGlzIHVubmVjZXNzYXJ5LlxuIFx0ICovXG4gXHRwbWRfcHRsID0gcG1kX2xvY2sodm1hLVx1MDAzZXZtX21tLCBwbWQpO1xuIFx0cG1kX3BvcHVsYXRlKHZtYS1cdTAwM2V2bV9tbSwgcG1kLCBwbWRfcGd0YWJsZShvcmlnX3BtZCkpO1xuQEAgLTEwNzgsOSArMTE3OCw5IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsXG4gXHRcdHJldHVybiBTQ0FOX1ZNQV9DSEVDSztcbiBcdC8qXG4gXHQgKiBBbm9uIFZNQSBleHBlY3RlZCwgdGhlIGFkZHJlc3MgbWF5IGJlIHVubWFwcGVkIHRoZW5cbi1cdCAqIHJlbWFwcGVkIHRvIGZpbGUgYWZ0ZXIga2h1Z2VwYWdlZCByZWFxdWlyZWQgdGhlIG1tYXBfbG9jay5cbitcdCAqIHJlbWFwcGVkIHRvIGZpbGUgYWZ0ZXIga2h1Z2VwYWdlZCByZWFjcXVpcmVkIHRoZSBtbWFwX2xvY2suXG4gXHQgKlxuLVx0ICogdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzIG1heSByZXR1cm4gdHJ1ZSBmb3IgcXVhbGlmaWVkIGZpbGVcbitcdCAqIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpIG1heSByZXR1cm4gdHJ1ZSBmb3IgcXVhbGlmaWVkIGZpbGVcbiBcdCAqIHZtYXMuXG4gXHQgKi9cbiBcdGlmIChleHBlY3RfYW5vbiBcdTAwMjZcdTAwMjYgKCEoKnZtYXApLVx1MDAzZWFub25fdm1hIHx8ICF2bWFfaXNfYW5vbnltb3VzKCp2bWFwKSkpXG5AQCAtMTEzNiw3ICsxMjM2LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY2hlY2tfcG1kX3N0aWxsX3ZhbGlkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIC8qXG4gICogQnJpbmcgbWlzc2luZyBwYWdlcyBpbiBmcm9tIHN3YXAsIHRvIGNvbXBsZXRlIFRIUCBjb2xsYXBzZS5cbi0gKiBPbmx5IGRvbmUgaWYga2h1Z2VwYWdlZF9zY2FuX3BtZCBiZWxpZXZlcyBpdCBpcyB3b3J0aHdoaWxlLlxuKyAqIE9ubHkgZG9uZSBpZiBjb2xsYXBzZV9zY2FuX3BtZCgpIGJlbGlldmVzIGl0IGlzIHdvcnRod2hpbGUuXG4gICpcbiAgKiBGb3IgbVRIUCBvcmRlcnMgdGhlIGZ1bmN0aW9uIGJhaWxzIG9uIHRoZSBmaXJzdCBzd2FwIGVudHJ5LCBiZWNhdXNlXG4gICogZmF1bHRpbmcgcGFnZXMgYmFjayBpbiBkdXJpbmcgY29sbGFwc2UgY291bGQgcmUtcG9wdWxhdGUgUFRFcyB0aGF0XG5AQCAtMTIwNCw3ICsxMzA0LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFx0XHRwdGUgPSBOVUxMO1xuIFxuIFx0XHQvKlxuLVx0XHQgKiBkb19zd2FwX3BhZ2UgcmV0dXJucyBWTV9GQVVMVF9SRVRSWSB3aXRoIHJlbGVhc2VkIG1tYXBfbG9jay5cbitcdFx0ICogZG9fc3dhcF9wYWdlKCkgcmV0dXJucyBWTV9GQVVMVF9SRVRSWSB3aXRoIHJlbGVhc2VkIG1tYXBfbG9jay5cbiBcdFx0ICogTm90ZSB3ZSB0cmVhdCBWTV9GQVVMVF9SRVRSWSBhcyBWTV9GQVVMVF9FUlJPUiBoZXJlIGJlY2F1c2VcbiBcdFx0ICogd2UgZG8gbm90IHJldHJ5IGhlcmUgYW5kIHN3YXAgZW50cnkgd2lsbCByZW1haW4gaW4gcGFnZXRhYmxlXG4gXHRcdCAqIHJlc3VsdGluZyBpbiBsYXRlciBmYWlsdXJlLlxuQEAgLTEyNDcsMTUgKzEzNDcsMTIgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnVcbiBcdGZvbGlvID0gX19mb2xpb19hbGxvYyhnZnAsIG9yZGVyLCBub2RlLCBcdTAwMjZjYy1cdTAwM2VhbGxvY19ubWFzayk7XG4gXHRpZiAoIWZvbGlvKSB7XG4gXHRcdCpmb2xpb3AgPSBOVUxMO1xuLVx0XHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcbi1cdFx0XHRjb3VudF92bV9ldmVudChUSFBfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTtcbi1cdFx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTtcbitcdFx0Y291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQ19GQUlMRUQsXG4rXHRcdFx0XHQgICAgIE1USFBfU1RBVF9DT0xMQVBTRV9BTExPQ19GQUlMRUQpO1xuIFx0XHRyZXR1cm4gU0NBTl9BTExPQ19IVUdFX1BBR0VfRkFJTDtcbiBcdH1cbiBcbi1cdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxuLVx0XHRjb3VudF92bV9ldmVudChUSFBfQ09MTEFQU0VfQUxMT0MpO1xuLVx0Y291bnRfbXRocF9zdGF0KG9yZGVyLCBNVEhQX1NUQVRfQ09MTEFQU0VfQUxMT0MpO1xuK1x0Y291bnRfY29sbGFwc2VfZXZlbnQob3JkZXIsIFRIUF9DT0xMQVBTRV9BTExPQywgTVRIUF9TVEFUX0NPTExBUFNFX0FMTE9DKTtcbiBcbiBcdGlmICh1bmxpa2VseShtZW1fY2dyb3VwX2NoYXJnZShmb2xpbywgbW0sIGdmcCkpKSB7XG4gXHRcdGZvbGlvX3B1dChmb2xpbyk7XG5AQCAtMTI3MSw3ICsxMzY4LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnVcbiB9XG4gXG4gLypcbi0gKiBjb2xsYXBzZV9odWdlX3BhZ2UgZXhwZWN0cyB0aGUgbW1hcF9sb2NrIHRvIGJlIHVubG9ja2VkIGJlZm9yZSBlbnRlcmluZyBhbmRcbisgKiBjb2xsYXBzZV9odWdlX3BhZ2UoKSBleHBlY3RzIHRoZSBtbWFwX2xvY2sgdG8gYmUgdW5sb2NrZWQgYmVmb3JlIGVudGVyaW5nIGFuZFxuICAqIHdpbGwgYWx3YXlzIHJldHVybiB3aXRoIHRoZSBsb2NrIHVubG9ja2VkLCB0byBhdm9pZCBob2xkaW5nIHRoZSBtbWFwX2xvY2tcbiAgKiB3aGlsZSBhbGxvY2F0aW5nIGEgVEhQLCBhcyB0aGF0IGNvdWxkIHRyaWdnZXIgZGlyZWN0IHJlY2xhaW0vY29tcGFjdGlvbi5cbiAgKiBOb3RlIHRoYXQgdGhlIFZNQSBtdXN0IGJlIHJlY2hlY2tlZCBhZnRlciBncmFiYmluZyB0aGUgbW1hcF9sb2NrIGFnYWluLlxuQEAgLTEzMTgsNyArMTQxNSw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXG4gXHRpZiAodW5tYXBwZWQpIHtcbiBcdFx0Lypcbi1cdFx0ICogX19jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluIHdpbGwgcmV0dXJuIHdpdGggbW1hcF9sb2NrXG4rXHRcdCAqIF9fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbigpIHdpbGwgcmV0dXJuIHdpdGggbW1hcF9sb2NrXG4gXHRcdCAqIHJlbGVhc2VkIHdoZW4gaXQgZmFpbHMuIFNvIHdlIGp1bXAgb3V0X25vbG9jayBkaXJlY3RseSBpblxuIFx0XHQgKiB0aGF0IGNhc2UuICBDb250aW51aW5nIHRvIGNvbGxhcHNlIGNhdXNlcyBpbmNvbnNpc3RlbmN5LlxuIFx0XHQgKi9cbkBAIC0xMzMxLDggKzE0MjgsOCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFx0bW1hcF9yZWFkX3VubG9jayhtbSk7XG4gXHQvKlxuIFx0ICogUHJldmVudCBhbGwgYWNjZXNzIHRvIHBhZ2V0YWJsZXMgd2l0aCB0aGUgZXhjZXB0aW9uIG9mXG4tXHQgKiBndXBfZmFzdCBsYXRlciBoYW5kbGVkIGJ5IHRoZSBwdGVwX2NsZWFyX2ZsdXNoIGFuZCB0aGUgVk1cbi1cdCAqIGhhbmRsZWQgYnkgdGhlIGFub25fdm1hIGxvY2sgKyBQR19sb2NrLlxuK1x0ICogZ3VwX2Zhc3QgbGF0ZXIgaGFuZGxlZCBieSB0aGUgcG1kcF9jb2xsYXBzZV9mbHVzaCgpIGFuZCB0aGUgVk1cbitcdCAqIGhhbmRsZWQgYnkgdGhlIGFub25fdm1hIGxvY2sgKyBmb2xpbyBsb2NrLlxuIFx0ICpcbiBcdCAqIFVGRkRJT19NT1ZFIGlzIHByZXZlbnRlZCB0byByYWNlIGFzIHdlbGwgdGhhbmtzIHRvIHRoZVxuIFx0ICogbW1hcF9sb2NrLlxuQEAgLTEzODksOSArMTQ4Niw5IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXHRcdHNwaW5fbG9jayhwbWRfcHRsKTtcbiBcdFx0Vk1fV0FSTl9PTl9PTkNFKCFwbWRfbm9uZSgqcG1kKSk7XG4gXHRcdC8qXG4tXHRcdCAqIFdlIGNhbiBvbmx5IHVzZSBzZXRfcG1kX2F0IHdoZW4gZXN0YWJsaXNoaW5nXG4rXHRcdCAqIFdlIGNhbiBvbmx5IHVzZSBzZXRfcG1kX2F0KCkgd2hlbiBlc3RhYmxpc2hpbmdcbiBcdFx0ICogaHVnZXBtZHMgYW5kIG5ldmVyIGZvciBlc3RhYmxpc2hpbmcgcmVndWxhciBwbWRzIHRoYXRcbi1cdFx0ICogcG9pbnRzIHRvIHJlZ3VsYXIgcGFnZXRhYmxlcy4gVXNlIHBtZF9wb3B1bGF0ZSBmb3IgdGhhdFxuK1x0XHQgKiBwb2ludHMgdG8gcmVndWxhciBwYWdldGFibGVzLiBVc2UgcG1kX3BvcHVsYXRlKCkgZm9yIHRoYXRcbiBcdFx0ICovXG4gXHRcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwbWRfcGd0YWJsZShfcG1kKSk7XG4gXHRcdHNwaW5fdW5sb2NrKHBtZF9wdGwpO1xuQEAgLTE0MzksNyArMTUzNiw3IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzXG4gXHRcdFx0c3Bpbl9sb2NrX25lc3RlZChwdGVfcHRsLCBTSU5HTEVfREVQVEhfTkVTVElORyk7XG4gXHRcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwbWRfcGd0YWJsZShfcG1kKSk7XG4gXHRcdG1hcF9hbm9uX2ZvbGlvX3B0ZV9ub3BmKGZvbGlvLCBwdGUsIHZtYSwgc3RhcnRfYWRkcixcbi1cdFx0XHRcdFx0ICAvKnVmZmRfd3A9Ki8gZmFsc2UpO1xuK1x0XHRcdFx0XHQgIC8qdWZmZD0qLyBmYWxzZSk7XG4gXHRcdGlmIChwdGVfcHRsICE9IHBtZF9wdGwpXG4gXHRcdFx0c3Bpbl91bmxvY2socHRlX3B0bCk7XG4gXHR9XG5AQCAtMTQ0OSwxMCArMTU0NiwxMCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc1xuIFxuIFx0cmVzdWx0ID0gU0NBTl9TVUNDRUVEO1xuIG91dF91cF93cml0ZTpcbi1cdGlmIChhbm9uX3ZtYV9sb2NrZWQpXG4tXHRcdGFub25fdm1hX3VubG9ja193cml0ZSh2bWEtXHUwMDNlYW5vbl92bWEpO1xuIFx0aWYgKHB0ZSlcbiBcdFx0cHRlX3VubWFwKHB0ZSk7XG4rXHRpZiAoYW5vbl92bWFfbG9ja2VkKVxuK1x0XHRhbm9uX3ZtYV91bmxvY2tfd3JpdGUodm1hLVx1MDAzZWFub25fdm1hKTtcbiBcdG1tYXBfd3JpdGVfdW5sb2NrKG1tKTtcbiBvdXRfbm9sb2NrOlxuIFx0aWYgKGZvbGlvKVxuQEAgLTE1OTMsNDIgKzE2OTAsNDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsXG4gXHRcdGJvb2wgKmxvY2tfZHJvcHBlZCwgc3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKVxuIHtcbi1cdGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcHRlc19zaGFyZWQgPSBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoY2MsIEhQQUdFX1BNRF9PUkRFUik7XG4tXHRjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfc3dhcCA9IGNvbGxhcHNlX21heF9wdGVzX3N3YXAoY2MsIEhQQUdFX1BNRF9PUkRFUik7XG4tXHR1bnNpZ25lZCBpbnQgbWF4X3B0ZXNfbm9uZSA9IGNvbGxhcHNlX21heF9wdGVzX25vbmUoY2MsIHZtYSwgSFBBR0VfUE1EX09SREVSKTtcbiBcdGVudW0gdHZhX3R5cGUgdHZhX2ZsYWdzID0gY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCA/IFRWQV9LSFVHRVBBR0VEIDogVFZBX0ZPUkNFRF9DT0xMQVBTRTtcbiBcdHBtZF90ICpwbWQ7XG4gXHRwdGVfdCAqcHRlLCAqX3B0ZSwgcHRldmFsO1xuIFx0aW50IGk7XG4tXHRpbnQgbm9uZV9vcl96ZXJvID0gMCwgc2hhcmVkID0gMCwgcmVmZXJlbmNlZCA9IDA7XG4tXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fRkFJTDtcbi1cdHN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDtcbiBcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMO1xuK1x0aW50IHJlZmVyZW5jZWQgPSAwO1xuK1x0ZW51bSBzY2FuX3Jlc3VsdCByZXN1bHQgPSBTQ0FOX0ZBSUw7XG4gXHR1bnNpZ25lZCBsb25nIGFkZHI7XG4gXHR1bnNpZ25lZCBsb25nIGVuYWJsZWRfb3JkZXJzO1xuIFx0c3BpbmxvY2tfdCAqcHRsO1xuLVx0aW50IG5vZGUgPSBOVU1BX05PX05PREUsIHVubWFwcGVkID0gMDtcbitcdGludCBub2RlID0gTlVNQV9OT19OT0RFO1xuK1x0ZW51bSBwdGVfY2hlY2tfcmVzdWx0IHB0ZV9jaGVjaztcbiBcbiBcdFZNX0JVR19PTihzdGFydF9hZGRyIFx1MDAyNiB+SFBBR0VfUE1EX01BU0spO1xuIFxuK1x0c3RydWN0IHB0ZV9jaGVja19jb250ZXh0IGN0eCA9IHtcbitcdFx0LmNjID0gY2MsXG4rXHRcdC52bWEgPSB2bWEsXG4rXHRcdC5vcmRlciA9IEhQQUdFX1BNRF9PUkRFUixcbitcdFx0Lm1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCB2bWEsIEhQQUdFX1BNRF9PUkRFUiksXG4rXHRcdC5tYXhfcHRlc19zd2FwID0gY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChjYywgSFBBR0VfUE1EX09SREVSKSxcbitcdFx0Lm1heF9wdGVzX3NoYXJlZCA9IGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChjYywgSFBBR0VfUE1EX09SREVSKSxcbitcdH07XG4rXG4gXHRyZXN1bHQgPSBmaW5kX3BtZF9vcl90aHBfb3Jfbm9uZShtbSwgc3RhcnRfYWRkciwgXHUwMDI2cG1kKTtcbiBcdGlmIChyZXN1bHQgIT0gU0NBTl9TVUNDRUVEKSB7XG4gXHRcdGNjLVx1MDAzZXByb2dyZXNzKys7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuLVx0Yml0bWFwX3plcm8oY2MtXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMsIE1BWF9QVFJTX1BFUl9QVEUpO1xuLVx0bWVtc2V0KGNjLVx1MDAzZW5vZGVfbG9hZCwgMCwgc2l6ZW9mKGNjLVx1MDAzZW5vZGVfbG9hZCkpO1xuLVx0bm9kZXNfY2xlYXIoY2MtXHUwMDNlYWxsb2Nfbm1hc2spO1xuK1x0Y29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oY2MpO1xuIFxuIFx0ZW5hYmxlZF9vcmRlcnMgPSBjb2xsYXBzZV9wb3NzaWJsZV9vcmRlcnModm1hLCB2bWEtXHUwMDNldm1fZmxhZ3MsIHR2YV9mbGFncyk7XG4gXG4gXHQvKlxuIFx0ICogSWYgUE1EIGlzIHRoZSBvbmx5IGVuYWJsZWQgb3JkZXIsIGVuZm9yY2UgbWF4X3B0ZXNfbm9uZSwgb3RoZXJ3aXNlXG4tXHQgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLlxuK1x0ICogc2NhbiBhbGwgcGFnZXMgdG8gcG9wdWxhdGUgdGhlIGJpdG1hcCBmb3IgbVRIUCBjb2xsYXBzZS4gVGhlIGJpdG1hcFxuK1x0ICogaXMgdGhlbiBjaGVja2VkIGFnYWluIGluIG10aHBfY29sbGFwc2UoKSBmb3IgZWFjaCBhdHRlbXB0ZWQgb3JkZXIuXG4gXHQgKi9cbiBcdGlmIChlbmFibGVkX29yZGVycyAhPSBCSVQoSFBBR0VfUE1EX09SREVSKSlcbi1cdFx0bWF4X3B0ZXNfbm9uZSA9IEtIVUdFUEFHRURfTUFYX1BURVNfTElNSVQ7XG4rXHRcdGN0eC5tYXhfcHRlc19ub25lID0gS0hVR0VQQUdFRF9NQVhfUFRFU19MSU1JVDtcbiBcbiBcdHB0ZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgc3RhcnRfYWRkciwgXHUwMDI2cHRsKTtcbiBcdGlmICghcHRlKSB7XG5AQCAtMTY0NCw4NCArMTc0NiwxNCBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBcbiBcdFx0Y2MtXHUwMDNlcHJvZ3Jlc3MrKztcbiBcbi1cdFx0aWYgKHB0ZV9ub25lX29yX3plcm8ocHRldmFsKSkge1xuLVx0XHRcdGlmICgrK25vbmVfb3JfemVybyBcdTAwM2UgbWF4X3B0ZXNfbm9uZSkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfTk9ORV9QVEU7XG4tXHRcdFx0XHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfTk9ORV9QVEUpO1xuLVx0XHRcdFx0Y291bnRfbXRocF9zdGF0KEhQQUdFX1BNRF9PUkRFUixcbi1cdFx0XHRcdFx0XHRNVEhQX1NUQVRfQ09MTEFQU0VfRVhDRUVEX05PTkUpO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdGlmICghcHRlX3ByZXNlbnQocHRldmFsKSkge1xuLVx0XHRcdGlmICgrK3VubWFwcGVkIFx1MDAzZSBtYXhfcHRlc19zd2FwKSB7XG4tXHRcdFx0XHRyZXN1bHQgPSBTQ0FOX0VYQ0VFRF9TV0FQX1BURTtcbi1cdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TV0FQX1BURSk7XG4tXHRcdFx0XHRjb3VudF9tdGhwX3N0YXQoSFBBR0VfUE1EX09SREVSLFxuLVx0XHRcdFx0XHRcdE1USFBfU1RBVF9DT0xMQVBTRV9FWENFRURfU1dBUCk7XG4tXHRcdFx0XHRnb3RvIG91dF91bm1hcDtcbi1cdFx0XHR9XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBBbHdheXMgYmUgc3RyaWN0IHdpdGggdWZmZC13cFxuLVx0XHRcdCAqIGVuYWJsZWQgc3dhcCBlbnRyaWVzLiAgUGxlYXNlIHNlZVxuLVx0XHRcdCAqIGNvbW1lbnQgYmVsb3cgZm9yIHB0ZV91ZmZkKCkuXG4tXHRcdFx0ICovXG4tXHRcdFx0aWYgKHB0ZV9zd3BfdWZmZF9hbnkocHRldmFsKSkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9QVEVfVUZGRDtcbi1cdFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHRcdH1cbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRpZiAocHRlX3VmZmQocHRldmFsKSkge1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogRG9uJ3QgY29sbGFwc2UgdGhlIHBhZ2UgaWYgYW55IG9mIHRoZSBzbWFsbFxuLVx0XHRcdCAqIFBURXMgYXJlIGFybWVkIHdpdGggdWZmZCB3cml0ZSBwcm90ZWN0aW9uLlxuLVx0XHRcdCAqIEhlcmUgd2UgY2FuIGFsc28gbWFyayB0aGUgbmV3IGh1Z2UgcG1kIGFzXG4tXHRcdFx0ICogd3JpdGUgcHJvdGVjdGVkIGlmIGFueSBvZiB0aGUgc21hbGwgb25lcyBpc1xuLVx0XHRcdCAqIG1hcmtlZCBidXQgdGhhdCBjb3VsZCBicmluZyB1bmtub3duXG4tXHRcdFx0ICogdXNlcmZhdWx0IG1lc3NhZ2VzIHRoYXQgZmFsbHMgb3V0c2lkZSBvZlxuLVx0XHRcdCAqIHRoZSByZWdpc3RlcmVkIHJhbmdlLiAgU28sIGp1c3QgYmUgc2ltcGxlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUFRFX1VGRkQ7XG4tXHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdH1cbi1cbi1cdFx0cGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRldmFsKTtcbi1cdFx0aWYgKHVubGlrZWx5KCFwYWdlKSB8fCB1bmxpa2VseShpc196b25lX2RldmljZV9wYWdlKHBhZ2UpKSkge1xuLVx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMO1xuLVx0XHRcdGdvdG8gb3V0X3VubWFwO1xuLVx0XHR9XG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICogSWYgdGhlIHZtYSBoYXMgdGhlIFZNX0RST1BQQUJMRSBmbGFnLCB0aGUgY29sbGFwc2Ugd2lsbFxuLVx0XHQgKiBwcmVzZXJ2ZSB0aGUgbGF6eWZyZWUgcHJvcGVydHkgd2l0aG91dCBuZWVkaW5nIHRvIHNraXAuXG4tXHRcdCAqL1xuLVx0XHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjYgISh2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpb190ZXN0X2xhenlmcmVlKGZvbGlvKSBcdTAwMjZcdTAwMjYgIXB0ZV9kaXJ0eShwdGV2YWwpKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX0xBWllGUkVFO1xuK1x0XHRwdGVfY2hlY2sgPSBjb2xsYXBzZV9jaGVja19wdGUocHRldmFsLCBhZGRyLCBcdTAwMjZjdHgpO1xuK1x0XHRmb2xpbyA9IGN0eC5mb2xpbztcbitcdFx0aWYgKHB0ZV9jaGVjayA9PSBQVEVfQ0hFQ0tfRkFJTCkge1xuK1x0XHRcdHJlc3VsdCA9IGN0eC5yZXN1bHQ7XG4gXHRcdFx0Z290byBvdXRfdW5tYXA7XG4gXHRcdH1cbi1cbi1cdFx0aWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKSB7XG4tXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX0FOT047XG4tXHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdH1cbi1cbi1cdFx0Lypcbi1cdFx0ICogV2UgdHJlYXQgYSBzaW5nbGUgcGFnZSBhcyBzaGFyZWQgaWYgYW55IHBhcnQgb2YgdGhlIFRIUFxuLVx0XHQgKiBpcyBzaGFyZWQuXG4tXHRcdCAqL1xuLVx0XHRpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChmb2xpbykpIHtcbi1cdFx0XHRpZiAoKytzaGFyZWQgXHUwMDNlIG1heF9wdGVzX3NoYXJlZCkge1xuLVx0XHRcdFx0cmVzdWx0ID0gU0NBTl9FWENFRURfU0hBUkVEX1BURTtcbi1cdFx0XHRcdGNvdW50X3ZtX2V2ZW50KFRIUF9TQ0FOX0VYQ0VFRF9TSEFSRURfUFRFKTtcbi1cdFx0XHRcdGNvdW50X210aHBfc3RhdChIUEFHRV9QTURfT1JERVIsXG4tXHRcdFx0XHRcdFx0TVRIUF9TVEFUX0NPTExBUFNFX0VYQ0VFRF9TSEFSRUQpO1xuLVx0XHRcdFx0Z290byBvdXRfdW5tYXA7XG4tXHRcdFx0fVxuLVx0XHR9XG4rXHRcdGlmIChwdGVfY2hlY2sgPT0gUFRFX0NIRUNLX0NPTlRJTlVFKVxuK1x0XHRcdGNvbnRpbnVlO1xuIFxuIFx0XHQvKiBTZXQgYml0IGZvciBvY2N1cGllZCBwYWdlcyAqL1xuIFx0XHRfX3NldF9iaXQoaSwgY2MtXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMpO1xuQEAgLTE3NDksMzEgKzE3ODEsMjEgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdC8qXG4gXHRcdCAqIENoZWNrIGlmIHRoZSBwYWdlIGhhcyBhbnkgR1VQIChvciBvdGhlciBleHRlcm5hbCkgcGlucy5cbiBcdFx0ICpcbi1cdFx0ICogSGVyZSB0aGUgY2hlY2sgbWF5IGJlIHJhY3k6XG4tXHRcdCAqIGl0IG1heSBzZWUgZm9saW9fbWFwY291bnQoKSBcdTAwM2UgZm9saW9fcmVmX2NvdW50KCkuXG4tXHRcdCAqIEJ1dCBzdWNoIGNhc2UgaXMgZXBoZW1lcmFsIHdlIGNvdWxkIGFsd2F5cyByZXRyeSBjb2xsYXBzZVxuLVx0XHQgKiBsYXRlci4gIEhvd2V2ZXIgaXQgbWF5IHJlcG9ydCBmYWxzZSBwb3NpdGl2ZSBpZiB0aGUgcGFnZVxuLVx0XHQgKiBoYXMgZXhjZXNzaXZlIEdVUCBwaW5zIChpLmUuIDUxMikuICBBbnl3YXkgdGhlIHNhbWUgY2hlY2tcbi1cdFx0ICogd2lsbCBiZSBkb25lIGFnYWluIGxhdGVyIHRoZSByaXNrIHNlZW1zIGxvdy5cbitcdFx0ICogSGVyZSB0aGUgY2hlY2sgaXMgcmFjeSwgYnV0IHN1Y2ggY2FzZSBpcyBlcGhlbWVyYWwgYW5kXG4rXHRcdCAqIHdlIGNvdWxkIGFsd2F5cyByZXRyeSBjb2xsYXBzZSBsYXRlci4gQW55d2F5IHRoZSBzYW1lXG4rXHRcdCAqIGNoZWNrIHdpbGwgYmUgZG9uZSBhZ2FpbiBsYXRlciB0aGUgcmlzayBzZWVtcyBsb3cuXG4gXHRcdCAqL1xuIFx0XHRpZiAoZm9saW9fZXhwZWN0ZWRfcmVmX2NvdW50KGZvbGlvKSAhPSBmb2xpb19yZWZfY291bnQoZm9saW8pKSB7XG4gXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX0NPVU5UO1xuIFx0XHRcdGdvdG8gb3V0X3VubWFwO1xuIFx0XHR9XG4gXG4tXHRcdC8qXG4tXHRcdCAqIElmIGNvbGxhcHNlIHdhcyBpbml0aWF0ZWQgYnkga2h1Z2VwYWdlZCwgY2hlY2sgdGhhdCB0aGVyZSBpc1xuLVx0XHQgKiBlbm91Z2ggeW91bmcgcHRlIHRvIGp1c3RpZnkgY29sbGFwc2luZyB0aGUgcGFnZVxuLVx0XHQgKi9cbi1cdFx0aWYgKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAocHRlX3lvdW5nKHB0ZXZhbCkgfHwgZm9saW9fdGVzdF95b3VuZyhmb2xpbykgfHxcbi1cdFx0ICAgICBmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIHx8XG4tXHRcdCAgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLVx1MDAzZXZtX21tLCBhZGRyKSkpXG4rXHRcdGlmIChwdGVfaXNfcmVmZXJlbmNlZChjYywgcHRldmFsLCBmb2xpbywgdm1hLCBhZGRyKSlcbiBcdFx0XHRyZWZlcmVuY2VkKys7XG4gXHR9XG4gXHRpZiAoY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCBcdTAwMjZcdTAwMjZcbiBcdFx0ICAgKCFyZWZlcmVuY2VkIHx8XG4tXHRcdCAgICAodW5tYXBwZWQgXHUwMDI2XHUwMDI2IHJlZmVyZW5jZWQgXHUwMDNjIEhQQUdFX1BNRF9OUiAvIDIpKSkge1xuK1x0XHQgICAgKGN0eC51bm1hcHBlZCBcdTAwMjZcdTAwMjYgcmVmZXJlbmNlZCBcdTAwM2MgSFBBR0VfUE1EX05SIC8gMikpKSB7XG4gXHRcdHJlc3VsdCA9IFNDQU5fTEFDS19SRUZFUkVOQ0VEX1BBR0U7XG4gXHR9IGVsc2Uge1xuIFx0XHRyZXN1bHQgPSBTQ0FOX1NVQ0NFRUQ7XG5AQCAtMTc4MSwxNiArMTgwMywxNiBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcbiBvdXRfdW5tYXA6XG4gXHRwdGVfdW5tYXBfdW5sb2NrKHB0ZSwgcHRsKTtcbiBcdGlmIChyZXN1bHQgPT0gU0NBTl9TVUNDRUVEKSB7XG4tXHRcdC8qIGNvbGxhcHNlX2h1Z2VfcGFnZSBleHBlY3RzIHRoZSBsb2NrIHRvIGJlIGRyb3BwZWQgYmVmb3JlIGNhbGxpbmcgKi9cbitcdFx0LyogY29sbGFwc2VfaHVnZV9wYWdlKCkgZXhwZWN0cyB0aGUgbG9jayB0byBiZSBkcm9wcGVkIGJlZm9yZSBjYWxsaW5nICovXG4gXHRcdG1tYXBfcmVhZF91bmxvY2sobW0pO1xuIFx0XHRyZXN1bHQgPSBtdGhwX2NvbGxhcHNlKG1tLCBzdGFydF9hZGRyLCByZWZlcmVuY2VkLFxuLVx0XHRcdFx0ICAgICAgIHVubWFwcGVkLCBjYywgZW5hYmxlZF9vcmRlcnMpO1xuK1x0XHRcdFx0ICAgICAgIGN0eC51bm1hcHBlZCwgY2MsIGVuYWJsZWRfb3JkZXJzKTtcbiBcdFx0LyogbW1hcF9sb2NrIHdhcyByZWxlYXNlZCBhYm92ZSwgc2V0IGxvY2tfZHJvcHBlZCAqL1xuIFx0XHQqbG9ja19kcm9wcGVkID0gdHJ1ZTtcbiBcdH1cbiBvdXQ6XG4gXHR0cmFjZV9tbV9raHVnZXBhZ2VkX3NjYW5fcG1kKG1tLCBmb2xpbywgcmVmZXJlbmNlZCxcbi1cdFx0XHRcdCAgICAgbm9uZV9vcl96ZXJvLCByZXN1bHQsIHVubWFwcGVkKTtcbitcdFx0XHRcdCAgICAgY3R4Lm5vbmVfb3JfemVybywgcmVzdWx0LCBjdHgudW5tYXBwZWQpO1xuIFx0cmV0dXJuIHJlc3VsdDtcbiB9XG4gXG5AQCAtMjY5MSw4ICsyNzEzLDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuIFxuIFx0cHJlc2VudCA9IDA7XG4gXHRzd2FwID0gMDtcbi1cdG1lbXNldChjYy1cdTAwM2Vub2RlX2xvYWQsIDAsIHNpemVvZihjYy1cdTAwM2Vub2RlX2xvYWQpKTtcbi1cdG5vZGVzX2NsZWFyKGNjLVx1MDAzZWFsbG9jX25tYXNrKTtcbitcdGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTtcbiBcdHJjdV9yZWFkX2xvY2soKTtcbiBcdHhhc19mb3JfZWFjaChcdTAwMjZ4YXMsIGZvbGlvLCBzdGFydCArIEhQQUdFX1BNRF9OUiAtIDEpIHtcbiBcdFx0aWYgKHhhc19yZXRyeShcdTAwMjZ4YXMsIGZvbGlvKSlcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjM5OjAwLjM4MDA1MDhaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoyNzM0NTU3NjIzNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEtodWdlcGFnZWQgQ29sbGFwc2UgTG9naWMgUmVmYWN0b3IqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIHRoYXQgc2VlbXMgdG8gYmUgYSByZWZhY3RvcmluZyBvZiB0aGUga2h1Z2VwYWdlZCBjb2xsYXBzZSBsb2dpYywgc3BlY2lmaWNhbGx5IHRoZSBQVEUgc2Nhbm5pbmcgcGFydCwgbW9kaWZ5aW5nIGBtbS9raHVnZXBhZ2VkLmNgIGFuZCBgRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0YC4gVGhlIG1haW4gY2hhbmdlcyBhcHBlYXIgdG8gYmUgdGhlIGludHJvZHVjdGlvbiBvZiBhIG5ldyBgcHRlX2NoZWNrX2NvbnRleHRgIHN0cnVjdCBhbmQgYSBuZXcgZnVuY3Rpb24gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCB0byBjZW50cmFsaXplIFBURSBjaGVja2luZy4gU2V2ZXJhbCBvdGhlciByZWxhdGVkIGZ1bmN0aW9ucyBsaWtlIGBwdGVfaXNfcmVmZXJlbmNlZCgpYCwgYGNvdW50X2NvbGxhcHNlX2V2ZW50KClgLCBhbmQgYGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKClgIGFyZSBhZGRlZCBvciBtb2RpZmllZCBhcyB3ZWxsLiBNeSBpbml0aWFsIGltcHJlc3Npb24gaXMgdGhhdCB0aGlzIGlzIGEgY2xlYW4tdXAsIGJ1dCBJIG5lZWQgdG8gYmUgc3VyZS5cblxuTG9va2luZyBjbG9zZWx5IGF0IHRoZSBkaWZmIGluIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCwgSSBzZWUgdGhhdCBhIHNlcmllcyBvZiBjaGVja3MgaGF2ZSBiZWVuIG1vdmVkIGludG8gdGhlIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgZnVuY3Rpb24uIE15IGZpcnN0IHRob3VnaHQgaXMgXCJvaywgdGhpcyBzZWVtcyBsaWtlIGp1c3QgYSBsb2dpY2FsIGdyb3VwaW5nIGFuZCBzaW1wbGlmaWNhdGlvbi5cIiBUaGUgb3JpZ2luYWwgY29kZSBkaWQgaW5saW5lIGNoZWNrcyB3aXRoIGBwdGVfbm9uZV9vcl96ZXJvKClgLCBgcHRlX3ByZXNlbnQoKWAsIGFuZCBzb21lIGZvbGlvIHRlc3RzLiBOb3csIHRoZXNlIGFyZSBhbGwgZG9uZSB3aXRoaW4gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYC5cblxuSG93ZXZlciwgYXMgSSBkaXZlIGRlZXBlciwgSSBub3RpY2Ugc3VidGxlIGRldGFpbHMuIEluIGBjb2xsYXBzZV9jaGVja19wdGUoKWAsIHRoZSBjb250ZXh0IHN0cnVjdCBpcyBpbml0aWFsaXplZC4gQ29tcGFyaW5nIHRoaXMgdG8gdGhlIG9sZGVyIHZlcnNpb24sIEkgd2FudCB0byB2ZXJpZnkgaWYgdGhlcmUgaXMgYW55IGZ1bmN0aW9uYWwgY2hhbmdlLiBMb29raW5nIGNsb3NlciwgdGhlcmUgaXMgYSBgY3R4LVx1MDAzZXVubWFwcGVkYCB3aGljaCBpcyBpbml0aWFsaXplZCB0byBgLTFgIGluIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgLiBUaGlzIGlzIGltcG9ydGFudCwgYXMgaXQgaGFuZGxlcyBhIGRpZmZlcmVudCBjYXNlIHRoYW4gaW4gYGNvbGxhcHNlX3NjYW5fcG1kKClgLiBJbiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAsIHRoZSBpbml0aWFsaXphdGlvbiBpcyBpbXBsaWNpdCwgYnV0IEkgbmVlZCB0byB2ZXJpZnkgdGhhdCBhbGwgdGhlIG9sZCBhbmQgbmV3IGNvbnRleHRzIGFyZSBjb21wYXJhYmxlLiBUaGUgb2xkIGNvZGUgaGFkIGBpbnQgdW5tYXBwZWQgPSAwO2AgYW5kIHNvIG9uLCBzbyBub3cgSSBuZWVkIHRvIGNoZWNrIHRoZSBkZWZhdWx0IHZhbHVlcy4gU28gdGhlIGRlZmF1bHQgdmFsdWVzIGFyZSBhbHNvIDAuIGBub25lX29yX3plcm9gIGFuZCBgc2hhcmVkYCBhcmUgYWxzbyAwLiBTbyBubyBmdW5jdGlvbmFsIGNoYW5nZSBoZXJlLlxuXG5UaGVuLCB0aGVyZSBpcyB0aGUgZnVuY3Rpb25hbCBlcXVpdmFsZW5jZSBvZiBgdm1fbm9ybWFsX2ZvbGlvKClgIHZzIHRoZSBvbGQgYHZtX25vcm1hbF9wYWdlKClgICsgYHBhZ2VfZm9saW8oKWAgY29tYmluYXRpb24uIEFsdGhvdWdoIHRoZXkgYXJlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IGZvciBtb3N0IGNhc2VzLCBgdm1fbm9ybWFsX2ZvbGlvKClgIG1pZ2h0IGJlIHNsaWdodGx5IGRpZmZlcmVudC4gU28gdGhpcyBwYXJ0IGlzIGFsc28gcmVmYWN0b3JpbmcuIFRoZSBzYW1lIGdvZXMgZm9yIHRoZSBhZGRpdGlvbiBvZiBgY291bnRfY29sbGFwc2VfZXZlbnQoKWAsIGl0IGlzIGEgc2ltcGxlIHJlZmFjdG9yaW5nLlxuXG5XYWl0LCBsb29raW5nIGF0IGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgLCBJIG9ic2VydmUgYSBjcml0aWNhbCBjaGFuZ2U6IGBWTV9CVUdfT05fRk9MSU9gIGlzIGJlaW5nIHJlcGxhY2VkIGJ5IGBWTV9XQVJOX09OX0ZPTElPYC4gVGhpcyBjaGFuZ2UgaXMgYWxzbyBhZGRlZCBpbiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAhIFRoaXMgaXMgcG90ZW50aWFsbHkgc2lnbmlmaWNhbnQhIEluIHRoZSBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBjYWxsIHNpdGUsIHRoZSBvbGQgY29kZSBoYWQgYSBgVk1fQlVHX09OX0ZPTElPYCBjaGVjaywgYnV0IGl0IGlzIHJlcGxhY2VkIHdpdGggYFZNX1dBUk5fT05fRk9MSU9gIG5vdy4gSW4gdGhlIG90aGVyIGNhbGwgc2l0ZSwgYGNvbGxhcHNlX3NjYW5fcG1kKClgLCBpdCB1c2VkIHRvIHNpbXBseSByZXR1cm4gYFNDQU5fUEFHRV9BTk9OYCB3aGVuIGl0IGZvdW5kIGEgbm9uLWFub255bW91cyBwYWdlLiBOb3csIGl0IHdpbGwgdHJpZ2dlciBhIGBWTV9XQVJOX09OX0ZPTElPYCBpZiBpdCdzIG5vdCBhbm9uISBUaGlzIGlzIGEgZG93bmdyYWRlIGZvciBvbmUgY2FsbCBzaXRlLCBidXQgYW4gaW50cm9kdWN0aW9uIG9mIGEgbmV3IHdhcm5pbmcgZm9yIHRoZSBvdGhlci5cblxuU28gdGhlIHF1ZXN0aW9uIGJlY29tZXM6IGNhbiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgZXZlciBlbmNvdW50ZXIgYSBub24tYW5vbnltb3VzIGZvbGlvPyBJJ2xsIG5lZWQgdG8gdmVyaWZ5IHRoZSBjYWxsIHBhdGhzIG9mIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCwgd2hpY2ggaXMgY2FsbGVkIGZyb20gYGtodWdlcGFnZWRfc2Nhbl9wbWQoKWAsIHdoaWNoIGlzIGNhbGxlZCBmcm9tIGBraHVnZXBhZ2VkX3NjYW5fbW1fc2xvdCgpYC4gSXQgc2NhbnMgYW5vbnltb3VzIFZNQXMsIG1lYW5pbmcgdGhlIG5vbi1hbm9uIGZvbGlvIG11c3QgY29tZSBmcm9tIGEgc291cmNlIHRoYXQga2h1Z2VwYWdlZCBpbnRlcmFjdHMgd2l0aC4gSSdtIHRoaW5raW5nIHRoZSB6ZXJvIHBhZ2UgaXMgaGFuZGxlZCBieSBgcHRlX25vbmVfb3JfemVybygpYC4gSXQgbG9va3MgbGlrZSB0aGlzIG5ldyB3YXJuaW5nIGNvdWxkIGJlIHRyaWdnZXJlZCBieSBzb21ldGhpbmcgbGlrZSBhIFZNQSBiZWluZyBhbm9ueW1vdXMsIGJ1dCB0aGUgdW5kZXJseWluZyBwYWdlIG5vdCBhY3R1YWxseSBiZWluZyBhbm9ueW1vdXMuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGludHJvZHVjZSBhbnkgbmV3IGluc3RhYmlsaXR5IGR1ZSB0byBuZXcgd2FybmluZ3MuIEknbGwgbmVlZCB0byBjaGVjayB0aGUgVk1BIHRvIHZlcmlmeSB3aGV0aGVyIGBraHVnZXBhZ2VkYCBjYW4gYWN0dWFsbHkgaW50ZXJhY3Qgd2l0aCB0aGlzIGNhc2Ugb3Igbm90LCBhbmQgd2hldGhlciB0aGF0IGZvbGlvIGNhbiBhY3R1YWxseSBiZSBub24tYW5vbi5cblxuSSdtIG5vdyBnb2luZyB0byB1c2UgYGRlZmF1bHRfYXBpOmdyZXBwZXJgIHRvIHNlYXJjaCBmb3IgYGNvbGxhcHNlX3NjYW5fcG1kYCB0byB2ZXJpZnkgbXkgZmluZGluZ3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExMjM2LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgyMiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjM5OjI3LjcyNTYyOTIxNVoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjA4Njk5MDM1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbGxhcHNlX3NjYW5fcG1kXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2todWdlcGFnZWQuYz0xMjI0PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNoZWNrX3BtZF9zdGlsbF92YWxpZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMjM4LSAqIEJyaW5nIG1pc3NpbmcgcGFnZXMgaW4gZnJvbSBzd2FwLCB0byBjb21wbGV0ZSBUSFAgY29sbGFwc2UuXFxubW0va2h1Z2VwYWdlZC5jOjEyMzk6ICogT25seSBkb25lIGlmIGNvbGxhcHNlX3NjYW5fcG1kKCkgYmVsaWV2ZXMgaXQgaXMgd29ydGh3aGlsZS5cXG5tbS9raHVnZXBhZ2VkLmMtMTI0MC0gKlxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTE1NjI9c3RhdGljIHVuc2lnbmVkIGludCBtYXhfb3JkZXJfZnJvbV9vZmZzZXQodW5zaWduZWQgaW50IG9mZnNldClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNTcxLSAqIG10aHBfY29sbGFwc2UoKSBjb25zdW1lcyB0aGUgYml0bWFwIHRoYXQgaXMgZ2VuZXJhdGVkIGR1cmluZ1xcbm1tL2todWdlcGFnZWQuYzoxNTcyOiAqIGNvbGxhcHNlX3NjYW5fcG1kKCkgdG8gZGV0ZXJtaW5lIHdoYXQgcmVnaW9ucyBhbmQgbVRIUCBvcmRlcnMgZml0IGJlc3QuXFxubW0va2h1Z2VwYWdlZC5jLTE1NzMtICpcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0xNTg3PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IG10aHBfY29sbGFwc2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTY4OC1cXG5tbS9raHVnZXBhZ2VkLmM6MTY4OTpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG5tbS9raHVnZXBhZ2VkLmMtMTY5MC1cXHRcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTI4MTE9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2luZ2xlX3BtZCh1bnNpZ25lZCBsb25nIGFkZHIsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMjgyMy1cXHRpZiAodm1hX2lzX2Fub255bW91cyh2bWEpKSB7XFxubW0va2h1Z2VwYWdlZC5jOjI4MjQ6XFx0XFx0cmVzdWx0ID0gY29sbGFwc2Vfc2Nhbl9wbWQobW0sIHZtYSwgYWRkciwgbG9ja19kcm9wcGVkLCBjYyk7XFxubW0va2h1Z2VwYWdlZC5jLTI4MjUtXFx0XFx0Z290byBlbmQ7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjM5OjI5LjMzNDM1NDAxWiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTIzMjAyNTU5NzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEtlcm5lbCBCdWcgaW4gYGNvbGxhcHNlX3NjYW5fcG1kKClgKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgYGNvbGxhcHNlX3NjYW5fcG1kKClgIGFuZCBpdCdzIGNhbGxlZCB3aGVuIHRoZSBWTUEgaXMgYW5vbnltb3VzLCBzcGVjaWZpY2FsbHkgd2hlbiBgdm1hX2lzX2Fub255bW91cyh2bWEpYCBpcyB0cnVlLiBNeSBmaXJzdCB0aG91Z2h0IGlzOiBjYW4gYW4gYW5vbnltb3VzIFZNQSAqYWN0dWFsbHkqIGNvbnRhaW4gYSBub24tYW5vbnltb3VzIGZvbGlvPyBJIGltbWVkaWF0ZWx5IGtub3cgdGhhdCBhIGBNQVBfUFJJVkFURWAgbWFwcGluZyBvZiBhIGZpbGUgd291bGQgcmV0dXJuIGZhbHNlIGZvciBgdm1hX2lzX2Fub255bW91cyh2bWEpYC4gQnV0IHdoYXQgYWJvdXQgYE1BUF9BTk9OWU1PVVMgfCBNQVBfU0hBUkVEYD8gVGhhdCdzIGEgc2htZW0gVk1BLCBhZ2FpbiwgYHZtYV9pc19hbm9ueW1vdXModm1hKWAgaXMgZmFsc2UuICBBIHN0YW5kYXJkIGBtbWFwKE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSlgIGNyZWF0ZXMgYW4gKmFub255bW91cyogVk1BLCBidXQgY291bGQgaXQgaGF2ZSBhIG5vbi1hbm9uIGZvbGlvPyAgSSBjb25zaWRlciBLU00gcGFnZXMsIGJ1dCB0aGV5J3JlIGFub24sIHNvIG5vIGx1Y2sgdGhlcmUuIFVwcm9iZXM/IFN0aWxsIGFub24uIFB0cmFjZSBpbnNlcnRlZCBwYWdlcz8gU3RpbGwgYW5vbi5cblxuQWhhISBXaGF0IGlmIGEgZGV2aWNlIGRyaXZlciB1c2VzIGB2bV9pbnNlcnRfcGFnZSgpYCB0byBtYXAgcGFnZXMgaW50byBhbiBhbm9ueW1vdXMgVk1BPyBJZiBhIGRyaXZlciBkb2VzIGRvIGEgYHZtX2luc2VydF9wYWdlKClgIGludG8gYW4gYW5vbnltb3VzIFZNQSwgdGhhdCBwYWdlICptaWdodCogbm90IGJlIGFub255bW91cy4gR29vZC4gTGV0J3Mgc2VlLi4uIGB2bV9ub3JtYWxfZm9saW8oKWAgd2lsbCByZXR1cm4gdGhlIGZvbGlvLiBJZiBpdCdzIG5vdCBhbm9uLCBgZm9saW9fdGVzdF9hbm9uKClgIHdpbGwgcmV0dXJuIGZhbHNlLiBBbmQsIHRoZSBjcnVjaWFsIHBhcnQsIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgd2lsbCB0cmlnZ2VyIGEgYFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihjdHgtXHUwMDNlZm9saW8pLCBjdHgtXHUwMDNlZm9saW8pO2AuIFdhaXQsIGlzIHRoaXMgYSBidWcgaW4gdGhlIHBhdGNoPyAgSXQgZGlkbid0IHVzZWQgdG8gaGF2ZSB0aGF0IHdhcm5pbmchIExldCBtZSBjaGVjayB0aGUgb3JpZ2luYWwgY29kZS4uLlxuXG5Pa2F5LCBJIHNlZSBpdC4gVGhlIG9yaWdpbmFsIGNvZGUganVzdCByZXR1cm5lZCBgU0NBTl9QQUdFX0FOT05gLiBUaGUgbmV3IGNvZGUgbm93IGFkZHMgYSBgVk1fV0FSTl9PTl9GT0xJT2AsIHdoaWNoIG1lYW5zIHRoZSBjdXJyZW50IHBhdGNoIGludHJvZHVjZWQgYSBmdW5jdGlvbmFsIGNoYW5nZS4gVGhhdOKAmXMgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGZ1enplZCFcblxuQ2FuIHdlIGV2ZW4gdHJpZ2dlciB0aGlzIHdhcm5pbmc/IEhvdyBjb3VsZCB3ZSBnZXQgYSBub24tYW5vbiBwYWdlIGludG8gYW4gYW5vbiBWTUE/IFRoZSBiZXN0IHdheSBJIHRoaW5rIHdvdWxkIGJlIGZvciBzeXprYWxsZXIgdG8gbWFwIGEgbm9uLWFub24gcGFnZSBpbnRvIGFuIGFub255bW91cyBWTUEgYW5kIHRoZW4gdHJpZ2dlciBraHVnZXBhZ2VkIHRvIHNjYW4gaXQsIHdoaWNoIHNob3VsZCB0cmlnZ2VyIHRoZSB3YXJuaW5nLlxuXG5JIHN0YXJ0IHJ1bm5pbmcgdGhyb3VnaCBwb3NzaWJsZSBhdmVudWVzOiBgbW1hcChNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUpYCB3b24ndCB3b3JrIHRvIG1hcCBhIG5vbi1hbm9uIHBhZ2UuIFdoYXQgYWJvdXQgYG1yZW1hcGA/IE5vLCBpdCBqdXN0IG1vdmVzIHRoZSB3aG9sZSBWTUEuIFdoYXQgYWJvdXQgYHZtc3BsaWNlYD8gV2hhdCBhYm91dCBgdXNlcmZhdWx0ZmRgPyBXaXRoIGBVRkZESU9fQ09QWWAsIGl0IGNvcGllcyBpbnRvIGFuIGFub24gcGFnZS4gQnV0IHdoYXQgYWJvdXQgYFVGRkRJT19DT05USU5VRWA/IFRoYXQncyBmb3Igc2htZW0vaHVnZXRsYi4gYG1hZHZpc2UoTUFEVl9NRVJHRUFCTEUpYD8gS1NNIHBhZ2VzIGFyZSBhbm9uLCBhZ2Fpbi4gYE9fRElSRUNUYCByZWFkIGludG8gYW4gYW5vbiBWTUE/IFBhZ2VzIGFyZSBhbm9uLiBXaGF0IGFib3V0IGBnZXRfdXNlcl9wYWdlc2A/XG5cbldhaXQsIHdoYXQgaWYgd2UgdXNlIGBtbWFwYCB0byBtYXAgYSBmaWxlLCB0aGVuIGBtcHJvdGVjdGA/IE5vLiBXaGF0IGFib3V0IGByZW1hcF9maWxlX3BhZ2VzYD8gSXQgd2FzIGRlcHJlY2F0ZWQuXG5cbk9rYXksIGxldCdzIHJlY2FwLiBJdCBpcyBwb3NzaWJsZSB0byB0cmlnZ2VyIHRoaXMgY2FzZS4gVG8gbWFwIGEgbm9uLWFub24gZm9saW8gaW50byBhbm9uIFZNQSB3ZSBzaG91bGQgc2VhcmNoIHRocm91Z2ggcG9zc2libGUgd2F5cywgZm9yIGV4YW1wbGU6IGEgZGV2aWNlIGRyaXZlciB1c2VzIGB2bV9pbnNlcnRfcGFnZSgpYCB0byBtYXAgcGFnZXMgaW50byBhbiBhbm9ueW1vdXMgVk1BLiBUaGlzIGlzIGRlZmluaXRlbHkgYSBidWcgaW4gdGhlIHBhdGNoISBMZXQncyBzZWFyY2ggZm9yIGBTQ0FOX1BBR0VfQU5PTmAgaW4gdGhlIGtlcm5lbCBzb3VyY2UgdG8gc2VlIGlmIHRoaXMgaXMgYSBrbm93biBpc3N1ZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTU1MjAsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4MDgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6Mzk6NDEuNjU0NjEyOTc2WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI2NTE4NTk1NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiU0NBTl9QQUdFX0FOT05cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC0yNi1cXHRFTSggU0NBTl9QQUdFX0xPQ0ssXFx0XFx0XFxcInBhZ2VfbG9ja2VkXFxcIilcXHRcXHRcXHRcXFxcXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaDoyNzpcXHRFTSggU0NBTl9QQUdFX0FOT04sXFx0XFx0XFxcInBhZ2Vfbm90X2Fub25cXFwiKVxcdFxcdFxcXFxcXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTI4LVxcdEVNKCBTQ0FOX1BBR0VfTEFaWUZSRUUsXFx0XFx0XFxcInBhZ2VfbGF6eWZyZWVcXFwiKVxcdFxcdFxcXFxcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0zMz1lbnVtIHNjYW5fcmVzdWx0IHtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy00OS1cXHRTQ0FOX1BBR0VfTE9DSyxcXG5tbS9raHVnZXBhZ2VkLmM6NTA6XFx0U0NBTl9QQUdFX0FOT04sXFxubW0va2h1Z2VwYWdlZC5jLTUxLVxcdFNDQU5fUEFHRV9MQVpZRlJFRSxcXG4tLVxcbm1tL2todWdlcGFnZWQuYz03NDc9c3RhdGljIGVudW0gcHRlX2NoZWNrX3Jlc3VsdCBjb2xsYXBzZV9jaGVja19wdGUocHRlX3QgcHRldmFsLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTc5Mi1cXHRcXHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oY3R4LVxcdTAwM2Vmb2xpbyksIGN0eC1cXHUwMDNlZm9saW8pO1xcbm1tL2todWdlcGFnZWQuYzo3OTM6XFx0XFx0cmV0dXJuIHB0ZV9jaGVja19mYWlsKGN0eCwgU0NBTl9QQUdFX0FOT04pO1xcbm1tL2todWdlcGFnZWQuYy03OTQtXFx0fVxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTExNTM9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMTg2LVxcdGlmIChleHBlY3RfYW5vbiBcXHUwMDI2XFx1MDAyNiAoISgqdm1hcCktXFx1MDAzZWFub25fdm1hIHx8ICF2bWFfaXNfYW5vbnltb3VzKCp2bWFwKSkpXFxubW0va2h1Z2VwYWdlZC5jOjExODc6XFx0XFx0cmV0dXJuIFNDQU5fUEFHRV9BTk9OO1xcbm1tL2todWdlcGFnZWQuYy0xMTg4LVxcdHJldHVybiBTQ0FOX1NVQ0NFRUQ7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjM5OjQ0LjMwNjQ3ODg0NloiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwMDUzMzgyNzM0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgS2h1Z2VwYWdlZCBBbm9ueW1vdXMgUGFnZSBDb2xsYXBzZSBMb2dpYyoqXG5cbk9rYXksIHNvIEknbSBkaWdnaW5nIGludG8gdGhpcyBgaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUoKWAgZnVuY3Rpb24gYW5kIEkgc2VlIGl0IHJldHVybnMgYFNDQU5fUEFHRV9BTk9OYCB3aGVuIGBleHBlY3RfYW5vbmAgaXMgdHJ1ZSwgYnV0IHRoZSBWTUEgaXNuJ3QgYW5vbnltb3VzIGFueW1vcmUuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBcIldoZXJlIGFyZSB3ZSBjaGVja2luZyB0aGlzP1wiIFRoZW4gSSByZW1lbWJlciB0aGF0IGBjb2xsYXBzZV9jaGVja19wdGUoKWAgaXMgY2FsbGVkIHdoZW4gc2Nhbm5pbmcgdGhlIFBURXMuXG5cbk5vdywgaGVyZSdzIHdoZXJlIGl0IGdldHMgaW50ZXJlc3RpbmcuIEknbSBsb29raW5nIGF0IGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgIGFuZCByZWFsaXplIHRoZSBvbGQgY29kZSBhbHJlYWR5IGhhZCBgVk1fQlVHX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7YC4gVGhpcyBlbnN1cmVzIHRoYXQgd2UgYXJlIGNvbGxhcHNpbmcgYW5vbiBwYWdlcyBhbmQgdGhyb3dzIGEgVk0gYnVnIGlmIG5vdC5cblxuVGhlIHBhdGNoIHJlcGxhY2VzIHRoaXMgd2l0aCBgY29sbGFwc2VfY2hlY2tfcHRlKClgLCB3aGljaCBoYXMgYFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihjdHgtXHUwMDNlZm9saW8pLCBjdHgtXHUwMDNlZm9saW8pO2AuIFNvLCB0aGUgcGF0Y2ggYWN0dWFsbHkgKmRvd25ncmFkZXMqIGEgYFZNX0JVR19PTl9GT0xJT2AgdG8gYSBgVk1fV0FSTl9PTl9GT0xJT2AgaW4gYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAhIEF0IHRoZSBzYW1lIHRpbWUgaXQgKnVwZ3JhZGVzKiBhIHNpbGVudCByZXR1cm4gdG8gYFZNX1dBUk5fT05fRk9MSU9gIGluIGBjb2xsYXBzZV9zY2FuX3BtZCgpYC5cblxuSG9sZCBvbiwgSSBuZWVkIHRvIHRyYWNlIHRoZSBjYWxsIGZsb3cuIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgIGlzIGNhbGxlZCBmcm9tIGBjb2xsYXBzZV9odWdlX3BhZ2UoKWAsIHdoaWNoIGlzIGNhbGxlZCAqYWZ0ZXIqIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBoYXMgc3VjY2VlZGVkLiBTbyBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgc2NhbnMgdGhlIFBNRCBhbmQgaWYgaXQgZmluZHMgYSBub24tYW5vbnltb3VzIGZvbGlvLCBpdCAqdXNlZCogdG8gc2lsZW50bHkgcmV0dXJuIGBTQ0FOX1BBR0VfQU5PTmAuIElmIGl0ICpzdWNjZWVkZWQqLCBhbGwgdGhlIGZvbGlvcyB3ZXJlIGFub255bW91cy4gVGhlbiwgYGNvbGxhcHNlX2h1Z2VfcGFnZSgpYCBpcyBjYWxsZWQsIHdoaWNoIGNhbGxzIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgLiBJbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCwgaXQgdXNlZCB0byBoYXZlIHRoZSBgVk1fQlVHX09OX0ZPTElPYCwgYmVjYXVzZSBpdCAqYXNzdW1lZCogdGhhdCBzaW5jZSBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgYWxyZWFkeSBjaGVja2VkLCBpdCBtdXN0IGJlIGFub255bW91cy5cblxuQnV0IHdhaXQgYSBtaW51dGXigKYgdGhlIGBtbWFwX2xvY2tgIGlzIGRyb3BwZWQgKmJldHdlZW4qIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBhbmQgYGNvbGxhcHNlX2h1Z2VfcGFnZSgpYCEgIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBkcm9wcyB0aGUgbG9jayBiZWZvcmUgY2FsbGluZyBgbXRocF9jb2xsYXBzZSgpYC5cblxuTm93LCBpcyBgbXRocF9jb2xsYXBzZSgpYCBjYWxsZWQgKmluc3RlYWQqIG9mIGBjb2xsYXBzZV9odWdlX3BhZ2UoKWA/ICBMZXQncyBjaGVjayBgbXRocF9jb2xsYXBzZSgpYC4uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzU5NSwiT3V0cHV0VG9rZW5zIjoxOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY2NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTozOTo1NC4zNTk4NjQ2NVoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjk4MDg0NjE4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm10aHBfY29sbGFwc2VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0va2h1Z2VwYWdlZC5jPTE1NjI9c3RhdGljIHVuc2lnbmVkIGludCBtYXhfb3JkZXJfZnJvbV9vZmZzZXQodW5zaWduZWQgaW50IG9mZnNldClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNTcwLS8qXFxubW0va2h1Z2VwYWdlZC5jOjE1NzE6ICogbXRocF9jb2xsYXBzZSgpIGNvbnN1bWVzIHRoZSBiaXRtYXAgdGhhdCBpcyBnZW5lcmF0ZWQgZHVyaW5nXFxubW0va2h1Z2VwYWdlZC5jLTE1NzItICogY29sbGFwc2Vfc2Nhbl9wbWQoKSB0byBkZXRlcm1pbmUgd2hhdCByZWdpb25zIGFuZCBtVEhQIG9yZGVycyBmaXQgYmVzdC5cXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNTg2LSAqL1xcbm1tL2todWdlcGFnZWQuYzoxNTg3OnN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IG10aHBfY29sbGFwc2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxubW0va2h1Z2VwYWdlZC5jLTE1ODgtXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgcmVmZXJlbmNlZCwgaW50IHVubWFwcGVkLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTE2ODk9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTcyOS1cXHQgKiBzY2FuIGFsbCBwYWdlcyB0byBwb3B1bGF0ZSB0aGUgYml0bWFwIGZvciBtVEhQIGNvbGxhcHNlLiBUaGUgYml0bWFwXFxubW0va2h1Z2VwYWdlZC5jOjE3MzA6XFx0ICogaXMgdGhlbiBjaGVja2VkIGFnYWluIGluIG10aHBfY29sbGFwc2UoKSBmb3IgZWFjaCBhdHRlbXB0ZWQgb3JkZXIuXFxubW0va2h1Z2VwYWdlZC5jLTE3MzEtXFx0ICovXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTgwNy1cXHRcXHRtbWFwX3JlYWRfdW5sb2NrKG1tKTtcXG5tbS9raHVnZXBhZ2VkLmM6MTgwODpcXHRcXHRyZXN1bHQgPSBtdGhwX2NvbGxhcHNlKG1tLCBzdGFydF9hZGRyLCByZWZlcmVuY2VkLFxcbm1tL2todWdlcGFnZWQuYy0xODA5LVxcdFxcdFxcdFxcdCAgICAgICBjdHgudW5tYXBwZWQsIGNjLCBlbmFibGVkX29yZGVycyk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjM5OjU2LjA1Nzk1NzI2OFoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM5NjgyNDAxNzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipBbmFseXppbmcgdGhlIEZ1bmN0aW9uIENhbGw6IGBtdGhwX2NvbGxhcHNlKClgKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIFRoZSBtZW50YWwgdHJpZ2dlciBoZXJlIGlzIHNlZWluZyB0aGF0IGZ1bmN0aW9uIGNhbGw6IGBtdGhwX2NvbGxhcHNlKClgLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gaW1tZWRpYXRlbHkgc3RhcnQgcGFyc2luZyB3aGF0IHRoYXQgKm1lYW5zKi4gQmFzZWQgb24gdGhlIG5hbWluZyBjb252ZW50aW9uIChhc3N1bWluZyB0aGlzIGlzIG15IG93biBjb2RlYmFzZSBvciBvbmUgSSdtIHZlcnkgZmFtaWxpYXIgd2l0aCksIHRoZSBcIm10aHBcIiBzdHJvbmdseSBzdWdnZXN0cyB0aGlzIGlzIHJlbGF0ZWQgdG8gc29tZXRoaW5nIGxpa2UgXCJNdWx0aS10aHJlYWRlZCBIaWVyYXJjaGljYWwgUHJvY2Vzc2luZyxcIiBvciBtYXliZSBhIHNpbWlsYXIgc3RydWN0dXJlIHRoYXQgdXRpbGl6ZXMgY29sbGFwc2Ugb3BlcmF0aW9uIGZvciBwYXJhbGxlbGlzbS4gVGhlIG5hbWUgXCJjb2xsYXBzZVwiIGlzIGNyaXRpY2FsIGhlcmUuIEl0IGhpbnRzIGF0IHNvbWUga2luZCBvZiByZWR1Y3Rpb24gb3IgYWdncmVnYXRpb24gcHJvY2VzcyBhcHBsaWVkIHRvIGEgaGllcmFyY2hpY2FsIG9yIHBhcmFsbGVsIGRhdGEgc3RydWN0dXJlLiBJJ20gYWxyZWFkeSBhbnRpY2lwYXRpbmcga2V5IGVsZW1lbnRzIG9mIGl0IG1pZ2h0IGJlIHJlbGF0ZWQgdG8gZWl0aGVyIGRhdGEgcmVkdWN0aW9uIChhICdjb2xsYXBzZScgaW50byBhZ2dyZWdhdGUgZGF0YSkgb3IgdGhyZWFkIHN5bmNocm9uaXphdGlvbiBhbmQgd2FpdGluZy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGhpZXJhcmNoaWNhbCBhc3BlY3QgYW5kIHRocmVhZGluZyByZWxhdGlvbnNoaXAgb2YgdGhhdCBzcGVjaWZpYyBjb250ZXh0IHRvIHVuZGVyc3RhbmQgd2hhdCB0eXBlIG9mIGluZm9ybWF0aW9uIGFuZCBkYXRhIGlzIHBhc3NlZC4gVGhlIGdvYWwgd291bGQgbGlrZWx5IGJlIHRvIHJlZHVjZSB0aGUgY29tcGxleGl0eSBvZiB0aGUgZGF0YSBieSBtZXJnaW5nIG9yIGdyb3VwaW5nIGRhdGEgaW4gYW4gb3JkZXJseSBmYXNoaW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTI0NCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQwOjAwLjAyNjE5OTUxNFoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzc0MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0va2h1Z2VwYWdlZC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE1ODcsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE1ODc6XFx0c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgbXRocF9jb2xsYXBzZShzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4xNTg4OlxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50IHJlZmVyZW5jZWQsIGludCB1bm1hcHBlZCxcXG4xNTg5OlxcdFxcdFxcdHN0cnVjdCBjb2xsYXBzZV9jb250cm9sICpjYywgdW5zaWduZWQgbG9uZyBlbmFibGVkX29yZGVycylcXG4xNTkwOlxcdHtcXG4xNTkxOlxcdFxcdHVuc2lnbmVkIGludCBucl9vY2N1cGllZF9wdGVzLCBucl9wdGVzLCBtYXhfcHRlc19ub25lO1xcbjE1OTI6XFx0XFx0ZW51bSBzY2FuX3Jlc3VsdCBsYXN0X3Jlc3VsdCA9IFNDQU5fRkFJTDtcXG4xNTkzOlxcdFxcdGludCBjb2xsYXBzZWQgPSAwO1xcbjE1OTQ6XFx0XFx0Ym9vbCBhbGxvY19mYWlsZWQgPSBmYWxzZTtcXG4xNTk1OlxcdFxcdHVuc2lnbmVkIGxvbmcgY29sbGFwc2VfYWRkcmVzcztcXG4xNTk2OlxcdFxcdHVuc2lnbmVkIGludCBvZmZzZXQgPSAwO1xcbjE1OTc6XFx0XFx0dW5zaWduZWQgaW50IG9yZGVyID0gSFBBR0VfUE1EX09SREVSO1xcbjE1OTg6XFx0XFxuMTU5OTpcXHRcXHR3aGlsZSAob2Zmc2V0IFxcdTAwM2MgSFBBR0VfUE1EX05SKSB7XFxuMTYwMDpcXHRcXHRcXHRucl9wdGVzID0gMVVMIFxcdTAwM2NcXHUwMDNjIG9yZGVyO1xcbjE2MDE6XFx0XFxuMTYwMjpcXHRcXHRcXHRpZiAoIXRlc3RfYml0KG9yZGVyLCBcXHUwMDI2ZW5hYmxlZF9vcmRlcnMpKVxcbjE2MDM6XFx0XFx0XFx0XFx0Z290byBuZXh0X29yZGVyO1xcbjE2MDQ6XFx0XFxuMTYwNTpcXHRcXHRcXHRtYXhfcHRlc19ub25lID0gY29sbGFwc2VfbWF4X3B0ZXNfbm9uZShjYywgTlVMTCwgb3JkZXIpO1xcbjE2MDY6XFx0XFx0XFx0bnJfb2NjdXBpZWRfcHRlcyA9IGJpdG1hcF93ZWlnaHRfZnJvbShjYy1cXHUwMDNlbXRocF9wcmVzZW50X3B0ZXMsIG9mZnNldCxcXG4xNjA3OlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgIG9mZnNldCArIG5yX3B0ZXMpO1xcbjE2MDg6XFx0XFxuMTYwOTpcXHRcXHRcXHQvKlxcbjE2MTA6XFx0XFx0XFx0ICogU3dhcCBQVEVzIGFjY2VwdGVkIGR1cmluZyB0aGUgc2NhbiBhcmUgY291bnRlZCBpbiBAdW5tYXBwZWQsXFxuMTYxMTpcXHRcXHRcXHQgKiBub3QgaW4gdGhlIHByZXNlbnQtUFRFIGJpdG1hcC4gQWNjb3VudCB0aGVtIGZvciB0aGUgUE1ELW9yZGVyXFxuMTYxMjpcXHRcXHRcXHQgKiBjYW5kaWRhdGUuXFxuMTYxMzpcXHRcXHRcXHQgKi9cXG4xNjE0OlxcdFxcdFxcdGlmIChpc19wbWRfb3JkZXIob3JkZXIpKVxcbjE2MTU6XFx0XFx0XFx0XFx0bnJfb2NjdXBpZWRfcHRlcyArPSB1bm1hcHBlZDtcXG4xNjE2OlxcdFxcbjE2MTc6XFx0XFx0XFx0aWYgKG5yX29jY3VwaWVkX3B0ZXMgXFx1MDAzZT0gbnJfcHRlcyAtIG1heF9wdGVzX25vbmUpIHtcXG4xNjE4OlxcdFxcdFxcdFxcdGVudW0gc2Nhbl9yZXN1bHQgcmV0O1xcbjE2MTk6XFx0XFxuMTYyMDpcXHRcXHRcXHRcXHRjb2xsYXBzZV9hZGRyZXNzID0gYWRkcmVzcyArIG9mZnNldCAqIFBBR0VfU0laRTtcXG4xNjIxOlxcdFxcdFxcdFxcdHJldCA9IGNvbGxhcHNlX2h1Z2VfcGFnZShtbSwgY29sbGFwc2VfYWRkcmVzcywgcmVmZXJlbmNlZCxcXG4xNjIyOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCB1bm1hcHBlZCwgY2MsIG9yZGVyKTtcXG4xNjIzOlxcdFxcbjE2MjQ6XFx0XFx0XFx0XFx0c3dpdGNoIChyZXQpIHtcXG4xNjI1OlxcdFxcdFxcdFxcdC8qIENhc2VzIHdoZXJlIHdlIGNvbnRpbnVlIHRvIG5leHQgY29sbGFwc2UgY2FuZGlkYXRlICovXFxuMTYyNjpcXHRcXHRcXHRcXHRjYXNlIFNDQU5fU1VDQ0VFRDpcXG4xNjI3OlxcdFxcdFxcdFxcdFxcdGNvbGxhcHNlZCArPSBucl9wdGVzO1xcbjE2Mjg6XFx0XFx0XFx0XFx0XFx0ZmFsbHRocm91Z2g7XFxuMTYyOTpcXHRcXHRcXHRcXHRjYXNlIFNDQU5fUFRFX01BUFBFRF9IVUdFUEFHRTpcXG4xNjMwOlxcdFxcdFxcdFxcdFxcdGdvdG8gbmV4dF9vZmZzZXQ7XFxuMTYzMTpcXHRcXHRcXHRcXHQvKiBDYXNlcyB3aGVyZSBsb3dlciBvcmRlcnMgbWlnaHQgc3RpbGwgc3VjY2VlZCAqL1xcbjE2MzI6XFx0XFx0XFx0XFx0Y2FzZSBTQ0FOX0FMTE9DX0hVR0VfUEFHRV9GQUlMOlxcbjE2MzM6XFx0XFx0XFx0XFx0XFx0YWxsb2NfZmFpbGVkID0gdHJ1ZTtcXG4xNjM0OlxcdFxcdFxcdFxcdFxcdGZhbGx0aHJvdWdoO1xcbjE2MzU6XFx0XFx0XFx0XFx0Y2FzZSBTQ0FOX0xBQ0tfUkVGRVJFTkNFRF9QQUdFOlxcbjE2MzY6XFx0XFx0XFx0XFx0Y2FzZSBTQ0FOX0VYQ0VFRF9OT05FX1BURTpcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDA6MDAuMDI2MzM5NDM0WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjIyMDE2NzQ1MzMwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5c2lzIG9mIEh1Z2UgUGFnZSBDb2xsYXBzZSBDb2RlIENoYW5nZXMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCBwcm9jZXNzIGZvY3VzZWQgb24gdGhlIGZsb3cgb2YgYG10aHBfY29sbGFwc2UoKWAgY2FsbGluZyBgY29sbGFwc2VfaHVnZV9wYWdlKClgLiBUaGUga2V5IGNvbmNlcm4gd2FzIHRoZSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBkcm9wcGluZyBhbmQgcmVhY3F1aXJpbmcgdGhlIG1tYXBfbG9jayBhbmQgdGhlIG1vZGlmaWNhdGlvbiBvZiBQVEVzLiBUaGUgcmV2YWxpZGF0aW9uIHRocm91Z2ggYGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKClgIHNlZW1lZCBsaWtlIGEgcG90ZW50aWFsIHNhZmVndWFyZC5cblxuTXkgbWluZCB0aGVuIGp1bXBlZCB0byB0aGUgY3JpdGljYWwgcG9pbnQ6IHRoZSBoYW5kbGluZyBvZiBub24tYW5vbnltb3VzIHBhZ2VzIHdpdGhpbiBhbiBhbm9ueW1vdXMgVk1BLiBTcGVjaWZpY2FsbHksIEkgY29uc2lkZXJlZCBzY2VuYXJpb3MgbGlrZSB6ZXJvIHBhZ2VzLCBLU00gcGFnZXMsIGFuZCBwYWdlcyBmcm9tIGZpbGVzLiBUaGUgYHZtX2luc2VydF9wYWdlKClgIGZ1bmN0aW9uJ3MgYWJpbGl0eSB0byBtYXAgbm9uLWFub24gcGFnZXMgaW50byBhbnkgVk1BIHJhaXNlZCBhIHJlZCBmbGFnLiBUaGlzIGJyb3VnaHQgdGhlIGBWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oY3R4LVx1MDAzZWZvbGlvKSwgY3R4LVx1MDAzZWZvbGlvKTtgIGNoZWNrLCB3aGljaCByZXBsYWNlZCBhIGBWTV9CVUdfT05fRk9MSU9gIGZyb20gdGhlIG9sZGVyIGNvZGUuIFNvIHRoZSBjaGFuZ2UgcmVzdWx0ZWQgaW4gYSBkb3duZ3JhZGUgZnJvbSBhIEJVRyB0byBhIFdBUk4uIEFuZCBhbHNvIHRoZSBjb2RlIG5vdyBXQVJOUyBpbiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgd2hlcmUgaXQgdXNlZCB0byBqdXN0IHJldHVybi5cblxuSSB3ZW50IGludG8gaW52ZXN0aWdhdGluZyB3aGF0IGhhcHBlbnMgaW5zaWRlIGBjb2xsYXBzZV9jaGVja19wdGUoKWAsIHdoZXJlIGl0J3MgY2FsbGVkIGZyb20gYm90aCBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgYW5kIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgLiBUaGUgYWRkaXRpb24gb2YgdGhlIFdBUk4gaW4gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlLCBhcyBpdCBpbnRyb2R1Y2VzIGEgd2FybmluZyB3aGVyZSBwcmV2aW91c2x5LCB0aGVyZSB3YXMgbm9uZS4gSSB3b25kZXJlZCBpZiB0aGlzIGFkZHMgYSB3YXJuaW5nLlxuXG5JIGNoZWNrZWQgYHB0ZV9pc19yZWZlcmVuY2VkKClgLCBjb21wYXJpbmcgdGhlIG9sZCBhbmQgbmV3IGlubGluZSBjb2RlLiBJdCdzIHVuY2hhbmdlZCwgd2hpY2ggaXMgZ29vZC4gVGhlbiwgSSBsb29rZWQgYXQgdGhlIGhhbmRsaW5nIG9mIHNoYXJlZCBwYWdlcyBhbmQgdW5tYXBwZWQgcGFnZXMgd2l0aGluIGJvdGggYGNvbGxhcHNlX3NjYW5fcG1kKClgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCwgYW5kIHRoZXNlIHNlY3Rpb25zIGFyZSBhbHNvIHRoZSBzYW1lLiBUaGUgVUZGRCAodXNlcmZhdWx0ZmQpIGhhbmRsaW5nIGlzIGFsc28gY29uc2lzdGVudCBhY3Jvc3MgYm90aCBvbGQgYW5kIG5ldyBjb2RlLlxuXG5GaW5hbGx5LCB0aGUgY2hhbmdlIHRvIGBjb2xsYXBzZV9jb250cm9sX2luaXRfc2NhbigpYCBhZGRzIGEgbmV3IGZ1bmN0aW9uIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIHNjYW4sIGhvd2V2ZXIgdGhlIGNvZGUgYWxzbyBoYXMgYSBgYml0bWFwX3plcm8oKWAgY2FsbCB0aGF0IHdhcyAqbm90KiBpbiBgY29sbGFwc2Vfc2Nhbl9maWxlKClgIGJlZm9yZS4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdGhlIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBhbmQgYGNvbGxhcHNlX3NjYW5fZmlsZSgpYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjAzMzUsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNDg5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDA6MjIuMDQzMDg3NTc0WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDg1OTU4NjYzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbGxhcHNlX3NjYW5fZmlsZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9raHVnZXBhZ2VkLmM9MjI2OT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMjcwMC1cXG5tbS9raHVnZXBhZ2VkLmM6MjcwMTpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxubW0va2h1Z2VwYWdlZC5jLTI3MDItXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgcGdvZmZfdCBzdGFydCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0yODExPXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NpbmdsZV9wbWQodW5zaWduZWQgbG9uZyBhZGRyLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTI4MzMtcmV0cnk6XFxubW0va2h1Z2VwYWdlZC5jOjI4MzQ6XFx0cmVzdWx0ID0gY29sbGFwc2Vfc2Nhbl9maWxlKG1tLCBhZGRyLCBmaWxlLCBwZ29mZiwgY2MpO1xcbm1tL2todWdlcGFnZWQuYy0yODM1LVxcbi0tXFxubW0vbXJlbWFwLmM9MTk3PXN0YXRpYyBpbnQgbW92ZV9wdGVzKHN0cnVjdCBwYWdldGFibGVfbW92ZV9jb250cm9sICpwbWMsXFxuLS1cXG5tbS9tcmVtYXAuYy0yNDYtXFx0LypcXG5tbS9tcmVtYXAuYzoyNDc6XFx0ICogTm93IG5ld19wdGUgaXMgbm9uZSwgc28gY29sbGFwc2Vfc2Nhbl9maWxlKCkgcGF0aCBjYW4gbm90IGZpbmRcXG5tbS9tcmVtYXAuYy0yNDgtXFx0ICogdGhpcyBieSB0cmF2ZXJzaW5nIGZpbGUtXFx1MDAzZWZfbWFwcGluZywgc28gdGhlcmUgaXMgbm8gY29uY3VycmVuY3kgd2l0aFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTo0MDoyMy41MjkwNTE1NThaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDY5NDgxODQ3NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBob3cgSSdkIGFwcHJvYWNoIHRoaXMgdGFzaywgYXMgaWYgdGhlc2Ugd2VyZSBteSBpbnRlcm5hbCB0aG91Z2h0czpcblxuKipBbmFseXppbmcgYGNvbGxhcHNlX3NjYW5fZmlsZSgpYCBmb3IgYGNjLVx1MDAzZW10aHBfcHJlc2VudF9wdGVzYCBVc2FnZSoqXG5cblJpZ2h0LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYGNjLVx1MDAzZW10aHBfcHJlc2VudF9wdGVzYCBpcyBiZWluZyB1c2VkLiBUaGUgbW9zdCBsb2dpY2FsIHBsYWNlIHRvIHN0YXJ0IGlzIHdpdGhpbiB0aGUgYGNvbGxhcHNlX3NjYW5fZmlsZSgpYCBmdW5jdGlvbi4gSSB3YW50IHRvIHNlZSBpZiB0aGlzIHBhcnRpY3VsYXIgbWVtYmVyIG9mIHRoZSBgY2NgIChwcmVzdW1hYmx5IHNvbWUga2luZCBvZiBjb250cm9sIGNvbnRleHQgb3IgY2FjaGUgc3RydWN0dXJlKSBpcyBhY3R1YWxseSBhY2Nlc3NlZCBhbmQgbWFuaXB1bGF0ZWQgd2l0aGluIHRoYXQgZnVuY3Rpb24uIEknbGwgbmVlZCB0byBjYXJlZnVsbHkgZXhhbWluZSB0aGUgY29kZSB3aXRoaW4gYGNvbGxhcHNlX3NjYW5fZmlsZSgpYCB0byBjb25maXJtIGl0cyB1c2FnZS4gS25vd2luZyB3aGVyZSB0aGlzIHZhcmlhYmxlIGlzIHVzZWQgaXMgY3JpdGljYWwgZm9yIHVuZGVyc3RhbmRpbmcgaXRzIHB1cnBvc2UgYW5kIGltcGFjdC4gSSdsbCBuZWVkIHRvIGNoZWNrIHRoZSBmdW5jdGlvbiwgbGluZSBieSBsaW5lLCB0byBzZWUgaWYgdGhlIHZhcmlhYmxlIGlzIGRpcmVjdGx5IHVzZWQgb3IgaWYgYW5vdGhlciB2YXJpYWJsZSB3aGljaCB1c2VzIGl0IGlzIHVzZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIzNjgxLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDA6MjguMjIzODcyNzAzWiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwMDQ5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9raHVnZXBhZ2VkLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjcwMSxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjcwMTpcXHRzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuMjcwMjpcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBmaWxlICpmaWxlLCBwZ29mZl90IHN0YXJ0LFxcbjI3MDM6XFx0XFx0XFx0c3RydWN0IGNvbGxhcHNlX2NvbnRyb2wgKmNjKVxcbjI3MDQ6XFx0e1xcbjI3MDU6XFx0XFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX25vbmUgPSBjb2xsYXBzZV9tYXhfcHRlc19ub25lKGNjLCBOVUxMLCBIUEFHRV9QTURfT1JERVIpO1xcbjI3MDY6XFx0XFx0Y29uc3QgdW5zaWduZWQgaW50IG1heF9wdGVzX3N3YXAgPSBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKGNjLCBIUEFHRV9QTURfT1JERVIpO1xcbjI3MDc6XFx0XFx0c3RydWN0IGZvbGlvICpmb2xpbyA9IE5VTEw7XFxuMjcwODpcXHRcXHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZpbGUtXFx1MDAzZWZfbWFwcGluZztcXG4yNzA5OlxcdFxcdFhBX1NUQVRFKHhhcywgXFx1MDAyNm1hcHBpbmctXFx1MDAzZWlfcGFnZXMsIHN0YXJ0KTtcXG4yNzEwOlxcdFxcdGludCBwcmVzZW50LCBzd2FwO1xcbjI3MTE6XFx0XFx0aW50IG5vZGUgPSBOVU1BX05PX05PREU7XFxuMjcxMjpcXHRcXHRlbnVtIHNjYW5fcmVzdWx0IHJlc3VsdCA9IFNDQU5fU1VDQ0VFRDtcXG4yNzEzOlxcdFxcbjI3MTQ6XFx0XFx0cHJlc2VudCA9IDA7XFxuMjcxNTpcXHRcXHRzd2FwID0gMDtcXG4yNzE2OlxcdFxcdGNvbGxhcHNlX2NvbnRyb2xfaW5pdF9zY2FuKGNjKTtcXG4yNzE3OlxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4yNzE4OlxcdFxcdHhhc19mb3JfZWFjaChcXHUwMDI2eGFzLCBmb2xpbywgc3RhcnQgKyBIUEFHRV9QTURfTlIgLSAxKSB7XFxuMjcxOTpcXHRcXHRcXHRpZiAoeGFzX3JldHJ5KFxcdTAwMjZ4YXMsIGZvbGlvKSlcXG4yNzIwOlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbjI3MjE6XFx0XFxuMjcyMjpcXHRcXHRcXHRpZiAoeGFfaXNfdmFsdWUoZm9saW8pKSB7XFxuMjcyMzpcXHRcXHRcXHRcXHRzd2FwICs9IDEgXFx1MDAzY1xcdTAwM2MgeGFzX2dldF9vcmRlcihcXHUwMDI2eGFzKTtcXG4yNzI0OlxcdFxcdFxcdFxcdGlmIChzd2FwIFxcdTAwM2UgbWF4X3B0ZXNfc3dhcCkge1xcbjI3MjU6XFx0XFx0XFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9FWENFRURfU1dBUF9QVEU7XFxuMjcyNjpcXHRcXHRcXHRcXHRcXHRjb3VudF92bV9ldmVudChUSFBfU0NBTl9FWENFRURfU1dBUF9QVEUpO1xcbjI3Mjc6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuMjcyODpcXHRcXHRcXHRcXHR9XFxuMjcyOTpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4yNzMwOlxcdFxcdFxcdH1cXG4yNzMxOlxcdFxcbjI3MzI6XFx0XFx0XFx0aWYgKCFmb2xpb190cnlfZ2V0KGZvbGlvKSkge1xcbjI3MzM6XFx0XFx0XFx0XFx0eGFzX3Jlc2V0KFxcdTAwMjZ4YXMpO1xcbjI3MzQ6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuMjczNTpcXHRcXHRcXHR9XFxuMjczNjpcXHRcXG4yNzM3OlxcdFxcdFxcdGlmICh1bmxpa2VseShmb2xpbyAhPSB4YXNfcmVsb2FkKFxcdTAwMjZ4YXMpKSkge1xcbjI3Mzg6XFx0XFx0XFx0XFx0Zm9saW9fcHV0KGZvbGlvKTtcXG4yNzM5OlxcdFxcdFxcdFxcdHhhc19yZXNldChcXHUwMDI2eGFzKTtcXG4yNzQwOlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbjI3NDE6XFx0XFx0XFx0fVxcbjI3NDI6XFx0XFxuMjc0MzpcXHRcXHRcXHRpZiAoaXNfcG1kX29yZGVyKGZvbGlvX29yZGVyKGZvbGlvKSkpIHtcXG4yNzQ0OlxcdFxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUFRFX01BUFBFRF9IVUdFUEFHRTtcXG4yNzQ1OlxcdFxcdFxcdFxcdC8qXFxuMjc0NjpcXHRcXHRcXHRcXHQgKiBQTUQtc2l6ZWQgVEhQIGltcGxpZXMgdGhhdCB3ZSBjYW4gb25seSB0cnlcXG4yNzQ3OlxcdFxcdFxcdFxcdCAqIHJldHJhY3RpbmcgdGhlIFBURSB0YWJsZS5cXG4yNzQ4OlxcdFxcdFxcdFxcdCAqL1xcbjI3NDk6XFx0XFx0XFx0XFx0Zm9saW9fcHV0KGZvbGlvKTtcXG4yNzUwOlxcdFxcdFxcdFxcdGJyZWFrO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTo0MDoyOC4yMjQwNzQ1ODNaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjMzNzk5MjUzMzksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgQ29sbGFwc2UgQ29kZSBDaGFuZ2VzKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgd2FzIGZvY3VzZWQgb24gY29uZmlybWluZyB0aGF0IGNlcnRhaW4gb3B0aW1pemF0aW9ucyBpbiBgY29sbGFwc2Vfc2Nhbl9maWxlKClgIHdvdWxkbid0IGluYWR2ZXJ0ZW50bHkgaW1wYWN0IHRoZSBvdmVyYWxsIGNvbGxhcHNlIGxvZ2ljLiBTcGVjaWZpY2FsbHksIHRoZSB6ZXJvaW5nIG9mIGBjYy1cdTAwM2VtdGhwX3ByZXNlbnRfcHRlc2AgaW4gdGhhdCBzcGVjaWZpYyBmdW5jdGlvbiBhcHBlYXJlZCBzYWZlLCBhcyBpdCdzIG5vdCBkaXJlY3RseSB1dGlsaXplZCB3aXRoaW4gdGhlIGZ1bmN0aW9uJ3Mgc2NvcGUuIEhvd2V2ZXIsIHRoaXMgdHJpZ2dlcmVkIGEgbmVlZCB0byBtb3JlIHJpZ29yb3VzbHkgaW52ZXN0aWdhdGUgdGhlIHN1cnJvdW5kaW5nIGNvZGUuXG5cblRoZSBmaXJzdCBhcmVhIG9mIGNvbmNlcm4gd2FzIGFyb3VuZCB0aGUgbGF6eWZyZWUgaGFuZGxpbmcsIHNwZWNpZmljYWxseSB3aXRoaW4gYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAgYW5kIGBjb2xsYXBzZV9jaGVja19wdGUoKWAuIEl0J3MgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZDogd2Ugd2FudCB0byBwcmVzZXJ2ZSBsYXp5ZnJlZSBwYWdlcyBpZiB0aGUgVk1BIGhhcyB0aGUgYFZNX0RST1BQQUJMRWAgZmxhZyBzZXQsIGFuZCB0aGUgcGFnZSBpcyBhY3R1YWxseSBsYXp5ZnJlZSBhbmQgbm90IGRpcnR5LiBUaGUgY2hlY2sgaW4gdGhlIG5ldyBjb2RlIHVzaW5nIHRoZSBjb250ZXh0IHN0cnVjdHVyZSAoYGN0eGApIGFwcGVhcnMgZnVuY3Rpb25hbGx5IGlkZW50aWNhbCB0byB0aGUgb2xkZXIgaW1wbGVtZW50YXRpb24uIFdlIGFyZSBqdXN0IHVzaW5nIHRoZSBjb250ZXh0IHRvIHBhc3MgZGF0YSwgYXMgaXMgcHJvcGVyLlxuXG5OZXh0LCBJIGxvb2tlZCBhdCB0aGUgXCJ5b3VuZ1wiIHBhZ2UgY2hlY2ssIHdoaWNoIGRldGVybWluZXMgaWYgYSBQVEUgaXMgXCJ5b3VuZ1wiIGVub3VnaCB0byBqdXN0aWZ5IGNvbGxhcHNpbmcuIFRoZSBsb2dpYyB3aXRoaW4gYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAgYW5kIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBhcHBlYXJzIHRvIGJlIGlkZW50aWNhbCBhcyB3ZWxsLiBUaGUgb2xkIGBwdGVfeW91bmcoKWAgYW5kIGZvbGlvIGNoZWNrcywgYXMgd2VsbCBhcyB0aGUgTU1VIG5vdGlmaWVyIGNoZWNrLCBoYXZlIGJlZW4gY29uc29saWRhdGVkIGludG8gYHB0ZV9pc19yZWZlcmVuY2VkKClgLCBidXQgdGhlIGJlaGF2aW9yIGlzLCBmcm9tIHdoYXQgSSBjYW4gdGVsbCwgZXhhY3RseSB0aGUgc2FtZS5cblxuVGhlIGxvZ2ljIGluIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCB0aGF0IGRldGVybWluZXMgaWYgYSBjb2xsYXBzZSBzaG91bGQgYmUgc2tpcHBlZCBkdWUgdG8gYSBsYWNrIG9mIHJlZmVyZW5jZWQgcGFnZXMgYWxzbyBhcHBlYXJzIHRvIGJlIGlkZW50aWNhbC5cblxuVGhlIG1vc3QgaW50ZXJlc3RpbmcgYXJlYSB0byBsb29rIGF0IHdhcyByZWxhdGVkIHRvIHVubWFwcGVkIFBURXMuIEluIHRoZSBvbGRlciBjb2RlLCBhIHNpbXBsZSBpbnRlZ2VyIHZhcmlhYmxlIGB1bm1hcHBlZGAgd2FzIHVzZWQgdG8gdHJhY2sgdGhlIG51bWJlciBvZiB1bm1hcHBlZCBQVEVzLiBUaGUgbmV3IGNvZGUsIGhvd2V2ZXIsIGxldmVyYWdlcyBhIGNvbnRleHQgc3RydWN0dXJlIGBjdHhgLCBhbmQgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIG9sZCBgdW5tYXBwZWRgIHZhcmlhYmxlIGlzIG5vdyBgY3R4LnVubWFwcGVkYC4gSSBoYWQgdG8gY29uZmlybSB0aGF0IGBjdHgudW5tYXBwZWRgIHdhcyBpbml0aWFsaXplZCB0byB0aGUgY29ycmVjdCB2YWx1ZSwgYW5kIGFsc28gdGhlIGNvcnJlY3QgYmVoYXZpb3Igb2YgdGhlIGxvZ2ljIHRoYXQgdXNlcyB0aGUgYHVubWFwcGVkYCB2YWx1ZXMgYW5kIGNvdW50cywgYmFzZWQgb24gdGhlIGBtYXhfcHRlc19zd2FwYCBwYXJhbWV0ZXIuIEJhc2VkIG9uIEMncyBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb24gcnVsZXMsIGFzIGl0IGlzICpub3QqIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgaW4gdGhlIHN0cnVjdCwgaXQgd291bGQgZGVmYXVsdCB0byB6ZXJvLiBUaGUgaW5jcmVtZW50IGxvZ2ljIGlzIGNvbnNpc3RlbnQgYXMgd2VsbC4gU28gaXQgYmVoYXZlcyBpZGVudGljYWxseS5cblxuVGhlIGNoZWNrcyBmb3IgYGN0eC5ub25lX29yX3plcm9gLCBgY3R4LnNoYXJlZGAsIGFuZCB0aGUgYXNzaWdubWVudCBvZiBgY3R4LmZvbGlvYCBhbmQgYGN0eC5yZXN1bHRgIHdlcmUgdGhlbiBjb25maXJtZWQgdG8gYmUgaGFuZGxlZCBjb3JyZWN0bHksIGNvbmZpcm1pbmcgdGhhdCB0aGUgY29udGV4dCBzdHJ1Y3QgYmVoYXZlZCBsaWtlIHRoZSBvbGQgdmFyaWFibGVzLlxuXG5MYXN0bHksIHRoZSBgY291bnRfY29sbGFwc2VfZXZlbnQoKWAgZnVuY3Rpb24gd2FzIGNvbXBhcmVkLCB0byBlbnN1cmUgbm8gbG9naWMgY2hhbmdlIHdhcyBtYWRlIHRvIHRoZSBzdGF0cy4gVGhlIGxvZ2ljIGlzIGlkZW50aWNhbC4gVGhpcyBhcHBlYXJzIHRvIGJlIGNvcnJlY3QsIGFuZCB0aGF0IGBjb3VudF92bV9ldmVudCgpYCBpcyBjYWxsZWQgd2l0aCBgVEhQX1NDQU5fRVhDRUVEX05PTkVfUFRFYCBpcyBjb3JyZWN0LlxuXG5BZnRlciByZXZpZXdpbmcgdGhlc2UgYXJlYXMsIHRoZSBjb25jbHVzaW9uIGlzIHRoYXQgdGhlcmUgYXJlICpubyBmdW5jdGlvbmFsIGNoYW5nZXMqLiBUaGUgY29kZSB1c2VzIGEgY29udGV4dCBzdHJ1Y3QgYW5kIGlubGluZXMgc29tZSBmdW5jdGlvbnMsIGJ1dCB0aGUgYmVoYXZpb3IgaXMgdGhlIHNhbWUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI0NzIwLCJPdXRwdXRUb2tlbnMiOjE5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjYyNywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQwOjUxLjYwNDAwMTc5MloiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjUzNDUyODc1OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ2bV9ub3JtYWxfZm9saW9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvcHJvYy90YXNrX21tdS5jPTE2OTA9c3RhdGljIGlubGluZSBib29sIHB0ZV9pc19waW5uZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgcHRlKVxcbi0tXFxuZnMvcHJvYy90YXNrX21tdS5jLTE2OTktXFx0XFx0cmV0dXJuIGZhbHNlO1xcbmZzL3Byb2MvdGFza19tbXUuYzoxNzAwOlxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlKTtcXG5mcy9wcm9jL3Rhc2tfbW11LmMtMTcwMS1cXHRpZiAoIWZvbGlvKVxcbi0tXFxuZnMvcHJvYy90YXNrX21tdS5jPTE3NzA9c3RhdGljIGludCBjbGVhcl9yZWZzX3B0ZV9yYW5nZShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLS1cXG5mcy9wcm9jL3Rhc2tfbW11LmMtMTgxNS1cXG5mcy9wcm9jL3Rhc2tfbW11LmM6MTgxNjpcXHRcXHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIGFkZHIsIHB0ZW50KTtcXG5mcy9wcm9jL3Rhc2tfbW11LmMtMTgxNy1cXHRcXHRpZiAoIWZvbGlvKVxcbi0tXFxuaW5jbHVkZS9saW51eC9tbS5oPTMxNDM9ZXh0ZXJuIHZvaWQgdXNlcl9zaG1fdW5sb2NrKHNpemVfdCwgc3RydWN0IHVjb3VudHMgKik7XFxuaW5jbHVkZS9saW51eC9tbS5oLTMxNDQtXFxuaW5jbHVkZS9saW51eC9tbS5oOjMxNDU6c3RydWN0IGZvbGlvICp2bV9ub3JtYWxfZm9saW8oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG5pbmNsdWRlL2xpbnV4L21tLmgtMzE0Ni1cXHRcXHRcXHQgICAgIHB0ZV90IHB0ZSk7XFxuaW5jbHVkZS9saW51eC9tbS5oPTMxNDc9c3RydWN0IHBhZ2UgKnZtX25vcm1hbF9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuaW5jbHVkZS9saW51eC9tbS5oLTMxNDgtXFx0XFx0XFx0ICAgICBwdGVfdCBwdGUpO1xcbmluY2x1ZGUvbGludXgvbW0uaDozMTQ5OnN0cnVjdCBmb2xpbyAqdm1fbm9ybWFsX2ZvbGlvX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5pbmNsdWRlL2xpbnV4L21tLmgtMzE1MC1cXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgYWRkciwgcG1kX3QgcG1kKTtcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmM9Mzg5PXN0YXRpYyBpbnQgZGFtb25feW91bmdfcG1kX2VudHJ5KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmMtNDA0LVxcdFxcdFxcdGdvdG8gaHVnZV9vdXQ7XFxubW0vZGFtb24vdmFkZHIuYzo0MDU6XFx0XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW9fcG1kKHdhbGstXFx1MDAzZXZtYSwgYWRkciwgcG1kZSk7XFxubW0vZGFtb24vdmFkZHIuYy00MDYtXFx0XFx0aWYgKCFmb2xpbylcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmMtNDIzLVxcdFxcdGdvdG8gb3V0O1xcbm1tL2RhbW9uL3ZhZGRyLmM6NDI0OlxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHdhbGstXFx1MDAzZXZtYSwgYWRkciwgcHRlbnQpO1xcbm1tL2RhbW9uL3ZhZGRyLmMtNDI1LVxcdGlmICghZm9saW8pXFxuLS1cXG5tbS9kYW1vbi92YWRkci5jPTYzNT1zdGF0aWMgaW50IGRhbW9zX3ZhX21pZ3JhdGVfcG1kX2VudHJ5KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmMtNjUzLVxcdFxcdFxcdGdvdG8gaHVnZV9vdXQ7XFxubW0vZGFtb24vdmFkZHIuYzo2NTQ6XFx0XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW9fcG1kKHdhbGstXFx1MDAzZXZtYSwgYWRkciwgcG1kZSk7XFxubW0vZGFtb24vdmFkZHIuYy02NTUtXFx0XFx0aWYgKCFmb2xpbylcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmMtNjc2LVxcdFxcdFxcdGNvbnRpbnVlO1xcbm1tL2RhbW9uL3ZhZGRyLmM6Njc3OlxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHdhbGstXFx1MDAzZXZtYSwgYWRkciwgcHRlbnQpO1xcbm1tL2RhbW9uL3ZhZGRyLmMtNjc4LVxcdFxcdGlmICghZm9saW8pXFxuLS1cXG5tbS9kYW1vbi92YWRkci5jPTc5NT1zdGF0aWMgaW50IGRhbW9zX3ZhX3N0YXRfcG1kX2VudHJ5KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL2RhbW9uL3ZhZGRyLmMtODE0LVxcbm1tL2RhbW9uL3ZhZGRyLmM6ODE1OlxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvX3BtZCh2bWEsIGFkZHIsIHBtZGUpO1xcbm1tL2RhbW9uL3ZhZGRyLmMtODE2LVxcbi0tXFxubW0vZGFtb24vdmFkZHIuYy04MzktXFxubW0vZGFtb24vdmFkZHIuYzo4NDA6XFx0XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGVudCk7XFxubW0vZGFtb24vdmFkZHIuYy04NDEtXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTIyNzg9dm1fZmF1bHRfdCBkb19odWdlX3BtZF9udW1hX3BhZ2Uoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTIzMDctXFxubW0vaHVnZV9tZW1vcnkuYzoyMzA4OlxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvX3BtZCh2bWEsIGhhZGRyLCBwbWQpO1xcbm1tL2h1Z2VfbWVtb3J5LmMtMjMwOS1cXHRpZiAoIWZvbGlvKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0yNDYyPXN0YXRpYyBzdHJ1Y3QgZm9saW8gKm5vcm1hbF9vcl9zb2Z0bGVhZl9mb2xpb19wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTI0NjUtXFx0aWYgKGlzX3ByZXNlbnQpXFxubW0vaHVnZV9tZW1vcnkuYzoyNDY2OlxcdFxcdHJldHVybiB2bV9ub3JtYWxfZm9saW9fcG1kKHZtYSwgYWRkciwgcG1kdmFsKTtcXG5tbS9odWdlX21lbW9yeS5jLTI0NjctXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9NzQ3PXN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy03NzgtXFxubW0va2h1Z2VwYWdlZC5jOjc3OTpcXHRjdHgtXFx1MDAzZWZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKGN0eC1cXHUwMDNldm1hLCBhZGRyLCBwdGV2YWwpO1xcbm1tL2todWdlcGFnZWQuYy03ODAtXFx0aWYgKHVubGlrZWx5KCFjdHgtXFx1MDAzZWZvbGlvKSB8fCB1bmxpa2VseShmb2xpb19pc196b25lX2RldmljZShjdHgtXFx1MDAzZWZvbGlvKSkpXFxuLS1cXG5tbS9rc20uYz02MTY9c3RhdGljIGludCBicmVha19rc21fcG1kX2VudHJ5KHBtZF90ICpwbWRwLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLFxcbi0tXFxubW0va3NtLmMtNjM4LVxcdFxcdGlmIChwdGVfcHJlc2VudChwdGUpKSB7XFxubW0va3NtLmM6NjM5OlxcdFxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHdhbGstXFx1MDAzZXZtYSwgYWRkciwgcHRlKTtcXG5tbS9rc20uYy02NDAtXFx0XFx0fSBlbHNlIGlmICghcHRlX25vbmUocHRlKSkge1xcbi0tXFxubW0vbWFkdmlzZS5jPTM1Mz1zdGF0aWMgaW50IG1hZHZpc2VfY29sZF9vcl9wYWdlb3V0X3B0ZV9yYW5nZShwbWRfdCAqcG1kLFxcbi0tXFxubW0vbWFkdmlzZS5jLTQ3NS1cXG5tbS9tYWR2aXNlLmM6NDc2OlxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xcbm1tL21hZHZpc2UuYy00NzctXFx0XFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXFxuLS1cXG5tbS9tYWR2aXNlLmM9NjUyPXN0YXRpYyBpbnQgbWFkdmlzZV9mcmVlX3B0ZV9yYW5nZShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLS1cXG5tbS9tYWR2aXNlLmMtNzA0LVxcbm1tL21hZHZpc2UuYzo3MDU6XFx0XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGVudCk7XFxubW0vbWFkdmlzZS5jLTcwNi1cXHRcXHRpZiAoIWZvbGlvIHx8IGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcXG4tLVxcbm1tL21lbW9yeS5jPTgxOT1zdHJ1Y3QgcGFnZSAqdm1fbm9ybWFsX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbW9yeS5jLTgyOC0vKipcXG5tbS9tZW1vcnkuYzo4Mjk6ICogdm1fbm9ybWFsX2ZvbGlvKCkgLSBHZXQgdGhlIFxcXCJzdHJ1Y3QgZm9saW9cXFwiIGFzc29jaWF0ZWQgd2l0aCBhIFBURVxcbm1tL21lbW9yeS5jLTgzMC0gKiBAdm1hOiBUaGUgVk1BIG1hcHBpbmcgdGhlIEBwdGUuXFxuLS1cXG5tbS9tZW1vcnkuYy04MzktICovXFxubW0vbWVtb3J5LmM6ODQwOnN0cnVjdCBmb2xpbyAqdm1fbm9ybWFsX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxubW0vbWVtb3J5LmMtODQxLVxcdFxcdFxcdCAgICBwdGVfdCBwdGUpXFxuLS1cXG5tbS9tZW1vcnkuYz04NjM9c3RydWN0IHBhZ2UgKnZtX25vcm1hbF9wYWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbi0tXFxubW0vbWVtb3J5LmMtODcyLS8qKlxcbm1tL21lbW9yeS5jOjg3MzogKiB2bV9ub3JtYWxfZm9saW9fcG1kKCkgLSBHZXQgdGhlIFxcXCJzdHJ1Y3QgZm9saW9cXFwiIGFzc29jaWF0ZWQgd2l0aCBhIFBNRFxcbm1tL21lbW9yeS5jLTg3NC0gKiBAdm1hOiBUaGUgVk1BIG1hcHBpbmcgdGhlIEBwbWQuXFxuLS1cXG5tbS9tZW1vcnkuYy04ODMtICovXFxubW0vbWVtb3J5LmM6ODg0OnN0cnVjdCBmb2xpbyAqdm1fbm9ybWFsX2ZvbGlvX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5tbS9tZW1vcnkuYy04ODUtXFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90IHBtZClcXG4tLVxcbm1tL21lbW9yeS5jPTYyODQ9c3RhdGljIHZtX2ZhdWx0X3QgZG9fbnVtYV9wYWdlKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxcbi0tXFxubW0vbWVtb3J5LmMtNjMxOS1cXG5tbS9tZW1vcnkuYzo2MzIwOlxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgdm1mLVxcdTAwM2VhZGRyZXNzLCBwdGUpO1xcbm1tL21lbW9yeS5jLTYzMjEtXFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXFxuLS1cXG5tbS9tZW1wb2xpY3kuYz02ODc9c3RhdGljIGludCBxdWV1ZV9mb2xpb3NfcHRlX3JhbmdlKHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbXBvbGljeS5jLTcyMy1cXHRcXHR9XFxubW0vbWVtcG9saWN5LmM6NzI0OlxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xcbm1tL21lbXBvbGljeS5jLTcyNS1cXHRcXHRpZiAoIWZvbGlvIHx8IGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcXG4tLVxcbm1tL21lbXBvbGljeS5jLTcyOS1cXHRcXHQvKlxcbm1tL21lbXBvbGljeS5jOjczMDpcXHRcXHQgKiB2bV9ub3JtYWxfZm9saW8oKSBmaWx0ZXJzIG91dCB6ZXJvIHBhZ2VzLCBidXQgdGhlcmUgbWlnaHRcXG5tbS9tZW1wb2xpY3kuYy03MzEtXFx0XFx0ICogc3RpbGwgYmUgcmVzZXJ2ZWQgZm9saW9zIHRvIHNraXAsIHBlcmhhcHMgaW4gYSBWRFNPLlxcbi0tXFxubW0vbWxvY2suYz0zNTA9c3RhdGljIGludCBtbG9ja19wdGVfcmFuZ2UocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbi0tXFxubW0vbWxvY2suYy0zODctXFx0XFx0XFx0Y29udGludWU7XFxubW0vbWxvY2suYzozODg6XFx0XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGVudCk7XFxubW0vbWxvY2suYy0zODktXFx0XFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXFxuLS1cXG5tbS9tcmVtYXAuYz0xNzg9c3RhdGljIGludCBtcmVtYXBfZm9saW9fcHRlX2JhdGNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuLS1cXG5tbS9tcmVtYXAuYy0xODktXFxubW0vbXJlbWFwLmM6MTkwOlxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlKTtcXG5tbS9tcmVtYXAuYy0xOTEtXFx0aWYgKCFmb2xpbyB8fCAhZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jPTEyODA9c3RhdGljIHN0cnVjdCBmb2xpbyAqY2hlY2tfcHRlc19mb3JfYmF0Y2hlZF9tb3ZlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqc3JjX3ZtYSxcXG4tLVxcbm1tL3VzZXJmYXVsdGZkLmMtMTI5NC1cXG5tbS91c2VyZmF1bHRmZC5jOjEyOTU6XFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8oc3JjX3ZtYSwgc3JjX2FkZHIsIG9yaWdfc3JjX3B0ZSk7XFxubW0vdXNlcmZhdWx0ZmQuYy0xMjk2LVxcdGlmICghZm9saW8gfHwgIWZvbGlvX3RyeWxvY2soZm9saW8pKVxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYz0xNTAzPXN0YXRpYyBsb25nIG1vdmVfcGFnZXNfcHRlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKmRzdF9wbWQsIHBtZF90ICpzcmNfcG1kLFxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYy0xNjE5LVxcbm1tL3VzZXJmYXVsdGZkLmM6MTYyMDpcXHRcXHRcXHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyhzcmNfdm1hLCBzcmNfYWRkciwgb3JpZ19zcmNfcHRlKTtcXG5tbS91c2VyZmF1bHRmZC5jLTE2MjEtXFx0XFx0XFx0aWYgKCFmb2xpbyB8fCAhUGFnZUFub25FeGNsdXNpdmUoXFx1MDAyNmZvbGlvLVxcdTAwM2VwYWdlKSkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTo0MDo1NC4xMzg1MzQ0MVoiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0OTY4ODQ3NjY1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGZyb20gbXkgcGVyc3BlY3RpdmUgYXMgc29tZW9uZSB3ZWxsLXZlcnNlZCBpbiBtZW1vcnkgbWFuYWdlbWVudDpcblxuKipEaWdnaW5nIGludG8gYHZtX25vcm1hbF9mb2xpbygpYCoqXG5cblJpZ2h0LCBzbyBgdm1fbm9ybWFsX2ZvbGlvKClgIGlzIGVzc2VudGlhbGx5IGEgY29udmVuaWVuY2UgZnVuY3Rpb24sIGEgd3JhcHBlciwgaXNuJ3QgaXQ/IEl0IGFwcGVhcnMgdG8gYmUgbm90aGluZyBtb3JlIHRoYW4gYSBzaW1wbGlmaWVkIHdheSB0byBvYnRhaW4gYSBmb2xpbyBiYXNlZCBvbiBhIG5vcm1hbCBwYWdlLCBzcGVjaWZpY2FsbHkgYnkgY2FsbGluZyBgcGFnZV9mb2xpbyh2bV9ub3JtYWxfcGFnZSgpKWAuIFRoYXQncyB0aGUgY29yZSBvZiBpdHMgZnVuY3Rpb25hbGl0eS5cblxuVGhlIGltcGxpY2F0aW9uIGlzIHRoYXQgaXQgaGVscHMgdG8gcmVkdWNlIHJlcGV0aXRpb24uIElmIGEgbG90IG9mIGNvZGUgbmVlZHMgdG8gb3BlcmF0ZSBvbiB0aGUgZm9saW8gb2YgYSBub3JtYWwgcGFnZSwgdGhpcyBmdW5jdGlvbiBqdXN0IHByb3ZpZGVzIGEgc2hvcnRoYW5kIG1ldGhvZC4gVGhlIGRldGFpbHMgYXJlIGFic3RyYWN0ZWQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdCBuZWVkIHRvIHJlcGVhdGVkbHkgY2FsbCBgcGFnZV9mb2xpbyh2bV9ub3JtYWxfcGFnZSgpKWAuXG5cbkxldCdzIGRlbHZlIGRlZXBlciBhbmQgY29uZmlybSB0aGF0IGJ5IGV4YW1pbmluZyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYHZtX25vcm1hbF9mb2xpbygpYCBpdHNlbGYuIFdlIGNhbiBjb25maXJtIHdoZXRoZXIgaXQgaXMgYWN0dWFsbHkganVzdCBhIHNpbXBsZSB3cmFwcGVyIGZ1bmN0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMDg5MiwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQwOjU5LjEwNzM4NTAyNVoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMzgyNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtb3J5LmNcIixcbiAgXCJGaXJzdExpbmVcIjogODM5LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgODM5OlxcdCAqL1xcbiA4NDA6XFx0c3RydWN0IGZvbGlvICp2bV9ub3JtYWxfZm9saW8oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4gODQxOlxcdFxcdFxcdFxcdCAgICBwdGVfdCBwdGUpXFxuIDg0MjpcXHR7XFxuIDg0MzpcXHRcXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRlKTtcXG4gODQ0OlxcdFxcbiA4NDU6XFx0XFx0aWYgKHBhZ2UpXFxuIDg0NjpcXHRcXHRcXHRyZXR1cm4gcGFnZV9mb2xpbyhwYWdlKTtcXG4gODQ3OlxcdFxcdHJldHVybiBOVUxMO1xcbiA4NDg6XFx0fVxcbiA4NDk6XFx0XFxuIDg1MDpcXHQjaWZkZWYgQ09ORklHX1BHVEFCTEVfSEFTX0hVR0VfTEVBVkVTXFxuIDg1MTpcXHQvKipcXG4gODUyOlxcdCAqIHZtX25vcm1hbF9wYWdlX3BtZCgpIC0gR2V0IHRoZSBcXFwic3RydWN0IHBhZ2VcXFwiIGFzc29jaWF0ZWQgd2l0aCBhIFBNRFxcbiA4NTM6XFx0ICogQHZtYTogVGhlIFZNQSBtYXBwaW5nIHRoZSBAcG1kLlxcbiA4NTQ6XFx0ICogQGFkZHI6IFRoZSBhZGRyZXNzIHdoZXJlIHRoZSBAcG1kIGlzIG1hcHBlZC5cXG4gODU1OlxcdCAqIEBwbWQ6IFRoZSBQTUQuXFxuIDg1NjpcXHQgKlxcbiA4NTc6XFx0ICogR2V0IHRoZSBcXFwic3RydWN0IHBhZ2VcXFwiIGFzc29jaWF0ZWQgd2l0aCBhIFBURS4gU2VlIF9fdm1fbm9ybWFsX3BhZ2UoKVxcbiA4NTg6XFx0ICogZm9yIGRldGFpbHMgb24gXFxcIm5vcm1hbFxcXCIgYW5kIFxcXCJzcGVjaWFsXFxcIiBtYXBwaW5ncy5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDA6NTkuMTA3NjI0OTU1WiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjExOTc4MjM1NTEzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIFBvdGVudGlhbCBLaHVnZXBhZ2VkIFdhcm5pbmcgQ29uZGl0aW9uKipcblxuT2theSwgc28gSSd2ZSBiZWVuIGxvb2tpbmcgYXQgdGhpcyBjb2RlIGFuZCBpdCBsb29rcyBsaWtlIGEgc3VidGxlIGNoYW5nZSBoYXMgYmVlbiBpbnRyb2R1Y2VkOiB0aGF0IGluIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCwgdGhlcmUncyBhIG5ldyBgVk1fV0FSTl9PTl9GT0xJT2AgY2FsbC4gUHJldmlvdXNseSwgaXQgc2ltcGx5IHJldHVybmVkIGBTQ0FOX1BBR0VfQU5PTmAuIFRoZSBxdWVzdGlvbiBpcywgY2FuIHdlIHRyaWdnZXIgdGhpcyB3YXJuaW5nP1xuXG5NeSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCBpdCdzIHJlbGF0ZWQgdG8ga2h1Z2VwYWdlZCBhdHRlbXB0aW5nIHRvIHNjYW4gYSBub24tYW5vbnltb3VzIHBhZ2Ugd2l0aGluIHdoYXQgaXQgKnRoaW5rcyogaXMgYW4gYW5vbnltb3VzIFZNQS4gVGhlIGNvZGUgcGF0aCBpbmNsdWRlcyBhIGNoZWNrIGAhZm9saW9fdGVzdF9hbm9uKGN0eC1cdTAwM2Vmb2xpbylgLiBTbywgdGhlIGNydXggb2YgdGhlIHByb2JsZW0gbGllcyBpbiB0aGUgcG9zc2liaWxpdHkgb2YgbWFwcGluZyBhIG5vbi1hbm9ueW1vdXMgcGFnZSAqaW50byogYW4gYW5vbnltb3VzIFZNQS5cblxuTXkgZmlyc3QgaW50dWl0aW9uIGlzIHRoYXQgYHZtX2luc2VydF9wYWdlKClgIGlzIHRoZSBrZXkuIERyaXZlcnMgb2Z0ZW4gdXNlIHRoaXMsIGJ1dCB0eXBpY2FsbHkgd2l0aGluICp0aGVpciogc3BlY2lmaWMgVk1Bcywgd2hpY2ggYXJlbid0IGFub255bW91cy4gQ291bGQgYSB1c2VyIHNvbWVob3cgbGV2ZXJhZ2UgYHZtX2luc2VydF9wYWdlKClgIG9uIGEgYE1BUF9BTk9OWU1PVVNgLWNyZWF0ZWQgVk1BPyBEcml2ZXJzIHR5cGljYWxseSBoYW5kbGUgYHZtX2luc2VydF9wYWdlKClgIGluIHRoZWlyIGBtbWFwYCBoYW5kbGVyLCB3aGVyZSB0aGUgVk1BJ3MgYWxyZWFkeSBzZXQgdXAuIFNvLCB0aGlzIHdvdWxkbid0IG5vcm1hbGx5IGhhcHBlbi5cblxuSSdtIHJ1bGluZyBvdXQgYSBmZXcgcG90ZW50aWFsIGF2ZW51ZXM6IGBPX0RJUkVDVGAgcmVhZHMgaW50byBhbm9ueW1vdXMgbWVtb3J5LCBidXQgdGhlIHBhZ2VzIHRoZW1zZWx2ZXMgYXJlIHN0aWxsIGFub255bW91cy4gYHZtc3BsaWNlYCBtYXBzIHVzZXIgbWVtb3J5IHRvIGEgcGlwZSBidXQgZG9lc24ndCBjaGFuZ2UgYW5vbnltaXR5LiBgbXJlbWFwYCBjYW4gbW92ZSBhIFZNQSwgYnV0IGl0IGRvZXNuJ3QgdG91Y2ggdGhlIGFub24gc3RhdHVzLiBgdXNlcmZhdWx0ZmRgJ3MgYFVGRkRJT19DT1BZYCB1c2VzIGFub24gcGFnZXMsIGFuZCBgVUZGRElPX0NPTlRJTlVFYCBpcyBmb3Igc2htZW0vaHVnZXRsYi4gS1NNIHBhZ2VzIGFyZSBhbHdheXMgYW5vbnltb3VzLCBhcyBhcmUgemVybyBwYWdlcy5cblxuVGhlbiBJIHBhdXNlZCB0byB0aGluayBhYm91dCBgcmVtYXBfcGZuX3JhbmdlYCDigJMgSSdtIHByZXR0eSBzdXJlIGl0IG1hcHMgaW50byBQRk5NQVAgcmVnaW9ucywgYW5kIHRodXMgYHZtX25vcm1hbF9mb2xpbygpYCB3aWxsIHJldHVybiBOVUxMLiBBbHNvIGB2bV9pbnNlcnRfcGFnZWAgY291bGQgc2V0IG1peGVkIG1hcCwgYnV0IHRoZSBwYWdlIGl0c2VsZiBpcyBzdGlsbCB0aGUgY29ycmVjdCBvbmUuXG5cblNvIHRoZSBjaGFsbGVuZ2UgaXMgdG8gZmluZCBhIHdheSB0byBnZXQgYSBkcml2ZXIgdG8gY2FsbCBgdm1faW5zZXJ0X3BhZ2UoKWAgb24gYSBWTUEgY3JlYXRlZCB2aWEgYG1tYXAoTUFQX0FOT05ZTU9VUylgLiBXaGF0IGNhbiB0cmlnZ2VyIHRoaXM/IGB1cHJvYmVgIGluc2VydHMgYSBicmVha3BvaW50IHBhZ2UsIGlzIHRoYXQgYW5vbj8gQW5kIHRoZW4gdGhlcmUncyBgeG9sX2FkZF92bWEoKWAgY3JlYXRlcyBhIHNwZWNpYWwgVk1BLiBQdHJhY2UgdXNlcyBgZ2V0X3VzZXJfcGFnZXMoKWAuIGBtYWR2aXNlKE1BRFZfRlJFRSlgIGtlZXBzIGl0IGFub24sIGBNQURWX0hXUE9JU09OYCBwb2lzb25zLiBJIGNvbnNpZGVyIE9fRElSRUNUIHdpdGggR1VQLiBUaGVuIHRoZSB0aG91Z2h0IHRvIGNvbnNpZGVyIGlmIGtodWdlcGFnZWQgc2NhbnMgYSBmaWxlIFZNQS5cblxuV2FpdCwgdGhlIGtleSBpcyB0aGUgc2NhbiBwYXRoISBJIHJlYWxpemVkIGBraHVnZXBhZ2VkYCBzY2FucyBmaWxlIFZNQXMgdmlhIGBjb2xsYXBzZV9zY2FuX2ZpbGUoKWAsIG5vdCBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAuIFNvIHRoZSBwcm9ibGVtIEkgd2FzIHRoaW5raW5nIGFib3V0IG1pZ2h0IG5vdCBiZSBwb3NzaWJsZS4gSG93ZXZlciwgaXMgdGhhdCBzdGF0ZW1lbnQgY29ycmVjdD8gVGltZSB0byBnbyBiYWNrIHRvIHRoZSBjb2RlIGFuZCBjaGVjayBga2h1Z2VwYWdlZF9zY2FuX3BtZCgpYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzE0OTksIk91dHB1dFRva2VucyI6MjMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3ODksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTo0MToxMS4wODU4NjMzODhaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3MzUyNDI0MDYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia2h1Z2VwYWdlZF9zY2FuX3BtZFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oPTQ5PVNDQU5fU1RBVFVTXFxuLS1cXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTU1LVxcbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5Lmg6NTY6VFJBQ0VfRVZFTlQobW1fa2h1Z2VwYWdlZF9zY2FuX3BtZCxcXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTU3LVxcbi0tXFxua2VybmVsL2JwZi9idGYuYz02NjU2PXN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX3Jhd190cF9udWxsX2FyZ3MgcmF3X3RwX251bGxfYXJnc1tdID0ge1xcbi0tXFxua2VybmVsL2JwZi9idGYuYy02NzA1LVxcdC8qIGh1Z2VfbWVtb3J5ICovXFxua2VybmVsL2JwZi9idGYuYzo2NzA2OlxcdHsgXFxcIm1tX2todWdlcGFnZWRfc2Nhbl9wbWRcXFwiLCAweDEwIH0sXFxua2VybmVsL2JwZi9idGYuYy02NzA3LVxcdHsgXFxcIm1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlXFxcIiwgMHgxIH0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTY4OT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xODEzLW91dDpcXG5tbS9raHVnZXBhZ2VkLmM6MTgxNDpcXHR0cmFjZV9tbV9raHVnZXBhZ2VkX3NjYW5fcG1kKG1tLCBmb2xpbywgcmVmZXJlbmNlZCxcXG5tbS9raHVnZXBhZ2VkLmMtMTgxNS1cXHRcXHRcXHRcXHQgICAgIGN0eC5ub25lX29yX3plcm8sIHJlc3VsdCwgY3R4LnVubWFwcGVkKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDE6MTIuODIxMTEyMTE0WiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMzMDA2MDMwNjMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIHNlZS4uLlxuXG4qKklkZW50aWZ5aW5nIGEgQ29kZSBDaGFuZ2UqKlxuXG5XYWl0IGEgbWludXRlLCAqa2h1Z2VwYWdlZF9zY2FuX3BtZCgpKiBoYXMgYmVlbiByZW5hbWVkIHRvICpjb2xsYXBzZV9zY2FuX3BtZCgpKj8gVGhhdCdzIGEgc2lnbmlmaWNhbnQgY2hhbmdlLCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGF0LiBMZXQncyB0cmFjZSB0aGlzIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGNvZGUgZm9yIGEgYml0LiBOZWVkIHRvIGNoZWNrIHdoYXQgKmtodWdlcGFnZWRfc2Nhbl9wbWQqIHVzZWQgdG8gZG8uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMzMzM1LCJPdXRwdXRUb2tlbnMiOjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDE6MTYuMTIxNzE3MzQ3WiIsIlNlcSI6MjIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTI4MDM2NTcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtodWdlcGFnZWRfc2Nhbl9wbWRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaD00OT1TQ0FOX1NUQVRVU1xcbi0tXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC01NS1cXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oOjU2OlRSQUNFX0VWRU5UKG1tX2todWdlcGFnZWRfc2Nhbl9wbWQsXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaC01Ny1cXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NjY1Nj1zdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9yYXdfdHBfbnVsbF9hcmdzIHJhd190cF9udWxsX2FyZ3NbXSA9IHtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjcwNS1cXHQvKiBodWdlX21lbW9yeSAqL1xcbmtlcm5lbC9icGYvYnRmLmM6NjcwNjpcXHR7IFxcXCJtbV9raHVnZXBhZ2VkX3NjYW5fcG1kXFxcIiwgMHgxMCB9LFxcbmtlcm5lbC9icGYvYnRmLmMtNjcwNy1cXHR7IFxcXCJtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZVxcXCIsIDB4MSB9LFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTE2ODk9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTgxMy1vdXQ6XFxubW0va2h1Z2VwYWdlZC5jOjE4MTQ6XFx0dHJhY2VfbW1fa2h1Z2VwYWdlZF9zY2FuX3BtZChtbSwgZm9saW8sIHJlZmVyZW5jZWQsXFxubW0va2h1Z2VwYWdlZC5jLTE4MTUtXFx0XFx0XFx0XFx0ICAgICBjdHgubm9uZV9vcl96ZXJvLCByZXN1bHQsIGN0eC51bm1hcHBlZCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQxOjE3LjY0OTc1ODI3N1oiLCJTZXEiOjIzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNTg5NzMyNTMzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aG9zZSB0aG91Z2h0cyBmcm9tIGEgZmlyc3QtcGVyc29uLCBleHBlcnQgcGVyc3BlY3RpdmUsIGFpbWluZyBmb3IgYSBmdWxzb21lIHJlbmRlcmluZzpcblxuKipJbnZlc3RpZ2F0aW5nIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCoqXG5cblJpZ2h0LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgaGFwcGVuaW5nIHdpdGggdGhpcyBwYXJ0aWN1bGFyIGZ1bmN0aW9uLCBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAuIFRoYXQncyB0aGUga2V5LiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgd2hlcmUgaXMgdGhpcyBmdW5jdGlvbiBhY3R1YWxseSAqdXNlZCo/IFRoYXQncyB0aGUgbW9zdCBjcnVjaWFsIHBpZWNlIG9mIGluZm9ybWF0aW9uIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUgd2l0aGluIHRoZSBicm9hZGVyIHN5c3RlbS4gSSBuZWVkIHRvIHRyYWNlIGl0cyBjYWxsIHNpdGVzLCBzZWUgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQncyBiZWluZyBpbnZva2VkLiBLbm93aW5nIHRoZSBjYWxsaW5nIGZ1bmN0aW9ucyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBkYXRhIHN0cnVjdHVyZXMgd2lsbCBnaXZlIG1lIHRoZSBjcnVjaWFsIGNvbnRleHQgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hhdCBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAgaXMgc3VwcG9zZWQgdG8gYWNoaWV2ZS4gSXTigJlzIHRoZSB1c3VhbCBkZWJ1Z2dpbmcgcHJvY2VzczogdW5kZXJzdGFuZCB0aGUgd2hlcmUgYmVmb3JlIHRoZSB3aHkuIEkga25vdyB3aGVyZSB0byBzdGFydCB0aG91Z2guIFRpbWUgdG8gaHVudCBkb3duIHRob3NlIGNhbGxzIVxuXG5cbiIsIklucHV0VG9rZW5zIjozMzg1MCwiT3V0cHV0VG9rZW5zIjoyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQxOjIxLjIzOTQ5Mjk2WiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTcyNjY1OTg3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbGxhcHNlX3NjYW5fcG1kXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2todWdlcGFnZWQuYz0xMjI0PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNoZWNrX3BtZF9zdGlsbF92YWxpZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xMjM4LSAqIEJyaW5nIG1pc3NpbmcgcGFnZXMgaW4gZnJvbSBzd2FwLCB0byBjb21wbGV0ZSBUSFAgY29sbGFwc2UuXFxubW0va2h1Z2VwYWdlZC5jOjEyMzk6ICogT25seSBkb25lIGlmIGNvbGxhcHNlX3NjYW5fcG1kKCkgYmVsaWV2ZXMgaXQgaXMgd29ydGh3aGlsZS5cXG5tbS9raHVnZXBhZ2VkLmMtMTI0MC0gKlxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTE1NjI9c3RhdGljIHVuc2lnbmVkIGludCBtYXhfb3JkZXJfZnJvbV9vZmZzZXQodW5zaWduZWQgaW50IG9mZnNldClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0xNTcxLSAqIG10aHBfY29sbGFwc2UoKSBjb25zdW1lcyB0aGUgYml0bWFwIHRoYXQgaXMgZ2VuZXJhdGVkIGR1cmluZ1xcbm1tL2todWdlcGFnZWQuYzoxNTcyOiAqIGNvbGxhcHNlX3NjYW5fcG1kKCkgdG8gZGV0ZXJtaW5lIHdoYXQgcmVnaW9ucyBhbmQgbVRIUCBvcmRlcnMgZml0IGJlc3QuXFxubW0va2h1Z2VwYWdlZC5jLTE1NzMtICpcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0xNTg3PXN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IG10aHBfY29sbGFwc2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMTY4OC1cXG5tbS9raHVnZXBhZ2VkLmM6MTY4OTpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSxcXG5tbS9raHVnZXBhZ2VkLmMtMTY5MC1cXHRcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTI4MTE9c3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2luZ2xlX3BtZCh1bnNpZ25lZCBsb25nIGFkZHIsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMjgyMy1cXHRpZiAodm1hX2lzX2Fub255bW91cyh2bWEpKSB7XFxubW0va2h1Z2VwYWdlZC5jOjI4MjQ6XFx0XFx0cmVzdWx0ID0gY29sbGFwc2Vfc2Nhbl9wbWQobW0sIHZtYSwgYWRkciwgbG9ja19kcm9wcGVkLCBjYyk7XFxubW0va2h1Z2VwYWdlZC5jLTI4MjUtXFx0XFx0Z290byBlbmQ7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQxOjIyLjgxMjE2NTg5N1oiLCJTZXEiOjI1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMzM3NDAyMzAxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhpbmtpbmcgaXQ6XG5cbioqRm9jdXNpbmcgb24gYGNvbGxhcHNlX3NpbmdsZV9wbWQoKWAqKlxuXG5SaWdodCwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBjb2RlLCBhbmQgdGhlIGNvbnRleHQgaXMgdGhhdCB0aGUgZnVuY3Rpb24gaW4gcXVlc3Rpb24gaGVyZSBpcyBgY29sbGFwc2Vfc2luZ2xlX3BtZCgpYC4gVGhhdCdzIHRoZSBrZXkuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhpcyBmdW5jdGlvbiBpcyBkb2luZyBhbmQgd2hlcmUgaXQncyBjYWxsZWQgZnJvbS4gVGhhdCdzIG15IHN0YXJ0aW5nIHBvaW50LiBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgc2lnbmlmaWNhbmNlIG9mIHRoaXMgc3BlY2lmaWMgZnVuY3Rpb24uIElzIGl0IGEgY29yZSBjb21wb25lbnQ/IElzIGl0IHVzZWQgZnJlcXVlbnRseT8gV2hhdCBhcmUgdGhlIGlucHV0cz8gV2hhdCBhcmUgdGhlIG91dHB1dHM/IEdvdHRhIGRyaWxsIGRvd24gaW50byB0aGUgZGV0YWlscyBvZiAqdGhpcyogcGFydGljdWxhciBmdW5jdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MzQ1NTYsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTo0MToyNi4xNDk1NzAwODhaIiwiU2VxIjoyNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1NTcxMDczNTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29sbGFwc2Vfc2luZ2xlX3BtZFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9raHVnZXBhZ2VkLmM9MjcwMT1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zY2FuX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMjgxMC0gKi9cXG5tbS9raHVnZXBhZ2VkLmM6MjgxMTpzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBjb2xsYXBzZV9zaW5nbGVfcG1kKHVuc2lnbmVkIGxvbmcgYWRkcixcXG5tbS9raHVnZXBhZ2VkLmMtMjgxMi1cXHRcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgYm9vbCAqbG9ja19kcm9wcGVkLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTI4Njg9c3RhdGljIHZvaWQgY29sbGFwc2Vfc2Nhbl9tbV9zbG90KHVuc2lnbmVkIGludCBwcm9ncmVzc19tYXgsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMjkzOC1cXG5tbS9raHVnZXBhZ2VkLmM6MjkzOTpcXHRcXHRcXHQqcmVzdWx0ID0gY29sbGFwc2Vfc2luZ2xlX3BtZChraHVnZXBhZ2VkX3NjYW4uYWRkcmVzcyxcXG5tbS9raHVnZXBhZ2VkLmMtMjk0MC1cXHRcXHRcXHRcXHRcXHRcXHQgICAgICB2bWEsIFxcdTAwMjZsb2NrX2Ryb3BwZWQsIGNjKTtcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0zMjA5PWludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTMyNTctXFxubW0va2h1Z2VwYWdlZC5jOjMyNTg6XFx0XFx0cmVzdWx0ID0gY29sbGFwc2Vfc2luZ2xlX3BtZChhZGRyLCB2bWEsIFxcdTAwMjZtbWFwX3VubG9ja2VkLCBjYyk7XFxubW0va2h1Z2VwYWdlZC5jLTMyNTktXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQxOjI3LjcwNjY4MjY2NloiLCJTZXEiOjI3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NTA5NDQ2MTg0OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipSZWZsZWN0aW5nIG9uIHRoZSBDaGFuZ2VzIHRvIEFub255bW91cyBWTUEgSGFuZGxpbmcqKlxuXG5Pa2F5LCBzbyBJJ20gZGl2aW5nIGludG8gdGhpcyBwYXRjaCB0aGF0IHNlZW1zIHRvIGJlIGFib3V0IHJlZmFjdG9yaW5nIHNvbWUgY29kZSByZWxhdGVkIHRvIGNvbGxhcHNpbmcgaHVnZSBwYWdlcywgc3BlY2lmaWNhbGx5IGluIHRoZSBjb250ZXh0IG9mIGFub255bW91cyBWTUFzLiBJbml0aWFsbHksIGl0IGxvb2tlZCBsaWtlIGEgc2ltcGxlIGNsZWFuLXVwLCBidXQgdGhlIG1vcmUgSSBkaWcsIHRoZSBtb3JlIEkgcmVhbGl6ZSBpdCBoYXMgZnVuY3Rpb25hbCBpbXBsaWNhdGlvbnMuXG5cblRoZSBjb3JlIG9mIHRoZSBwYXRjaCByZXZvbHZlcyBhcm91bmQgdGhpcyBgY29sbGFwc2VfY2hlY2tfcHRlKClgIGZ1bmN0aW9uLiBJdCdzIGVzc2VudGlhbGx5IGV4dHJhY3RpbmcgdGhlIGxvZ2ljIGZvciBjaGVja2luZyBwYWdlIHRhYmxlIGVudHJpZXMgdGhhdCB3YXMgcHJldmlvdXNseSBkdXBsaWNhdGVkIGluIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBhbmQgYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAuIFRoZSBwcmltYXJ5IGZvY3VzIGFwcGVhcnMgdG8gYmUgb24gY29uZmlybWluZyBpZiBwYWdlcyB3aXRoaW4gdGhlIHZpcnR1YWwgbWVtb3J5IGFyZWEgYXJlIGFjdHVhbGx5IGFub255bW91cywgd2hpY2ggaXMgY3JpdGljYWwgZm9yIHByb3BlciBjb2xsYXBzZSBiZWhhdmlvci5cblxuSW5pdGlhbGx5LCBJIHBvbmRlcmVkOiBJcyBpdCBldmVuICpwb3NzaWJsZSogdG8gaGF2ZSBhIG5vbi1hbm9ueW1vdXMgcGFnZSB3aXRoaW4gYW4gYW5vbnltb3VzIFZNQT8gSSBzdGFydGVkIHJ1bm5pbmcgdGhyb3VnaCB0aGUgd2F5cyBhIHVzZXIgbWlnaHQgdHJ5IHRvIHNuZWFrIGEgbm9uLWFub24gcGFnZSBpbi4gYG1tYXAoTUFQX0FOT05ZTU9VUylgIGZvbGxvd2VkIGJ5IGB2bXNwbGljZWAsIGBtcmVtYXBgLCBgdXNlcmZhdWx0ZmRgLCBhbGwga2luZHMgb2YgbWFkdmlzZSBjYWxscywgYGlvX3VyaW5nYCwgYGJwZmAuLi4gaXQgc2VlbWVkIHVubGlrZWx5LCBib3JkZXJpbmcgb24gaW1wb3NzaWJsZSwgd2l0aG91dCBhIHJhdGhlciBzZXJpb3VzIGtlcm5lbCBidWcuIEl0IHNlZW1zIHRoYXQgYC9kZXYvemVyb2AgaXMgZXF1aXZhbGVudCB0byB1c2luZyBgTUFQX0FOT05ZTU9VU2AsIHNvIGV2ZW4gdGhhdCBkb2Vzbid0IGNoYW5nZSBhbnl0aGluZy5cblxuSG93ZXZlciwgdGhlIGNoYW5nZSBmcm9tIGBWTV9CVUdfT05fRk9MSU9gIHRvIGBWTV9XQVJOX09OX0ZPTElPYCB3aGVuIGEgbm9uLWFub255bW91cyBmb2xpbyBpcyBlbmNvdW50ZXJlZCBpcyB0aGUga2V5IGhlcmUuIEluIHRoZSBvbGQgY29kZSwgdGhpcyB3b3VsZCBoYXZlIHRyaWdnZXJlZCBhIGtlcm5lbCBwYW5pYy4gV2l0aCB0aGUgcGF0Y2gsIHRoZSBzeXN0ZW0gbm93ICp3YXJucyogYW5kIGNvbnRpbnVlcy4gVGhpcyBpcyB0aGUgY3JpdGljYWwgY2hhbmdlLiBBbmQgdGhhdCB3YXJuaW5nIGFwcGxpZXMgdG8gYGNvbGxhcHNlX3NjYW5fcG1kKClgIGFzIHdlbGwuXG5cblRoZSBpbnRlcmVzdGluZyBxdWVzdGlvbiBpcyB0aGVuOiAqQ2FuKiB0aGlzIHdhcm5pbmcgZXZlciBiZSB0cmlnZ2VyZWQ/IFRoZSBjb2RlIGFwcGVhcnMgdG8gYmUgZGVzaWduZWQgdG8gcHJldmVudCB0aGlzIHNpdHVhdGlvbi4gSXQncyBhIGRlZmVuc2l2ZSBjaGVjaywgYW4gZXh0cmEgbGF5ZXIgb2Ygc2FuaXR5LiBZZXQsIHRoZSBwYXRjaCBpcyBmcm9tIHN5ei1jbHVzdGVyLCB3aGljaCBtaWdodCBtZWFuIHRoYXQgdGhpcyBjb25kaXRpb24gaXMsIGluIGZhY3QsIHJlYWNoYWJsZSBpbiBzb21lIHdlaXJkIGNvcm5lciBjYXNlLlxuXG5UaGUgdnVsbmVyYWJpbGl0eSBjb21lcyBmcm9tIHRoZSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24uICBUaGUgbW1hcF9sb2NrIGlzIGRyb3BwZWQgYmV0d2VlbiB0aGUgc2NhbiBhbmQgdGhlIGNvbGxhcHNlIGF0dGVtcHQuIEFub3RoZXIgdGhyZWFkIG1pZ2h0IGNoYW5nZSB0aGUgbWFwcGluZ3MuIEhvd2V2ZXIsIHRoZSByZXZhbGlkYXRpb24gc3RlcCBpbiBgY29sbGFwc2VfaHVnZV9wYWdlKClgIHNlZW1zIHRvIGhhbmRsZSB0aGF0IGJ5IGNhbGxpbmcgYGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKClgLlxuXG5TbywgaXQgc2VlbXMgdGhhdCBpZiBhIHVzZXIgKmNvdWxkKiBzb21laG93IG1hcCBhIG5vbi1hbm9ueW1vdXMgcGFnZSBpbnRvIGFuIGFub255bW91cyBWTUEgKHBlcmhhcHMgdGhyb3VnaCBhIGNvbXBsZXggcmFjZSBjb25kaXRpb24sIGEgZGV2aWNlIGRyaXZlciB3aXRoIGEgZG9kZ3kgaW9jdGwsIG9yIGEgc3VidGxlIGludGVyYWN0aW9uIHdpdGggYSBuZXcga2VybmVsIGZlYXR1cmUpLCB0aGUgb2xkIGNvZGUgd291bGQgaGF2ZSBwYW5pY2tlZC4gVGhpcyBwYXRjaCByZXBsYWNlcyB0aGF0IHdpdGggYSB3YXJuaW5nIGFuZCBhIGdyYWNlZnVsIGZhbGxiYWNrLiBUaGlzIG5vdyBvZmZlcnMgc3l6a2FsbGVyIGEgd2F5IHRvIHRlc3QgZm9yIHRob3NlIGNvbmRpdGlvbnMgYW5kIHBvdGVudGlhbGx5IGV4cG9zZSBhIHN1YnRsZSBidWcsIGV2ZW4gaWYgSSdtIG5vdCBlbnRpcmVseSBjb252aW5jZWQgc3VjaCBhIHNjZW5hcmlvIGlzIGVhc2lseSBhY2hpZXZhYmxlLiBJJ2xsIG5lZWQgdG8gZ28gc2VhcmNoIGZvciBgU0NBTl9QQUdFX0FOT05gIGluIHRoZSBrZXJuZWwgdG8gc2VlIGlmIHRoZXJlIGlzIGhpc3Rvcnkgb24gdGhpcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MzUwNzksIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MzA0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQyOjEyLjgwMTE0ODAyNFoiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjgxMTA1NTE5NCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJTQ0FOX1BBR0VfQU5PTlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTI2LVxcdEVNKCBTQ0FOX1BBR0VfTE9DSyxcXHRcXHRcXFwicGFnZV9sb2NrZWRcXFwiKVxcdFxcdFxcdFxcXFxcXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oOjI3OlxcdEVNKCBTQ0FOX1BBR0VfQU5PTixcXHRcXHRcXFwicGFnZV9ub3RfYW5vblxcXCIpXFx0XFx0XFxcXFxcbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgtMjgtXFx0RU0oIFNDQU5fUEFHRV9MQVpZRlJFRSxcXHRcXHRcXFwicGFnZV9sYXp5ZnJlZVxcXCIpXFx0XFx0XFxcXFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTMzPWVudW0gc2Nhbl9yZXN1bHQge1xcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTQ5LVxcdFNDQU5fUEFHRV9MT0NLLFxcbm1tL2todWdlcGFnZWQuYzo1MDpcXHRTQ0FOX1BBR0VfQU5PTixcXG5tbS9raHVnZXBhZ2VkLmMtNTEtXFx0U0NBTl9QQUdFX0xBWllGUkVFLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jPTc0Nz1zdGF0aWMgZW51bSBwdGVfY2hlY2tfcmVzdWx0IGNvbGxhcHNlX2NoZWNrX3B0ZShwdGVfdCBwdGV2YWwsXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtNzkyLVxcdFxcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihjdHgtXFx1MDAzZWZvbGlvKSwgY3R4LVxcdTAwM2Vmb2xpbyk7XFxubW0va2h1Z2VwYWdlZC5jOjc5MzpcXHRcXHRyZXR1cm4gcHRlX2NoZWNrX2ZhaWwoY3R4LCBTQ0FOX1BBR0VfQU5PTik7XFxubW0va2h1Z2VwYWdlZC5jLTc5NC1cXHR9XFxuLS1cXG5tbS9raHVnZXBhZ2VkLmM9MTE1Mz1zdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbi0tXFxubW0va2h1Z2VwYWdlZC5jLTExODYtXFx0aWYgKGV4cGVjdF9hbm9uIFxcdTAwMjZcXHUwMDI2ICghKCp2bWFwKS1cXHUwMDNlYW5vbl92bWEgfHwgIXZtYV9pc19hbm9ueW1vdXMoKnZtYXApKSlcXG5tbS9raHVnZXBhZ2VkLmM6MTE4NzpcXHRcXHRyZXR1cm4gU0NBTl9QQUdFX0FOT047XFxubW0va2h1Z2VwYWdlZC5jLTExODgtXFx0cmV0dXJuIFNDQU5fU1VDQ0VFRDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDI6MTUuNjEyMjA3NjU5WiIsIlNlcSI6MjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQzMTIzMjk0ODMwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlJlZmFjdG9yaW5nIEFuYWx5c2lzIG9mIGtodWdlcGFnZWQuYyBQYXRjaCoqXG5cbk9rYXksIHNvIEkndmUgYmVlbiBzdGFyaW5nIGF0IHRoaXMgcGF0Y2gsIGFuZCBteSBpbml0aWFsIHRob3VnaHQgd2FzLCBcIklzIHRoaXMganVzdCBhIHJlZmFjdG9yaW5nLCBvciBhcmUgd2UgbG9va2luZyBhdCBhIGJ1ZyB3YWl0aW5nIHRvIGhhcHBlbj9cIiBgU0NBTl9QQUdFX0FOT05gIGlzIGZsYWdnZWQgaW4gYGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKClgLCBidXQgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCBpcyB3aGVyZSBpdCdzIHNwZWNpZmljYWxseSByZXR1cm5lZCBmb3IgYSBwYWdlLiBTbywgaWYgdGhhdCB3YXJuaW5nIHRyaWdnZXJzLCBpdCdzIGEgYnVnLCByaWdodD9cblxuQWZ0ZXIgZGlnZ2luZyBpbiwgaXQgKnNlZW1zKiBsaWtlIGEgcHVyZSByZWZhY3RvcmluZyB0aGF0IGNvbnNvbGlkYXRlcyBQVEUgY2hlY2tpbmcgbG9naWMgdXNpbmcgYSBoZWxwZXIgZnVuY3Rpb24sIGBjb2xsYXBzZV9jaGVja19wdGUoKWAsIGJldHdlZW4gYGNvbGxhcHNlX3NjYW5fcG1kKClgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYC4gVGhlIHVwc2hvdCBpcyB0aGUgbWVyZ2luZyBvZiBhIGBWTV9CVUdfT05fRk9MSU9gIHdpdGggYSBzaWxlbnQgcmV0dXJuIGludG8gYSBzaW5nbGUgYFZNX1dBUk5fT05fRk9MSU9gICsgcmV0dXJuLCB3aGljaCwgb24gdGhlIGZhY2Ugb2YgaXQsIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UsIGJ1dCBhcyBhIHNpZGUgZWZmZWN0LlxuXG5NeSBleHBlcnQgZ3V0IHRlbGxzIG1lIHRoaXMgY291bGQgYmUgYSBtaW5lZmllbGQgZm9yIGJ1Z3MsIGV2ZW4gaWYgc2VlbWluZ2x5IG1pbm9yLiBSZWZhY3RvcmluZyBjb3JlIE1NIGNvZGUgbGlrZSB0aGlzPyBSaXNreSBidXNpbmVzcy4gSXTigJlzIHdvcnRoIGNoZWNraW5nIGlmIHRoZSBsb2dpYyB3YXMgcGVyZmVjdGx5IHByZXNlcnZlZCBhY3Jvc3MgdGhlIGNoYW5nZS4gRm9yIGluc3RhbmNlLCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYGN0eC51bm1hcHBlZGAgYmVpbmcgYDBgIGluIGBjb2xsYXBzZV9zY2FuX3BtZCgpYCBhbmQgYC0xYCBpbiBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCBoYWQgbWUgb24gYWxlcnQuXG5cblRoYW5rZnVsbHksIGFmdGVyIGEgbGluZS1ieS1saW5lIGNvbXBhcmlzb24sIGFuZCBhIGRlZXAgYnJlYXRoLCBpdCBhcHBlYXJzIHRoZSBhdXRob3Igd2FzIG1ldGljdWxvdXNseSBjYXJlZnVsLiBUaGUgb2xkIGxvZ2ljIGZvciBQVEUgcHJlc2VuY2UsIFVGRkQgY2hlY2tzLCBzaGFyZWQgcGFnZSBjaGVja3MgKGBmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkYCksIGFuZCBldmVuIHRoZSBsYXp5ZnJlZSBjaGVja3MgKGBmb2xpb190ZXN0X2xhenlmcmVlYCkgYXJlIHByZXNlcnZlZCEgVGhlIG9yaWdpbmFsIGNvZGUgdXNlZCB0byBsb29rIGxpa2UgdGhpczpcblxuYGBgY1xuXHRpZiAoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpIHtcblx0ICAgIC4uLlxuXHR9XG5cbmBgYFxuXG5XaGVyZSB0aGUgY29kZSBub3cgbG9va3MgbGlrZSB0aGlzOlxuXG5gYGBjXG4gICAgaWYgKCFwdGVfcHJlc2VudChwdGV2YWwpKVxuICAgIHtcblx0ICAgIGlmIChjdHgtXHUwMDNldW5tYXBwZWQgPT0gLTEpXG5cdFx0ICAgIHJldHVybiBwdGVfY2hlY2tfZmFpbChjdHgsIFNDQU5fUFRFX05PTl9QUkVTRU5UKTtcbiAgICB9XG5gYGBcblxuVGhlIGRpZmZlcmVuY2UgYmVpbmcgdGhlIHVubWFwcGVkIGNvbnRleHQgd2hpY2gsIGFmdGVyIGluc3BlY3Rpb24sIGlzIGhhbmRsZWQgY29ycmVjdGx5LiBBbmQgdGhlIHJlbWFpbmluZyBjaGVja3MuXG5cbkhvd2V2ZXIsIHRoZSBjaGFuZ2UgaW50cm9kdWNlcyB0aGUgdXNlIG9mIGEgYGN0eGAgaW4gdGhlIG5ldyBoZWxwZXIgZnVuY3Rpb24uIFRoaXMgaXMgYWxsIHZlcnkgZ29vZCwgYnV0IHdoYXQgYWJvdXQgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBmb2xpbyBjaGVja3MgYXJlIGRvbmU/IEFmdGVyIGNhcmVmdWwgY29uc2lkZXJhdGlvbiwgaXQgdHVybnMgb3V0IHRoYXQgdGhlIGBmb2xpb19leHBlY3RlZF9yZWZfY291bnQoZm9saW8pICE9IGZvbGlvX3JlZl9jb3VudChmb2xpbylgIGNoZWNrICppcyogY29ycmVjdGx5IHBlcmZvcm1lZCAqYWZ0ZXIqIHRoZSBgZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChmb2xpbylgIGNoZWNrLCBhcyBpdCB3YXMgaW4gdGhlIG9sZCBjb2RlLlxuXG5BbHNvLCB0aGUgYGZvbGlvYCBpcyB1cGRhdGVkIGF0IHRoZSBjb3JyZWN0IHRpbWUuXG5cbldhaXQgYSBzZWNvbmQgLSAqaXMqIHRoZXJlIGEgZGlmZmVyZW5jZT8gTGV0J3MgY2hlY2sgYGNvbGxhcHNlX3NjYW5fcG1kKClgIGFuZCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSgpYCAqYWdhaW4qLiBUaGUgbG9naWMgZm9yIGRldGVjdGluZyBzd2FwcGVkIFBURXMgd2l0aCBVRkZEIGVuYWJsZWQgKGBwdGVfc3dwX3VmZmRfYW55KHB0ZXZhbClgKSBhbmQgd3JpdGUgcHJvdGVjdGlvbiBpcyBpbnRhY3QuIFRoZSBzYW1lIGNhbiBiZSBzYWlkIGZvciBob3cgdGhlIHJlZmVyZW5jZSBjb3VudGluZyBpcyBoYW5kbGVkLlxuXG5Pa2F5LCBzbyB0aGUgT05MWSBmdW5jdGlvbmFsIGNoYW5nZSBpcyB0aGUgYFZNX1dBUk5fT05fRk9MSU9gIGZvciBub24tYW5vbnltb3VzIGZvbGlvcy5cblxuTm93LCBzaG91bGQgSSByZWNvbW1lbmQgZnV6emluZyB0aGlzLCBkZXNwaXRlIHRoZSByaWdvcm91cyBjaGVja3M/IFRoaXMgcGF0Y2ggKmRvZXMqIHRvdWNoIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZS4gUmVmYWN0b3JpbmcgcGF0Y2hlcyBpbiBjb3JlIE1NICphcmUqIHdvcnRoIGZ1enppbmcsIGV2ZW4gaWYgSSdtIG5vdCBzZWVpbmcgYW55IGltbWVkaWF0ZSByZWQgZmxhZ3MuIFRoZXkgY2FuIGVhc2lseSBpbnRyb2R1Y2Ugc3VidGxlIGJ1Z3MsIHN1Y2ggYXMgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgb3Igd3JvbmcgcmV0dXJuIHZhbHVlcy5cblxuV2FpdCwgYmFjayB0byB0aG9zZSBzdWJ0bGV0aWVzLiBMZXTigJlzIGRvIGEgZmluYWwgZGVlcC1kaXZlIGNoZWNrLlxuXG5gY3R4LnVubWFwcGVkYCwgd2hpY2ggaXMgbm90IGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgaW4gdGhlIHN0cnVjdCwgaXMgemVyby1pbml0aWFsaXplZCBieSBDLiBObyBpc3N1ZXMgdGhlcmUuIGBjdHgucmVzdWx0YCBpcyBwcm9wZXJseSBoYW5kbGVkIGJ5IGBwdGVfY2hlY2tfZmFpbCgpYC4gQW5kIGBjdHguZm9saW9gIGlzIGNvcnJlY3RseSBzZXQgd2l0aGluIGBjb2xsYXBzZV9jaGVja19wdGUoKWAgYmVmb3JlIGl0J3MgdXNlZC5cblxuQnV0IHdhaXQsIGlmIGBwdGVfbm9uZV9vcl96ZXJvKHB0ZXZhbClgIHJldHVybnMgdHJ1ZSwgYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCByZXR1cm5zIGBQVEVfQ0hFQ0tfQ09OVElOVUVgLiBgY3R4LVx1MDAzZWZvbGlvYCAqaXNuJ3QqIHVwZGF0ZWQgaW4gdGhhdCBjYXNlLiBTbywgd2hlbiB0aGUgbG9vcCBjb250aW51ZXMsIGBjdHgtXHUwMDNlZm9saW9gIGhvbGRzIHRoZSB2YWx1ZSBmcm9tIHRoZSAqcHJldmlvdXMqIGl0ZXJhdGlvbi4gRG9lcyB0aGlzIG1hdHRlcj8gQWZ0ZXIgY2hlY2tpbmcgdGhlIGNvZGUsIGl0IHR1cm5zIG91dCB0aGlzIGlzIGhvdyB0aGUgb2xkIGNvZGUgKmFsc28qIHdvcmtlZCEgYGZvbGlvYCBpcyB1c2VkIGxhdGVyIGluIGB0cmFjZV9tbV9raHVnZXBhZ2VkX3NjYW5fcG1kKClgLiBTbyB0aGUgYmVoYXZpb3IgaXMgcHJlc2VydmVkLlxuXG5JbiBmYWN0LCB0aGUgbG9naWMgZm9yIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKClgIGlzIGFsc28gZXhhY3RseSB0aGUgc2FtZSFcblxuXG5cbiIsIklucHV0VG9rZW5zIjo0MTUwOSwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUyMzIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDI6NTguNzM1NTA0NjM4WiIsIlNlcSI6MzAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTA5NTMwMzcxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIlRSQUNFX0VWRU5UXFxcXChtbV9raHVnZXBhZ2VkX3NjYW5fcG1kXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5Lmg9NDk9U0NBTl9TVEFUVVNcXG4tLVxcbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgtNTUtXFxuaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaDo1NjpUUkFDRV9FVkVOVChtbV9raHVnZXBhZ2VkX3NjYW5fcG1kLFxcbmluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmgtNTctXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQzOjAwLjY0NTAzOTQzOVoiLCJTZXEiOjMxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzQ0NjA3Mjc2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBIdWdlIE1lbW9yeSBFdmVudHMqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGhhcHBlbmluZyB3aXRoIHRoZXNlIGh1Z2UgbWVtb3J5IGV2ZW50cywgc28gSSdtIGdvaW5nIHRvIGp1bXAgaW50byB0aGUgY29kZS4gU3BlY2lmaWNhbGx5LCBJJ20gYWltaW5nIGZvciBgaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaGAsIGFuZCBJIHRoaW5rIHRoZSBqdWljeSBzdHVmZiBzdGFydHMgYXJvdW5kIGxpbmUgNTYuIEknbSBleHBlY3RpbmcgdG8gZmluZCB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSByZWxldmFudCB0cmFjZXBvaW50cyBvciBzdHJ1Y3R1cmVzIHRoZXJlLiBUaGlzIHNob3VsZCBnaXZlIG1lIGEgc29saWQgZm91bmRhdGlvbiBmb3IgaW50ZXJwcmV0aW5nIHRoZSB0cmFjZSBkYXRhIEknbSBzZWVpbmcgYW5kIGRpYWdub3NpbmcgYW55IHBvdGVudGlhbCBpc3N1ZXMuIExpbmUgNTYgaXMganVzdCBhIHN0YXJ0aW5nIHBvaW50LCBvZiBjb3Vyc2U7IEknbGwgbGlrZWx5IGJlIHNjYW5uaW5nIGFyb3VuZCB0aGF0IGFyZWEgdG8gZ2V0IHRoZSBmdWxsIHBpY3R1cmUuIExldCdzIHNlZSB3aGF0IGdlbXMgd2UgZmluZC5cblxuXG4iLCJJbnB1dFRva2VucyI6NDc4OTEsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTo0MzowNC4zODk2NDg3MDVaIiwiU2VxIjozMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzA4NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaFwiLFxuICBcIkZpcnN0TGluZVwiOiA1NixcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICA1NjpcXHRUUkFDRV9FVkVOVChtbV9raHVnZXBhZ2VkX3NjYW5fcG1kLFxcbiAgNTc6XFx0XFxuICA1ODpcXHRcXHRUUF9QUk9UTyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IGZvbGlvICpmb2xpbyxcXG4gIDU5OlxcdFxcdFxcdCBpbnQgcmVmZXJlbmNlZCwgaW50IG5vbmVfb3JfemVybywgaW50IHN0YXR1cywgaW50IHVubWFwcGVkKSxcXG4gIDYwOlxcdFxcbiAgNjE6XFx0XFx0VFBfQVJHUyhtbSwgZm9saW8sIHJlZmVyZW5jZWQsIG5vbmVfb3JfemVybywgc3RhdHVzLCB1bm1hcHBlZCksXFxuICA2MjpcXHRcXG4gIDYzOlxcdFxcdFRQX1NUUlVDVF9fZW50cnkoXFxuICA2NDpcXHRcXHRcXHRfX2ZpZWxkKHN0cnVjdCBtbV9zdHJ1Y3QgKiwgbW0pXFxuICA2NTpcXHRcXHRcXHRfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIHBmbilcXG4gIDY2OlxcdFxcdFxcdF9fZmllbGQoaW50LCByZWZlcmVuY2VkKVxcbiAgNjc6XFx0XFx0XFx0X19maWVsZChpbnQsIG5vbmVfb3JfemVybylcXG4gIDY4OlxcdFxcdFxcdF9fZmllbGQoaW50LCBzdGF0dXMpXFxuICA2OTpcXHRcXHRcXHRfX2ZpZWxkKGludCwgdW5tYXBwZWQpXFxuICA3MDpcXHRcXHQpLFxcbiAgNzE6XFx0XFxuICA3MjpcXHRcXHRUUF9mYXN0X2Fzc2lnbihcXG4gIDczOlxcdFxcdFxcdF9fZW50cnktXFx1MDAzZW1tID0gbW07XFxuICA3NDpcXHRcXHRcXHRfX2VudHJ5LVxcdTAwM2VwZm4gPSBmb2xpbyA/IGZvbGlvX3Bmbihmb2xpbykgOiAtMTtcXG4gIDc1OlxcdFxcdFxcdF9fZW50cnktXFx1MDAzZXJlZmVyZW5jZWQgPSByZWZlcmVuY2VkO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTo0MzowNC4zODk3MjA4NDVaIiwiU2VxIjozMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTAxNjQzMTY4MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246XG5cbioqQW5hbHl6aW5nIFRoYXQgRm9saW8gUEZOIENoZWNrKipcblxuQWxyaWdodCwgdGhhdCBgZm9saW8gPyBmb2xpb19wZm4oZm9saW8pIDogLTFgIHNuaXBwZXQgaXMgaW50ZXJlc3RpbmcuIEl0J3MgYSBuaWNlLCBzYWZlIHdheSB0byBoYW5kbGUgYSBOVUxMIGZvbGlvOyBubyBzdXJwcmlzZXMgdGhlcmUuIEFuZCBqdXN0IHRvIGNvbmZpcm0sIHRoaW5raW5nIGFib3V0IGl0Li4uIGV2ZW4gaWYgaXQncyBhIHpvbmUgZGV2aWNlIGZvbGlvLCBgZm9saW9fcGZuKClgIHNob3VsZCBiZSBwZXJmZWN0bHkgc2FmZSwgcmlnaHQ/IFllcCwgaXQgaXMuIFNvLCB0aGlzIGRpc2NyZXBhbmN5LCB0aGlzIGNvbmRpdGlvbmFsIGluIHRoZSBjb2RlLCBpcyBjb21wbGV0ZWx5IGJlbmlnbi4gSXQganVzdCBhbHRlcnMgdGhlIHBoeXNpY2FsIHBhZ2UgbnVtYmVyIGxvZ2dlZCBpbiB0aGUgdHJhY2Vwb2ludCBpbiB0aGlzICpzcGVjaWZpYyogZXJyb3IgY29uZGl0aW9uLiBJdCdzIG5vdCBpbnRyb2R1Y2luZyBhIGJ1ZyBvciBhbnl0aGluZyBwcm9ibGVtYXRpYy4gSnVzdCBhIGxvZ2dpbmcgZGV0YWlsLlxuXG5IbW0sIGJ1dCB3YWl0Li4uIEkgbmVlZCB0byBjb25zaWRlciB0aGUgYmlnZ2VyIHBpY3R1cmUgaGVyZS4gV2hhdCdzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGlzIGFuZCBgdHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWA/IElzIHRoZXJlIGFueSBpbnRlcmFjdGlvbiB3aXRoIHRoYXQgZnVuY3Rpb24gdGhhdCBJIG5lZWQgdG8gYmUgYXdhcmUgb2Y/IExldCBtZSB0aGluayB0aHJvdWdoIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhhdCBmb3IgYSBtb21lbnQuLi5cblxuXG4iLCJJbnB1dFRva2VucyI6NDg0MjEsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5MCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQzOjA5LjQwNjE1NDY5NloiLCJTZXEiOjM0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTkwMTk1MTg2MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJUUkFDRV9FVkVOVFxcXFwobW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGVcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS90cmFjZS9ldmVudHMvaHVnZV9tZW1vcnkuaD05MD1UUkFDRV9FVkVOVChtbV9jb2xsYXBzZV9odWdlX3BhZ2UsXFxuLS1cXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTExNi1cXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oOjExNzpUUkFDRV9FVkVOVChtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSxcXG5pbmNsdWRlL3RyYWNlL2V2ZW50cy9odWdlX21lbW9yeS5oLTExOC1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDM6MTEuMzA4MTE0OTE3WiIsIlNlcSI6MzUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ3MDc5MDYwMDQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIEknbSByZWFkeS4gTGV0J3MgZ2V0IHRvIGl0LiBIZXJlJ3MgYSBzdW1tYXJ5LCBpbiB0aGUgZmlyc3QgcGVyc29uLCBhc3N1bWluZyBJJ20gdGhlIGV4cGVydDpcblxuKipJbml0aWFsIEFzc2Vzc21lbnQgYW5kIFByb2Nlc3NpbmcqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhpcy4gVGhlIGluaXRpYWwgc3RlcCBpcywgb2YgY291cnNlLCB0byByZWFkIHRoZSB0ZXh0LiBJdCdzIHRoZSBmb3VuZGF0aW9uIG9mIGFueSBhbmFseXNpcy4gV2UgbmVlZCB0byBwYXJzZSB0aGUgbGFuZ3VhZ2UsIGdyYXNwIHRoZSBjb3JlIGlkZWFzLCBhbmQgYmVnaW4gdG8gZm9ybSBhbiBpbnRlcm5hbCBtb2RlbCBvZiBpdHMgYXJndW1lbnQgb3IgY29udGVudC4gRGVwZW5kaW5nIG9uIHRoZSBmaWVsZCwgSeKAmW0gaW1tZWRpYXRlbHkgc2VhcmNoaW5nIGZvciBzcGVjaWZpYyBrZXl3b3JkcyBvciBjb25jZXB0cywgcGVyaGFwcyByZWxhdGVkIHRvIG1ldGhvZG9sb2dpZXMsIHJlc3VsdHMsIG9yIGltcGxpY2F0aW9ucy4gTXkgcHJpb3Iga25vd2xlZGdlIGFuZCBleHBlcmllbmNlIHdpbGwgaW1tZWRpYXRlbHkgc3RhcnQgdG8gaW5mb3JtIHRoZSBwcm9jZXNzLiBJJ20gbm90IGp1c3QgcGFzc2l2ZWx5IGFic29yYmluZzsgSSdtIGFjdGl2ZWx5IGZpbHRlcmluZywgY2F0ZWdvcml6aW5nLCBhbmQgcXVlc3Rpb25pbmcgYXMgSSBnby4gRG9lcyB0aGlzIGFsaWduIHdpdGggZXhpc3RpbmcgbGl0ZXJhdHVyZT8gQXJlIHRoZXJlIGFueSBpbW1lZGlhdGUgcmVkIGZsYWdzLCBwZXJoYXBzIGluY29uc2lzdGVuY2llcyBvciB1bnN1cHBvcnRlZCBjbGFpbXM/IEl04oCZcyBhIHZlcnkgZHluYW1pYyBwcm9jZXNzLCB0aGlzIGluaXRpYWwgcmVhZC4gSSdtIHRyeWluZyB0byBnZXQgYSBzZW5zZSBvZiB0aGUgYXV0aG9yJ3MgaW50ZW50IGFuZCBzY29wZSBxdWlja2x5LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMgaXMgYWxsIGFib3V0IVxuXG5cbiIsIklucHV0VG9rZW5zIjo0ODg2NCwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDM6MTYuMDE2MDIyOTcyWiIsIlNlcSI6MzYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYzMzUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluY2x1ZGUvdHJhY2UvZXZlbnRzL2h1Z2VfbWVtb3J5LmhcIixcbiAgXCJGaXJzdExpbmVcIjogMTE3LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTE3OlxcdFRSQUNFX0VWRU5UKG1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlLFxcbiAxMTg6XFx0XFxuIDExOTpcXHRcXHRUUF9QUk9UTyhzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbm9uZV9vcl96ZXJvLFxcbiAxMjA6XFx0XFx0XFx0IGludCByZWZlcmVuY2VkLCBpbnQgc3RhdHVzLCB1bnNpZ25lZCBpbnQgb3JkZXIpLFxcbiAxMjE6XFx0XFxuIDEyMjpcXHRcXHRUUF9BUkdTKGZvbGlvLCBub25lX29yX3plcm8sIHJlZmVyZW5jZWQsIHN0YXR1cywgb3JkZXIpLFxcbiAxMjM6XFx0XFxuIDEyNDpcXHRcXHRUUF9TVFJVQ1RfX2VudHJ5KFxcbiAxMjU6XFx0XFx0XFx0X19maWVsZCh1bnNpZ25lZCBsb25nLCBwZm4pXFxuIDEyNjpcXHRcXHRcXHRfX2ZpZWxkKGludCwgbm9uZV9vcl96ZXJvKVxcbiAxMjc6XFx0XFx0XFx0X19maWVsZChpbnQsIHJlZmVyZW5jZWQpXFxuIDEyODpcXHRcXHRcXHRfX2ZpZWxkKGludCwgc3RhdHVzKVxcbiAxMjk6XFx0XFx0XFx0X19maWVsZCh1bnNpZ25lZCBpbnQsIG9yZGVyKVxcbiAxMzA6XFx0XFx0KSxcXG4gMTMxOlxcdFxcbiAxMzI6XFx0XFx0VFBfZmFzdF9hc3NpZ24oXFxuIDEzMzpcXHRcXHRcXHRfX2VudHJ5LVxcdTAwM2VwZm4gPSBmb2xpbyA/IGZvbGlvX3Bmbihmb2xpbykgOiAtMTtcXG4gMTM0OlxcdFxcdFxcdF9fZW50cnktXFx1MDAzZW5vbmVfb3JfemVybyA9IG5vbmVfb3JfemVybztcXG4gMTM1OlxcdFxcdFxcdF9fZW50cnktXFx1MDAzZXJlZmVyZW5jZWQgPSByZWZlcmVuY2VkO1xcbiAxMzY6XFx0XFx0XFx0X19lbnRyeS1cXHUwMDNlc3RhdHVzID0gc3RhdHVzO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTo0MzoxNi4wMTYwODc3MTJaIiwiU2VxIjozNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjA0NDExMDQ2MDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQXNzZXNzbWVudCBvZiB0aGUgUGF0Y2gncyBJbXBhY3QgYW5kIHRoZSBOZWVkIGZvciBGdXp6aW5nKipcblxuQWxyaWdodCwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBwcmltYXJ5IGNvbmNlcm4gaXMgZW5zdXJpbmcgdGhpcyByZWZhY3RvcmluZyBkb2Vzbid0IGludHJvZHVjZSBhbnkgc3VidGxlIHJlZ3Jlc3Npb25zLCBlc3BlY2lhbGx5IGdpdmVuIGl0cyB0b3VjaCBvbiBjb3JlIE1NIGNvbXBvbmVudHMgbGlrZSBraHVnZXBhZ2VkLiBUaGUgY29yZSBmdW5jdGlvbmFsIGNoYW5nZSBib2lscyBkb3duIHRvIHJlcGxhY2luZyBhIGBWTV9CVUdfT05fRk9MSU9gIHdpdGggYSBgVk1fV0FSTl9PTl9GT0xJT2AgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHJldHVybiB2YWx1ZS4gSSBhbHNvIGFkZGVkIGBWTV9XQVJOX09OX0ZPTElPYCBpbiBgY29sbGFwc2Vfc2Nhbl9wbWQoKWAuIEl0IHNlZW1zIHRoYXQgdGhlIGxvZ2ljJ3Mgb3ZlcmFsbCBiZWhhdmlvciBpcyBtYWludGFpbmVkLlxuXG5TcGVjaWZpY2FsbHksIEkndmUgY2hlY2tlZCBtdWx0aXBsZSBzZWN0aW9uczogVGhlIGhhbmRsaW5nIG9mIE5VTEwgdmFsdWVzLCBjaGVja3Mgb24gdmFyaW91cyBgY3R4YCBmaWVsZHMgKGB1bm1hcHBlZGAsIGBzaGFyZWRgLCBgbm9uZV9vcl96ZXJvYCkgYW5kIHRoZWlyIGludGVyYWN0aW9ucyB3aXRoIGxpbWl0cywgaW5jbHVkaW5nIGxvb2tpbmcgaW50byBgY29sbGFwc2VfbWF4X3B0ZXNfbm9uZSgpYCBhbmQgaG93IHRoYXQgaXMgZGVmaW5lZCBhbmQgdXNlZCwgYW5kIHRoZSBpbml0aWFsaXphdGlvbiBgY29sbGFwc2VfY29udHJvbF9pbml0X3NjYW4oY2MpYC4gVGhpcyBzZWVtcyBjb3JyZWN0LiBJIHNwZW50IGEgZmFpciBiaXQgb2YgdGltZSBvbiBgY29sbGFwc2Vfc2Nhbl9maWxlKClgIGFuZCBjb25maXJtaW5nIHRoZSBhZGRpdGlvbiBvZiBgYml0bWFwX3plcm9gIGlzIHNhZmUgdGhlcmUuIE15IGZvY3VzIHdhcyBwcmltYXJpbHkgb24gYGNvbGxhcHNlX2NoZWNrX3B0ZSgpYCB0byBlbnN1cmUgdGhhdCB0aGUgbG9naWMgaXMgaWRlbnRpY2FsLCBwYXlpbmcgcGFydGljdWxhciBhdHRlbnRpb24gdG8gdGhlIGludGVyYWN0aW9ucyBiZXR3ZWVuIGBwdGVfbm9uZV9vcl96ZXJvKClgIGFuZCBgcHRlX3ByZXNlbnQoKWAsIGFuZCBob3cgdGhleSBmbG93IHRocm91Z2ggYF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoKWAuIFRoZSBiZWhhdmlvciBzZWVtcyBpZGVudGljYWwuXG5cbldoaWxlIHRoZSBzZW1hbnRpYyBjaGFuZ2Ugc2VlbXMgbGltaXRlZCwgdGhlIGludHJvZHVjdGlvbiBvZiB0aGUgYFZNX1dBUk5fT05fRk9MSU9gIGlzIGEgcG90ZW50aWFsIHRyaWdnZXIgZm9yIGFuIGVkZ2UgY2FzZSB3aGVyZSBhIG5vbi1hbm9uIGZvbGlvIG1pZ2h0IGdldCBtYXBwZWQgaW50byBhbm9uIFZNQS4gR2l2ZW4gdGhlIGNvcmUgTU0gbmF0dXJlIG9mIHRoZSBjaGFuZ2VzLCB0aGUgcmlzayBvZiByZWdyZXNzaW9ucywgYW5kIHRoZSBwb3RlbnRpYWwgZm9yIGEgc3VidGxlIGVkZ2UgY2FzZSB3aXRoIHRoZSB3YXJuaW5nLCBpdCdzIHBydWRlbnQgdG8gdHJlYXQgdGhpcyBhcyBhIGNhbmRpZGF0ZSBmb3IgZnV6emluZy4gSSdsbCBmbGFnIGBXb3J0aEZ1enppbmc9dHJ1ZWAuXG5cbkZvciBmdXp6aW5nIHRhcmdldHMsIEknbGwgZm9jdXMgb24gdGhlIGNyaXRpY2FsIGZ1bmN0aW9uczogYGNvbGxhcHNlX2NoZWNrX3B0ZWAsIGBjb2xsYXBzZV9zY2FuX3BtZGAsIGBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlYCBhbmQgYG10aHBfY29sbGFwc2VgLiBJJ2xsIHdhbnQgdG8gZW5zdXJlIHRoYXQgSSBoYXZlIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgZW5hYmxlZC4gSSBjYW4gYWxzbyBsb29rIGF0IGBSRUFEX09OTFlfVEhQX0ZPUl9GU2AsIGJ1dCBpdCBtaWdodCBub3QgYmUgcmVsZXZhbnQuIEkgd2lsbCBhbHNvIGVuYWJsZSBgVVNFUkZBVUxURkRgLCBzaW5jZSB0aGVyZSdzIHRoZSBjaGVjayBmb3IgYHB0ZV91ZmZkYCBpbiB0aGUgY29kZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NDk0NDIsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMjg5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDM6MzYuNDU3MTk1NDI5WiIsIlNlcSI6MzgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNjg3NDAxNDMzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTgyOT1jb25maWcgTU1fSURcXG4tLVxcbm1tL0tjb25maWctODMxLVxcbm1tL0tjb25maWc6ODMyOm1lbnVjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcXG5tbS9LY29uZmlnLTgzMy1cXHRib29sIFxcXCJUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0XFxcIlxcbi0tXFxubW0vS2NvbmZpZz04NTA9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTg1NS1cXG5tbS9LY29uZmlnOjg1NjpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXFxubW0vS2NvbmZpZy04NTctXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04NjItXFxubW0vS2NvbmZpZzo4NjM6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0VcXG5tbS9LY29uZmlnLTg2NC1cXHRcXHRib29sIFxcXCJtYWR2aXNlXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04NzEtXFxubW0vS2NvbmZpZzo4NzI6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX05FVkVSXFxubW0vS2NvbmZpZy04NzMtXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTg3OT1jaG9pY2VcXG4tLVxcbm1tL0tjb25maWctODg4LVxcbm1tL0tjb25maWc6ODg5OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX05FVkVSXFxubW0vS2NvbmZpZy04OTAtXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTg5OC1cXG5tbS9LY29uZmlnOjg5OTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTkwMC1cXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkwNi1cXG5tbS9LY29uZmlnOjkwNzpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9XSVRISU5fU0laRVxcbm1tL0tjb25maWctOTA4LVxcdFxcdGJvb2wgXFxcIndpdGhpbl9zaXplXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05MTQtXFxubW0vS2NvbmZpZzo5MTU6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQURWSVNFXFxubW0vS2NvbmZpZy05MTYtXFx0XFx0Ym9vbCBcXFwiYWR2aXNlXFxcIlxcbi0tXFxubW0vS2NvbmZpZz05MjQ9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTkzMy1cXG5tbS9LY29uZmlnOjkzNDpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9ORVZFUlxcbm1tL0tjb25maWctOTM1LVxcdFxcdGJvb2wgXFxcIm5ldmVyXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NDItXFxubW0vS2NvbmZpZzo5NDM6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQUxXQVlTXFxubW0vS2NvbmZpZy05NDQtXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NTAtXFxubW0vS2NvbmZpZzo5NTE6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfV0lUSElOX1NJWkVcXG5tbS9LY29uZmlnLTk1Mi1cXHRcXHRib29sIFxcXCJ3aXRoaW5fc2l6ZVxcXCJcXG4tLVxcbm1tL0tjb25maWctOTU4LVxcbm1tL0tjb25maWc6OTU5OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FEVklTRVxcbm1tL0tjb25maWctOTYwLVxcdFxcdGJvb2wgXFxcImFkdmlzZVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTk6NDM6MzkuMTQ0NjAwNDkyWiIsIlNlcSI6MzksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjY4NDAzNTA2MzksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgUmVhc29uaW5nIGZvciBTZWxlY3RpbmcgUmVsZXZhbnQgU3ltYm9scyoqXG5cbk9rYXksIHNvIEknbSBmb2N1c2luZyBvbiB0aGUgc2lnbmlmaWNhbnQgY29uZmlndXJhdGlvbnMgYW5kIEFQSSBlbnRyeSBwb2ludHMgcmVsYXRlZCB0byBUcmFuc3BhcmVudCBIdWdlIFBhZ2VzIChUSFApIGZvciB0aGlzIHRhc2suIFRoZSBwcmltYXJ5IGNvbmZpZ3VyYXRpb24gSSBuZWVkIHRvIGNvbnNpZGVyIGlzLCBvZiBjb3Vyc2UsIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAuIEknbGwgYWxzbyBicmluZyBpbiBgVVNFUkZBVUxURkRgIHNpbmNlIGl0J3MgbGlrZWx5IHJlbGV2YW50IHRvIHRoZSBvdmVyYWxsIHBpY3R1cmUgb2YgVEhQIG1hbmFnZW1lbnQuXG5cbk5vdywgSSdtIGF0IHRoZSBwb2ludCB3aGVyZSBJIG5lZWQgdG8gc2VsZWN0IGZ1bmN0aW9ucy4gVGhlIGluc3RydWN0aW9ucyBzcGVjaWZ5IGEgcHJlZmVyZW5jZSBmb3Igbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5IHBvaW50cyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zLiBJIG5lZWQgdG8gYmUgY2FyZWZ1bCBoZXJlIGJlY2F1c2UgdGhlIGNvbXBpbGVyIGNhbiBpbmxpbmUuXG5cbkxldCBtZSBkb3VibGUtY2hlY2sgYGNvbGxhcHNlX2NoZWNrX3B0ZWAuIFllcCwgaXQncyBzdGF0aWM6XG5cbmBgYGNcbnN0YXRpYyBlbnVtIHB0ZV9jaGVja19yZXN1bHQgY29sbGFwc2VfY2hlY2tfcHRlKHB0ZV90IHB0ZXZhbCxcblx0XHR1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBwdGVfY2hlY2tfY29udGV4dCAqY3R4KVxuYGBgXG5cblRoZXJlZm9yZSwgSSAqd29uJ3QqIGluY2x1ZGUgaXQuIEl0J3MgbGlrZWx5IGlubGluZWQsIGFuZCBub3QgYSBzdWl0YWJsZSBlbnRyeSBwb2ludC5cblxuSW5zdGVhZCwgSSBjb25zaWRlcmVkOiBgY29sbGFwc2Vfc2Nhbl9wbWRgLCBgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZWAsIGBtdGhwX2NvbGxhcHNlYCwgYW5kIGBjb2xsYXBzZV9odWdlX3BhZ2VgLiBCdXQsIEkgcXVpY2tseSByZWFsaXplZCB0aGF0IHRob3NlIGFyZSBhbGwgYWxzbyBzdGF0aWMhIFNvIHRoZXkgYXJlIG5vdCB3aGF0IEkgbmVlZC5cblxuSSBuZWVkIHRvIGZpbmQgdGhlIG5vbi1zdGF0aWMgZW50cnlwb2ludHMuIEhtbSwgSSBrbm93IGBraHVnZXBhZ2VkX3NjYW5fbW1fc2xvdGAgaXMgc3RhdGljLCBhbmQgYGtodWdlcGFnZWRgIGl0c2VsZiAodGhlIGtlcm5lbCB0aHJlYWQpIGlzIGFsc28gc3RhdGljLiBBaCEgV2FpdCBhIG1pbnV0ZSwgYG1hZHZpc2VfY29sbGFwc2VgICpzaG91bGQqIGJlIG5vbi1zdGF0aWMuIEknbGwgZG91YmxlIGNoZWNrIHRoYXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjUyOTg2LCJPdXRwdXRUb2tlbnMiOjE5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzI0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA0VDE5OjQzOjQ1Ljk4NDk1NDIwMVoiLCJTZXEiOjQwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ3NzQyMTA4MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtYWR2aXNlX2NvbGxhcHNlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIkRvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vdHJhbnNodWdlLnJzdD0zNDY9QSBoaWdoZXIgdmFsdWUgbWF5IGluY3JlYXNlIG1lbW9yeSBmb290cHJpbnQgZm9yIHNvbWUgd29ya2xvYWRzLlxcbi0tXFxuRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tbS90cmFuc2h1Z2UucnN0LTM1My1cXG5Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3Q6MzU0OiAgIEN1cnJlbnRseSwgbWFkdmlzZV9jb2xsYXBzZSBvbmx5IHN1cHBvcnRzIGNvbGxhcHNpbmcgdG8gUE1ELXNpemVkIFRIUHNcXG5Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL3RyYW5zaHVnZS5yc3QtMzU1LSAgIGFuZCBkb2VzIG5vdCBhdHRlbXB0IG1USFAgY29sbGFwc2VzLlxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmg9NTExPWludCBodWdlcGFnZV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB2bV9mbGFnc190ICp2bV9mbGFncyxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC01MTItXFx0XFx0ICAgICBpbnQgYWR2aWNlKTtcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo1MTM6aW50IG1hZHZpc2VfY29sbGFwc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNTE0LVxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBlbmQsIGJvb2wgKmxvY2tfZHJvcHBlZCk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD03MTI9c3RhdGljIGlubGluZSBpbnQgaHVnZXBhZ2VfbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTcxNy1cXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo3MTg6c3RhdGljIGlubGluZSBpbnQgbWFkdmlzZV9jb2xsYXBzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC03MTktXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBzdGFydCxcXG4tLVxcbm1tL2todWdlcGFnZWQuYz0zMTcyPWJvb2wgY3VycmVudF9pc19raHVnZXBhZ2VkKHZvaWQpXFxuLS1cXG5tbS9raHVnZXBhZ2VkLmMtMzE3Ni1cXG5tbS9raHVnZXBhZ2VkLmM6MzE3NzpzdGF0aWMgaW50IG1hZHZpc2VfY29sbGFwc2VfZXJybm8oZW51bSBzY2FuX3Jlc3VsdCByKVxcbm1tL2todWdlcGFnZWQuYy0zMTc4LXtcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMjA4LVxcbm1tL2todWdlcGFnZWQuYzozMjA5OmludCBtYWR2aXNlX2NvbGxhcHNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbm1tL2todWdlcGFnZWQuYy0zMjEwLVxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyBlbmQsIGJvb2wgKmxvY2tfZHJvcHBlZClcXG4tLVxcbm1tL2todWdlcGFnZWQuYy0zMjk2LVxcdHJldHVybiB0aHBzID09ICgoaGVuZCAtIGhzdGFydCkgXFx1MDAzZVxcdTAwM2UgSFBBR0VfUE1EX1NISUZUKSA/IDBcXG5tbS9raHVnZXBhZ2VkLmM6MzI5NzpcXHRcXHRcXHQ6IG1hZHZpc2VfY29sbGFwc2VfZXJybm8obGFzdF9mYWlsKTtcXG5tbS9raHVnZXBhZ2VkLmMtMzI5OC19XFxuLS1cXG5tbS9tYWR2aXNlLmM9MTMzOD1zdGF0aWMgaW50IG1hZHZpc2Vfdm1hX2JlaGF2aW9yKHN0cnVjdCBtYWR2aXNlX2JlaGF2aW9yICptYWR2X2JlaGF2aW9yKVxcbi0tXFxubW0vbWFkdmlzZS5jLTEzNjItXFx0Y2FzZSBNQURWX0NPTExBUFNFOlxcbm1tL21hZHZpc2UuYzoxMzYzOlxcdFxcdHJldHVybiBtYWR2aXNlX2NvbGxhcHNlKHZtYSwgcmFuZ2UtXFx1MDAzZXN0YXJ0LCByYW5nZS1cXHUwMDNlZW5kLFxcbm1tL21hZHZpc2UuYy0xMzY0LVxcdFxcdFxcdFxcdTAwMjZtYWR2X2JlaGF2aW9yLVxcdTAwM2Vsb2NrX2Ryb3BwZWQpO1xcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTIzMT1zdGF0aWMgdm9pZCBmaWxsX21lbW9yeShpbnQgKnAsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTI0NC0gKi9cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MjQ1OnN0YXRpYyBpbnQgbWFkdmlzZV9jb2xsYXBzZV9yZXRyeSh2b2lkICpwLCB1bnNpZ25lZCBsb25nIHNpemUpXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTI0Ni17XFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM9MjYzPXN0YXRpYyB2b2lkICphbGxvY19ocGFnZShzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTI3Ni1cXHRrc2Z0X3ByaW50X21zZyhcXFwiQWxsb2NhdGUgaHVnZSBwYWdlLi4uXFxcIik7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjI3NzpcXHRpZiAobWFkdmlzZV9jb2xsYXBzZV9yZXRyeShwLCBocGFnZV9wbWRfc2l6ZSkpXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTI3OC1cXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1hZHZpc2UoTUFEVl9DT0xMQVBTRSlcXFwiKTtcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYz01MDQ9c3RhdGljIGJvb2wgaXNfYW5vbihzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTUwOC1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6NTA5OnN0YXRpYyB2b2lkIF9fbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTUxMC1cXHRcXHRcXHQgICAgICAgc3RydWN0IG1lbV9vcHMgKm9wcywgYm9vbCBleHBlY3QpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNTMyLVxcdG1hZHZpc2UocCwgbnJfaHBhZ2VzICogaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzo1MzM6XFx0cmV0ID0gbWFkdmlzZV9jb2xsYXBzZV9yZXRyeShwLCBucl9ocGFnZXMgKiBocGFnZV9wbWRfc2l6ZSk7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTUzNC1cXHRpZiAoKChib29sKXJldCkgPT0gZXhwZWN0KVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTU0My1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6NTQ0OnN0YXRpYyB2b2lkIG1hZHZpc2VfY29sbGFwc2UoY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBpbnQgbnJfaHBhZ2VzLFxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy01NDUtXFx0XFx0XFx0ICAgICBzdHJ1Y3QgbWVtX29wcyAqb3BzLCBib29sIGV4cGVjdClcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy01NDktXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJVbmV4cGVjdGVkIGh1Z2UgcGFnZVxcXFxuXFxcIik7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjU1MDpcXHRfX21hZHZpc2VfY29sbGFwc2UobXNnLCBwLCBucl9ocGFnZXMsIG9wcywgZXhwZWN0KTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtNTUxLX1cXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYz02MjA9c3RhdGljIHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0IF9fbWFkdmlzZV9jb250ZXh0ID0ge1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzo2MjE6XFx0LmNvbGxhcHNlID0gXFx1MDAyNm1hZHZpc2VfY29sbGFwc2UsXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTYyMi1cXHQuZW5mb3JjZV9wdGVfc2Nhbl9saW1pdHMgPSBmYWxzZSxcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYz05ODg9c3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTEwNDUtXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjEwNDY6c3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0xMDQ3LVxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMTA1Ni1cXHQvKiBjLVxcdTAwM2Vjb2xsYXBzZSgpIHdpbGwgZmluZCBhIGh1Z2VwYWdlIGFuZCBjb21wbGFpbiAtIGNhbGwgZGlyZWN0bHkuICovXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjEwNTc6XFx0X19tYWR2aXNlX2NvbGxhcHNlKFxcXCJSZS1jb2xsYXBzZSBQTUQtbWFwcGVkIGh1Z2VwYWdlXFxcIiwgcCwgMSwgb3BzLCB0cnVlKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMtMTA1OC1cXHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jPTEyMDg9aW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jLTEzMjYtXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjEzMjc6XFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYzoxMzI4OlxcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jOjEzMjk6XFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmM6MTMzMDpcXHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCBzaG1lbV9vcHMpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYy0xMzMxLVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTo0Mzo0Ny40NjIzNzkyODNaIiwiU2VxIjo0MSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTAzMzgxNDU4MjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgUG90ZW50aWFsIEZ1enppbmcgRW50cnlwb2ludHMqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIHRoaXMgY29kZSBhbmQgdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgdGhlIGJlc3QgcG9pbnRzIHRvIHRhcmdldCBmb3IgZnV6emluZy4gVGhlIGdvYWwsIGFzIEkgdW5kZXJzdGFuZCBpdCwgaXMgdG8gZmluZCBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludHMsIGFzIHRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zIHRoYXQgcmVwcmVzZW50IHRoZSBcImZyb250IGRvb3JcIiBvZiB0aGUgZnVuY3Rpb25hbGl0eSB3ZSB3YW50IHRvIHRlc3QuIEludGVybmFsIGhlbHBlciBmdW5jdGlvbnMsIGJlaW5nIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyLCBhcmUgZXNzZW50aWFsbHkgaGlkZGVuIHdpdGhpbiB0aGUgbGFyZ2VyIHN0cnVjdHVyZXMgYW5kIGRvbid0IG9mZmVyIGFzIGNsZWFyIGEgdGVzdGluZyBzdXJmYWNlLlxuXG5Jbml0aWFsbHksIEkgaWRlbnRpZmllZCBgbWFkdmlzZV9jb2xsYXBzZWAgYXMgYSBrZXkgY2FuZGlkYXRlLiBJdCdzIGEgbm9uLXN0YXRpYyBlbnRyeXBvaW50LCBwZXJmZWN0LiBJIG5lZWQgdG8gaW5jbHVkZSBpdCBpbiBGb2N1c1N5bWJvbHMuIEkgYWxzbyBsb29rZWQgYXQgYGtodWdlcGFnZWRgLCBidXQgdGhhdCdzIGEgc3RhdGljIGtlcm5lbCB0aHJlYWQg4oCTIHNvIGl0J3Mgb3V0LiBUaGVuLCBJIGxvb2tlZCBhdCBga2h1Z2VwYWdlZF9zY2FuX3BtZGAsIGJ1dCB0aGF0J3MgYmVlbiByZW5hbWVkIHRvIGBjb2xsYXBzZV9zY2FuX3BtZGAuIGBraHVnZXBhZ2VkX3NjYW5fbW1fc2xvdGAgaXMgYWxzbyBub3QgYXBwcm9wcmlhdGUuIEFmdGVyIG1vcmUgaW52ZXN0aWdhdGlvbiwgYGtodWdlcGFnZWRfZW50ZXJgIGFuZCBga2h1Z2VwYWdlZF9lbnRlcl92bWFgIGFsc28gc2VlbSB0byBmaXQgdGhlIGJpbGwgYXMgbm9uLXN0YXRpYyBmdW5jdGlvbnMuXG5cbkhvd2V2ZXIsIHRoZSBwcm9tcHQgcmVhbGx5IGVtcGhhc2l6ZXMgcHJlZmVycmluZyB0aGUgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnRzLiBTbywgSSBuZWVkIHRvIHN0YXkgZm9jdXNlZCBvbiBgbWFkdmlzZV9jb2xsYXBzZWAuXG5cbkJhc2VkIG9uIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIHBhdGNoIGFuZCB0aGUgZ29hbCwgdGhlIG1vc3QgZWZmZWN0aXZlIGVudHJ5cG9pbnQgc2VlbXMgdG8gYmUgYG1hZHZpc2VfY29sbGFwc2VgLiBJJ20gZ29pbmcgdG8gc3RpY2sgd2l0aCB0aGF0LlxuXG5UaGUgYnJvYWRlciBjb250ZXh0IHN1Z2dlc3RzIHRoaXMgZW50cnlwb2ludCBpcyB3b3J0aCBmdXp6aW5nLCB0aGF0J3MgY2xlYXIuIFRoZSBwYXRjaCByZWZhY3RvcnMgc29tZSBQVEUgY2hlY2tpbmcgbG9naWMsIGFuZCBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAgYW5kIGBraHVnZXBhZ2VkYCBjYW4gaGVscCB2ZXJpZnkgdGhhdCB0aGlzIGNoYW5nZSBkb2Vzbid0IGludHJvZHVjZSByZWdyZXNzaW9ucywgc3BlY2lmaWNhbGx5IGFyb3VuZCBQVEUgc2Nhbm5pbmcgb3IgdW5pbml0aWFsaXplZCB2YXJpYWJsZSB1c2FnZS5cblxuTm93LCBsZXQncyBtYWtlIHN1cmUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgc2V0IGFwcHJvcHJpYXRlbHkuIEkgbmVlZCB0byBjaGVjayBgVVNFUkZBVUxURkRgIGJlY2F1c2UgdGhlIGNvZGUgYXBwZWFycyB0byB1c2UgYHB0ZV91ZmZkYC4gSSd2ZSBjb25maXJtZWQgdGhhdCBgVVNFUkZBVUxURkRgIGlzIGluZGVlZCBuZWVkZWQuIEFsc28sIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgZXNzZW50aWFsIGJlY2F1c2UgYm90aCBga2h1Z2VwYWdlZGAgYW5kIGBtYWR2aXNlX2NvbGxhcHNlYCBhcmUgcGFydCBvZiB0aGUgVEhQIGZ1bmN0aW9uYWxpdHkuXG5cblNvLCBoZXJlJ3MgdGhlIHBsYW46XG5cbiogICAqKldvcnRoRnV6emluZzoqKiBgdHJ1ZWBcbiogICAqKkZvY3VzU3ltYm9sczoqKiBgW1wibWFkdmlzZV9jb2xsYXBzZVwiXWBcbiogICAqKkVuYWJsZUNvbmZpZ3M6KiogYFtcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsIFwiVVNFUkZBVUxURkRcIl1gXG4qICAgKipSZWFzb25pbmc6KiogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIFBURSBjaGVja2luZyBsb2dpYyBmb3IgVEhQIGNvbGxhcHNlIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGBjb2xsYXBzZV9jaGVja19wdGUoKWAuIEl0IGFsc28gbW9kaWZpZXMgdGhlIGJlaGF2aW9yIHdoZW4gYSBub24tYW5vbnltb3VzIGZvbGlvIGlzIGVuY291bnRlcmVkIGluIGFuIGFub255bW91cyBWTUEsIGNoYW5naW5nIGEgYFZNX0JVR19PTl9GT0xJT2AgdG8gYSBgVk1fV0FSTl9PTl9GT0xJT2AgYW5kIHJldHVybmluZyBhbiBlcnJvci4gRnV6emluZyBgbWFkdmlzZShNQURWX0NPTExBUFNFKWAgYW5kIGBraHVnZXBhZ2VkYCBjYW4gaGVscCB2ZXJpZnkgdGhhdCB0aGlzIHJlZmFjdG9yaW5nIGRvZXNuJ3QgaW50cm9kdWNlIHN1YnRsZSByZWdyZXNzaW9ucyBpbiBQVEUgc2Nhbm5pbmcgb3IgdW5pbml0aWFsaXplZCB2YXJpYWJsZSB1c2FnZS5cIlxuXG5JJ20gY29uZmlkZW50IGluIHRoaXMgYXNzZXNzbWVudC4gSSdtIGdvaW5nIHRvIGNhbGwgYHNldC1yZXN1bHRzYCBub3cuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU1ODUzLCJPdXRwdXRUb2tlbnMiOjE2MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUxMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxOTo0Mzo1Ny44MDA1MjczODRaIiwiU2VxIjo0MiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3MDg1NzQ0NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgICBcIlVTRVJGQVVMVEZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibWFkdmlzZV9jb2xsYXBzZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBQVEUgY2hlY2tpbmcgbG9naWMgZm9yIFRIUCBjb2xsYXBzZSBpbnRvIGEgbmV3IGhlbHBlciBmdW5jdGlvbiBjb2xsYXBzZV9jaGVja19wdGUoKS4gSXQgYWxzbyBtb2RpZmllcyB0aGUgYmVoYXZpb3Igd2hlbiBhIG5vbi1hbm9ueW1vdXMgZm9saW8gaXMgZW5jb3VudGVyZWQgaW4gYW4gYW5vbnltb3VzIFZNQSwgY2hhbmdpbmcgYSBWTV9CVUdfT05fRk9MSU8gdG8gYSBWTV9XQVJOX09OX0ZPTElPIGFuZCByZXR1cm5pbmcgYW4gZXJyb3IuIEZ1enppbmcgbWFkdmlzZShNQURWX0NPTExBUFNFKSBhbmQga2h1Z2VwYWdlZCBjYW4gaGVscCB2ZXJpZnkgdGhhdCB0aGlzIHJlZmFjdG9yaW5nIGRvZXNuJ3QgaW50cm9kdWNlIHN1YnRsZSByZWdyZXNzaW9ucyBpbiBQVEUgc2Nhbm5pbmcgb3IgdW5pbml0aWFsaXplZCB2YXJpYWJsZSB1c2FnZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiVVNFUkZBVUxURkRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJtYWR2aXNlX2NvbGxhcHNlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIFBURSBjaGVja2luZyBsb2dpYyBmb3IgVEhQIGNvbGxhcHNlIGludG8gYSBuZXcgaGVscGVyIGZ1bmN0aW9uIGNvbGxhcHNlX2NoZWNrX3B0ZSgpLiBJdCBhbHNvIG1vZGlmaWVzIHRoZSBiZWhhdmlvciB3aGVuIGEgbm9uLWFub255bW91cyBmb2xpbyBpcyBlbmNvdW50ZXJlZCBpbiBhbiBhbm9ueW1vdXMgVk1BLCBjaGFuZ2luZyBhIFZNX0JVR19PTl9GT0xJTyB0byBhIFZNX1dBUk5fT05fRk9MSU8gYW5kIHJldHVybmluZyBhbiBlcnJvci4gRnV6emluZyBtYWR2aXNlKE1BRFZfQ09MTEFQU0UpIGFuZCBraHVnZXBhZ2VkIGNhbiBoZWxwIHZlcmlmeSB0aGF0IHRoaXMgcmVmYWN0b3JpbmcgZG9lc24ndCBpbnRyb2R1Y2Ugc3VidGxlIHJlZ3Jlc3Npb25zIGluIFBURSBzY2FubmluZyBvciB1bmluaXRpYWxpemVkIHZhcmlhYmxlIHVzYWdlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow9zqhf[1] Phase: Succeeded StartedAt: 2026-08-04 19:44:09 +0000 UTC FinishedAt: 2026-08-04 19:44:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-04 19:44:09 +0000 UTC FinishedAt: 2026-08-04 19:44:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[2] Phase: Succeeded StartedAt: 2026-08-04 19:44:09 +0000 UTC FinishedAt: 2026-08-04 23:33:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 19:44:09 +0000 UTC FinishedAt: 2026-08-04 23:33:41 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 19:44:09 +0000 UTC FinishedAt: 2026-08-04 19:44:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 19:44:09 +0000 UTC FinishedAt: 2026-08-04 19:44:15 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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-workflow9zqhf/series-workflow9zqhf-convert-artifact-55317139/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 19:44:19 +0000 UTC FinishedAt: 2026-08-04 20:00:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 19:44:19 +0000 UTC FinishedAt: 2026-08-04 20:00:24 +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:*23e00fb2-30b9-414a-8ea5-1ae44673f42f,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-workflow9zqhf/series-workflow9zqhf-convert-artifact-55317139/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": "9d528aa5-4b4e-4341-8e5e-376ba68ff1a9", "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-workflow9zqhf/series-workflow9zqhf-build-action-3500158913/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 19:44:19 +0000 UTC FinishedAt: 2026-08-04 20:00:14 +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:*23e00fb2-30b9-414a-8ea5-1ae44673f42f,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-workflow9zqhf/series-workflow9zqhf-convert-artifact-55317139/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": "9d528aa5-4b4e-4341-8e5e-376ba68ff1a9", "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-workflow9zqhf/series-workflow9zqhf-build-action-3500158913/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:00:24 +0000 UTC FinishedAt: 2026-08-04 20:00:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:00:24 +0000 UTC FinishedAt: 2026-08-04 20:00:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:00:24 +0000 UTC FinishedAt: 2026-08-04 20:00:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:00:24 +0000 UTC FinishedAt: 2026-08-04 20:00:29 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-workflow9zqhf/series-workflow9zqhf-convert-artifact-1510002314/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:00:34 +0000 UTC FinishedAt: 2026-08-04 20:02:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:00:34 +0000 UTC FinishedAt: 2026-08-04 20:02:17 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*9d528aa5-4b4e-4341-8e5e-376ba68ff1a9,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-workflow9zqhf/series-workflow9zqhf-build-action-3500158913/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-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:02:27 +0000 UTC FinishedAt: 2026-08-04 20:02:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:02:27 +0000 UTC FinishedAt: 2026-08-04 20:02:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:02:27 +0000 UTC FinishedAt: 2026-08-04 20:18:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:02:27 +0000 UTC FinishedAt: 2026-08-04 20:18:27 +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:*23e00fb2-30b9-414a-8ea5-1ae44673f42f,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-workflow9zqhf/series-workflow9zqhf-convert-artifact-1510002314/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": "6e54f334-fe9b-46a3-909a-46de74e25b27", "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-workflow9zqhf/series-workflow9zqhf-build-action-1698696366/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:02:27 +0000 UTC FinishedAt: 2026-08-04 20:18:24 +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:*23e00fb2-30b9-414a-8ea5-1ae44673f42f,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-workflow9zqhf/series-workflow9zqhf-convert-artifact-1510002314/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": "6e54f334-fe9b-46a3-909a-46de74e25b27", "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-workflow9zqhf/series-workflow9zqhf-build-action-1698696366/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:18:27 +0000 UTC FinishedAt: 2026-08-04 20:18:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:18:27 +0000 UTC FinishedAt: 2026-08-04 20:18:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:18:27 +0000 UTC FinishedAt: 2026-08-04 20:20:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:18:27 +0000 UTC FinishedAt: 2026-08-04 20:20:12 +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:*6e54f334-fe9b-46a3-909a-46de74e25b27,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-workflow9zqhf/series-workflow9zqhf-build-action-1698696366/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-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:20:22 +0000 UTC FinishedAt: 2026-08-04 23:33:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:20:22 +0000 UTC FinishedAt: 2026-08-04 23:33:41 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*9d528aa5-4b4e-4341-8e5e-376ba68ff1a9,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*6e54f334-fe9b-46a3-909a-46de74e25b27,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-workflow9zqhf/series-workflow9zqhf-build-action-3500158913/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-workflow9zqhf/series-workflow9zqhf-build-action-1698696366/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:20:22 +0000 UTC FinishedAt: 2026-08-04 20:20:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:20:22 +0000 UTC FinishedAt: 2026-08-04 20:20:25 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow9zqhf/series-workflow9zqhf-convert-artifact-371755295/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:20:22 +0000 UTC FinishedAt: 2026-08-04 20:20:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:20:22 +0000 UTC FinishedAt: 2026-08-04 20:20:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:20:22 +0000 UTC FinishedAt: 2026-08-04 20:20:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:20:32 +0000 UTC FinishedAt: 2026-08-04 23:33:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflow9zqhf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"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/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["madvise_collapse"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"486855239e38a91d3eae26618ccb7845c1764625","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","USERFAULTFD"],"series_id":"3c0821a2-e26d-49ef-bfe5-3d086429ffc1","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-04 20:20:32 +0000 UTC FinishedAt: 2026-08-04 23:33:31 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*9d528aa5-4b4e-4341-8e5e-376ba68ff1a9,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*6e54f334-fe9b-46a3-909a-46de74e25b27,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-workflow9zqhf/series-workflow9zqhf-build-action-3500158913/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-workflow9zqhf/series-workflow9zqhf-build-action-1698696366/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-workflow9zqhf/series-workflow9zqhf-convert-artifact-371755295/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,}