Name: series-workflowp89kd Phase: Succeeded StartedAt: 2026-08-27 23:50:26 +0000 UTC FinishedAt: 2026-08-28 03:50:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[0] Phase: Succeeded StartedAt: 2026-08-27 23:50:26 +0000 UTC FinishedAt: 2026-08-28 00:07:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[0].run-triage Phase: Succeeded StartedAt: 2026-08-27 23:50:26 +0000 UTC FinishedAt: 2026-08-28 00:07:58 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "torvalds", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux", "commit_hash": "45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "FUSE_FS", "VIRTIO_FS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "torvalds", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux", "commit_hash": "45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "FUSE_FS", "VIRTIO_FS" ], "series_id": "e207d03b-7c13-4124-a8de-2147db3ad6e0" }, "track": "KASAN", "fuzz": { "focus": [ "fs", "kvm" ], "focus_symbols": [ "fuse_do_setattr", "fuse_open", "fuse_dir_open", "fuse_do_getattr", "fuse_statfs", "fuse_readlink_folio", "virtio_fs_request_complete" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDAwOjA1PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0ZVU0VfRlMmIzM0OywKICAgICYjMzQ7VklSVElPX0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7ZnVzZV9kb19zZXRhdHRyJiMzNDssCiAgICAmIzM0O2Z1c2Vfb3BlbiYjMzQ7LAogICAgJiMzNDtmdXNlX2Rpcl9vcGVuJiMzNDssCiAgICAmIzM0O2Z1c2VfZG9fZ2V0YXR0ciYjMzQ7LAogICAgJiMzNDtmdXNlX3N0YXRmcyYjMzQ7LAogICAgJiMzNDtmdXNlX3JlYWRsaW5rX2ZvbGlvJiMzNDssCiAgICAmIzM0O3ZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIG1vZGlmaWVzIGVycm9yIGNvZGUgaGFuZGxpbmcgaW4gRlVTRSBhbmQgdmlydGlvLWZzIGJ5IHRyYW5zbGF0aW5nIC1FTk9FTlQgcmVzcG9uc2VzIHRvIC1FU1RBTEUgb3IgLUVPUEVOU1RBTEUgZm9yIG9wZXJhdGlvbnMgcmVmZXJlbmNpbmcgaW5vZGVzIGJ5IG5vZGVpZCAoZS5nLiwgRlVTRV9PUEVOLCBGVVNFX09QRU5ESVIsIEZVU0VfR0VUQVRUUiwgRlVTRV9TRVRBVFRSLCBGVVNFX1JFQURMSU5LLCBGVVNFX1NUQVRGUykgdG8gZW5hYmxlIFZGUyBwYXRoIGxvb2t1cCByZXRyaWVzIChyZXRyeV9lc3RhbGUpLlxuXG5UaGlzIGNoYW5nZSBwdXJlbHkgYWx0ZXJzIGludGVnZXIgcmV0dXJuIHZhbHVlcy9lcnJubyBjb2RlcyBpbiBlcnJvciBwYXRocy4gSXQgZG9lcyBub3QgaW50cm9kdWNlIG9yIG1vZGlmeSBhbnkgbWVtb3J5IGFsbG9jYXRpb25zLCBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLCBidWZmZXIgY29waWVzIHRvIHVzZXJzcGFjZSwgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2VzcyBvciBpbmZvcm1hdGlvbiBkaXNjbG9zdXJlIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBkZXRlY3Rpb24uIEFueSBjb250cm9sIGZsb3cgb3IgZnVuY3Rpb25hbCByZWdyZXNzaW9uIGlzc3VlcyBhcmUgY292ZXJlZCBieSBzdGFuZGFyZCB0ZXN0aW5nIGFuZCBLQVNBTiBidWlsZHMuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHVwZGF0ZXMgZXJyb3IgaGFuZGxpbmcgZm9yIGxpdmUgbm9kZSBJRHMgaW4gRlVTRSBhbmQgdmlydGlvLWZzIHdoZW4gdGhlIHVzZXIvaG9zdCBzZXJ2ZXIgcmV0dXJucyAtRU5PRU5ULCB0cmFuc2xhdGluZyBpdCB0byAtRVNUQUxFIG9yIC1FT1BFTlNUQUxFIHRvIHRyaWdnZXIgVkZTIHBhdGggbG9va3VwIHJldHJpZXMgKExPT0tVUF9SRVZBTCkuIFRoZXNlIGZ1bmN0aW9uYWwgY2hhbmdlcyBpbXBhY3QgY29yZSBmaWxlIG9wZXJhdGlvbnMgKG9wZW4sIGdldGF0dHIsIHNldGF0dHIsIHJlYWRsaW5rLCBzdGF0ZnMpIGluIEZVU0UgYW5kIHZpcnRpby1mcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAwMDowNTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGI0Y2NhMzRiNmZlZTk0ODYzYjFiZTIwMzkyMDkzOGUxZjRhZjliZTRcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIEF1ZyAyOCAwMDowNTozMCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9mdXNlL2Rpci5jIGIvZnMvZnVzZS9kaXIuY1xuaW5kZXggZTQ5YjRlODc0YjE1Zi4uMjE3YTAzOTk5MDUwNyAxMDA2NDRcbi0tLSBhL2ZzL2Z1c2UvZGlyLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2Z1c2UvZGlyLmNcbkBAIC0xNTMyLDYgJiM0MzsxNTMyLDggQEAgc3RhdGljIGludCBmdXNlX2RvX2dldGF0dHIoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gXHRcdFx0aWYgKHN0YXQpXG4gXHRcdFx0XHRmdXNlX2ZpbGxhdHRyKGlkbWFwLCBpbm9kZSwgXHUwMDI2b3V0YXJnLmF0dHIsIHN0YXQpO1xuIFx0XHR9XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdGVyciA9IGZ1c2Vfc3RhbGVfaW5vZGVfZXJyKGVycik7XG4gXHR9XG4gXHRyZXR1cm4gZXJyO1xuIH1cbkBAIC0xODQ4LDYgJiM0MzsxODUwLDcgQEAgc3RhdGljIGludCBmdXNlX3JlYWRsaW5rX2ZvbGlvKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXG4gXHRmdXNlX2ludmFsaWRhdGVfYXRpbWUoaW5vZGUpO1xuIFxuJiM0MztcdHJlcyA9IGZ1c2Vfc3RhbGVfaW5vZGVfZXJyKHJlcyk7XG4gXHRpZiAocmVzIFx1MDAzYyAwKVxuIFx0XHRyZXR1cm4gcmVzO1xuIFxuQEAgLTE5MTAsNiAmIzQzOzE5MTMsMTIgQEAgc3RhdGljIGludCBmdXNlX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxuIFx0XHRyZXR1cm4gZXJyO1xuIFxuIFx0ZXJyID0gZnVzZV9kb19vcGVuKGZtLCBnZXRfbm9kZV9pZChpbm9kZSksIGZpbGUsIHRydWUpO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQXMgaW4gZnVzZV9vcGVuX2NvbW1vbigpOiBhIHBhdGggd2FsayBzdGFuZHMgYmVoaW5kIHRoaXMgb3BlbixcbiYjNDM7XHQgKiBzbyB0aGUgcmVmdXNhbCBpcyBFT1BFTlNUQUxFIGZvciBwYXRoX29wZW5hdCgpIHRvIGFuc3dlci5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoZXJyID09IC1FTk9FTlQpXG4mIzQzO1x0XHRlcnIgPSAtRU9QRU5TVEFMRTtcbiBcdGlmICghZXJyKSB7XG4gXHRcdHN0cnVjdCBmdXNlX2ZpbGUgKmZmID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4gXG5AQCAtMjI0OSw2ICYjNDM7MjI1OCw3IEBAIGludCBmdXNlX2RvX3NldGF0dHIoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSxcbiBcdGlmIChlcnIpIHtcbiBcdFx0aWYgKGVyciA9PSAtRUlOVFIpXG4gXHRcdFx0ZnVzZV9pbnZhbGlkYXRlX2F0dHIoaW5vZGUpO1xuJiM0MztcdFx0ZXJyID0gZnVzZV9zdGFsZV9pbm9kZV9lcnIoZXJyKTtcbiBcdFx0Z290byBlcnJvcjtcbiBcdH1cbiBcbmRpZmYgLS1naXQgYS9mcy9mdXNlL2ZpbGUuYyBiL2ZzL2Z1c2UvZmlsZS5jXG5pbmRleCA4ZDYxMzVhNjEwOGE0Li4zMDhiMTVjMzBmMzRkIDEwMDY0NFxuLS0tIGEvZnMvZnVzZS9maWxlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2Z1c2UvZmlsZS5jXG5AQCAtMjc5LDYgJiM0MzsyNzksMTcgQEAgc3RhdGljIGludCBmdXNlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG4gXHRcdGZ1c2Vfc2V0X25vd3JpdGUoaW5vZGUpO1xuIFxuIFx0ZXJyID0gZnVzZV9kb19vcGVuKGZtLCBnZXRfbm9kZV9pZChpbm9kZSksIGZpbGUsIGZhbHNlKTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoaXMgb3BlbiByZWFjaGVkIHRoZSBzZXJ2ZXIgdGhyb3VnaCBhIHBhdGggd2Fsaywgc28gYSByZWZ1c2FsXG4mIzQzO1x0ICogZm9yIHRoZSBsaXZlIG5vZGVpZCBpcyByZXBvcnRlZCBhcyBFT1BFTlNUQUxFIHJhdGhlciB0aGFuIHRoZVxuJiM0MztcdCAqIEVTVEFMRSB0aGUgbm9kZWlkLW9ubHkgcmVxdWVzdHMgc2F5OiBwYXRoX29wZW5hdCgpIHBpY2tzIHRoZVxuJiM0MztcdCAqIGNoZWFwZXN0IHJldHJ5IGZvciB0aGUgd2FsayBpbiBwcm9ncmVzcywgRUNISUxEIHVuZGVyIExPT0tVUF9SQ1VcbiYjNDM7XHQgKiBhbmQgRVNUQUxFIG90aGVyd2lzZS4gZnVzZV9maWxlX29wZW4oKSBpcyBsZWZ0IGFsb25lIGJlY2F1c2VcbiYjNDM7XHQgKiBmdXNlX3ByaXZfaW9jdGxfcHJlcGFyZSgpIHJlYWNoZXMgaXQgdG8gc2VydmUgRlNfSU9DX0dFVEZMQUdTLFxuJiM0MztcdCAqIHdpdGggbm8gb3BlbiBiZWhpbmQgaXQgdG8gdHJhbnNsYXRlIHRoZSBpbnRlcm5hbCBlcnJuby5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoZXJyID09IC1FTk9FTlQpXG4mIzQzO1x0XHRlcnIgPSAtRU9QRU5TVEFMRTtcbiBcdGlmICghZXJyKSB7XG4gXHRcdGZmID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4gXHRcdGVyciA9IGZ1c2VfZmluaXNoX29wZW4oaW5vZGUsIGZpbGUpO1xuZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZnVzZV9pLmggYi9mcy9mdXNlL2Z1c2VfaS5oXG5pbmRleCBjOGQ0YzVmM2FmN2U4Li5lNmIyNTk3ZDZkZDZmIDEwMDY0NFxuLS0tIGEvZnMvZnVzZS9mdXNlX2kuaFxuJiM0MzsmIzQzOyYjNDM7IGIvZnMvZnVzZS9mdXNlX2kuaFxuQEAgLTEyNTAsNiAmIzQzOzEyNTAsMjUgQEAgdm9pZCBmdXNlX2lub2RlX3VuY2FjaGVkX2lvX2VuZChzdHJ1Y3QgZnVzZV9pbm9kZSAqZmkpO1xuIGludCBmdXNlX2ZpbGVfaW9fb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGlub2RlICppbm9kZSk7XG4gdm9pZCBmdXNlX2ZpbGVfaW9fcmVsZWFzZShzdHJ1Y3QgZnVzZV9maWxlICpmZiwgc3RydWN0IGlub2RlICppbm9kZSk7XG4gXG4mIzQzOy8qXG4mIzQzOyAqIFJlcG9ydCBhIHJlcXVlc3QgcmVmdXNlZCBmb3IgYSBsaXZlIG5vZGVpZCBhcyBzdGFsZS5cbiYjNDM7ICpcbiYjNDM7ICogQSByZXF1ZXN0IHRoYXQgbmFtZXMgYSBub2RlaWQgYW5kIG5vdGhpbmcgZWxzZSBpcyBvbmx5IHNlbnQgZm9yIGFuXG4mIzQzOyAqIGlub2RlIHRoZSBjbGllbnQgaGFzIGxvb2tlZCB1cCBhbmQgaG9sZHMgYSByZWZlcmVuY2UgdG8sIGFuZCB0aGVcbiYjNDM7ICogc2VydmVyIG93ZXMgdGhlIGNsaWVudCB0aGF0IGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuXG4mIzQzOyAqIEVOT0VOVCBmcm9tIHRoZSBzZXJ2ZXIgZGVzY3JpYmVzIHRoZSBpbm9kZSBpdHNlbGYgcmF0aGVyIHRoYW4gYSBuYW1lXG4mIzQzOyAqIHRoYXQgaGFzIGdvbmUgYXdheS4gUmVwb3J0IHRoZSBoYW5kbGUgYXMgc3RhbGUsIHdoaWNoIHRoZSBjYWxsZXJcbiYjNDM7ICogYW5zd2VycyBieSByZXNvbHZpbmcgdGhlIG5hbWUgYWdhaW4gdW5kZXIgTE9PS1VQX1JFVkFMIGFuZCBhY3Rpbmcgb25cbiYjNDM7ICogd2hhdGV2ZXIgaXQgcmVmZXJzIHRvIG5vdy4gQSBuYW1lIHRoYXQgcmVhbGx5IGhhcyBnb25lIGZhaWxzIHRoYXRcbiYjNDM7ICogc2Vjb25kIGxvb2t1cCBhbmQgdGhlIGNhbGxlciBzdGlsbCBzZWVzIEVOT0VOVC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IGZ1c2Vfc3RhbGVfaW5vZGVfZXJyKGludCBlcnIpXG4mIzQzO3tcbiYjNDM7XHRpZiAoZXJyID09IC1FTk9FTlQpXG4mIzQzO1x0XHRyZXR1cm4gLUVTVEFMRTtcbiYjNDM7XHRyZXR1cm4gZXJyO1xuJiM0Mzt9XG4mIzQzO1xuIC8qIGZpbGUuYyAqL1xuIHN0cnVjdCBmdXNlX2ZpbGUgKmZ1c2VfZmlsZV9vcGVuKHN0cnVjdCBmdXNlX21vdW50ICpmbSwgdTY0IG5vZGVpZCxcbiBcdFx0XHRcdCB1bnNpZ25lZCBpbnQgb3Blbl9mbGFncywgYm9vbCBpc2Rpcik7XG5kaWZmIC0tZ2l0IGEvZnMvZnVzZS9pbm9kZS5jIGIvZnMvZnVzZS9pbm9kZS5jXG5pbmRleCBlOTU1MmJlMzYzN2JjLi5jZGUwYTUzMzUwODk3IDEwMDY0NFxuLS0tIGEvZnMvZnVzZS9pbm9kZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9mdXNlL2lub2RlLmNcbkBAIC02NjYsNyAmIzQzOzY2Niw3IEBAIHN0YXRpYyBpbnQgZnVzZV9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKVxuIFx0ZXJyID0gZnVzZV9zaW1wbGVfcmVxdWVzdChmbSwgXHUwMDI2YXJncyk7XG4gXHRpZiAoIWVycilcbiBcdFx0Y29udmVydF9mdXNlX3N0YXRmcyhidWYsIFx1MDAyNm91dGFyZy5zdCk7XG4tXHRyZXR1cm4gZXJyO1xuJiM0MztcdHJldHVybiBmdXNlX3N0YWxlX2lub2RlX2VycihlcnIpO1xuIH1cbiBcbiBzdGF0aWMgc3RydWN0IGZ1c2Vfc3luY19idWNrZXQgKmZ1c2Vfc3luY19idWNrZXRfYWxsb2Modm9pZClcbmRpZmYgLS1naXQgYS9mcy9mdXNlL3ZpcnRpb19mcy5jIGIvZnMvZnVzZS92aXJ0aW9fZnMuY1xuaW5kZXggZjE1ZTUxNmViY2I1Yy4uN2IwM2JmODdjMmFlOCAxMDA2NDRcbi0tLSBhL2ZzL2Z1c2UvdmlydGlvX2ZzLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2Z1c2UvdmlydGlvX2ZzLmNcbkBAIC03ODAsNiAmIzQzOzc4MCw2NiBAQCBzdGF0aWMgYm9vbCB2aXJ0aW9fZnNfdmVyaWZ5X3Jlc3BvbnNlKHN0cnVjdCBmdXNlX3JlcSAqcmVxLCB1bnNpZ25lZCBpbnQgbGVuKVxuIFx0cmV0dXJuIHRydWU7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBSZXBvcnQgYSByZXF1ZXN0IHJlZnVzZWQgZm9yIGEgbGl2ZSBub2RlaWQgYXMgc3RhbGUuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZXNlIHJlcXVlc3RzIGNhcnJ5IGEgbm9kZWlkIGFuZCBubyBuYW1lLCBzbyB0aGUgY2xpZW50IG9ubHkgc2VuZHMgdGhlbSBmb3JcbiYjNDM7ICogYW4gaW5vZGUgaXQgaGFzIGFscmVhZHkgbG9va2VkIHVwIGFuZCBob2xkcyBhIHJlZmVyZW5jZSB0bywgYW5kIGEgc2VydmVyIG93ZXNcbiYjNDM7ICogdGhlIGNsaWVudCB0aGF0IGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuIEEgc2VydmVyIGFuc3dlcmluZyB3aXRoXG4mIzQzOyAqIEVOT0VOVCBpcyBkZXNjcmliaW5nIGEgaGFuZGxlIGl0IHdhcyBvYmxpZ2VkIHRvIGhvbm91ciByYXRoZXIgdGhhbiBhIG5hbWVcbiYjNDM7ICogdGhhdCBoYXMgZ29uZSBhd2F5LCBhbmQgdGhlIGNhbGxlciBoYXMgbm8gcmVhc29uIHRvIGRvdWJ0IGl0LlxuJiM0MzsgKlxuJiM0MzsgKiBTYXlpbmcgdGhlIGhhbmRsZSBpcyBzdGFsZSBpcyBzb21ldGhpbmcgdGhlIGNhbGxlciBrbm93cyBob3cgdG8gYW5zd2VyOiBpdFxuJiM0MzsgKiByZXBlYXRzIHRoZSBsb29rdXAgdW5kZXIgTE9PS1VQX1JFVkFMIGFuZCBhY3RzIG9uIHdoYXRldmVyIHRoZSBuYW1lIHJlZmVycyB0b1xuJiM0MzsgKiBub3cuIEEgbmFtZSB0aGF0IGdlbnVpbmVseSBoYXMgZ29uZSBmYWlscyB0aGUgcmV0cmllZCBsb29rdXAsIHNvIGEgY2FsbGVyXG4mIzQzOyAqIHN0aWxsIGxlYXJucyBpdCBpcyBnb25lLiByZXRyeV9lc3RhbGUoKSBpcyB3aGF0IGRvZXMgdGhpcywgYW5kIGZzL25hbWVpLmMsXG4mIzQzOyAqIGZzL29wZW4uYywgZnMvc3RhdC5jLCBmcy9zdGF0ZnMuYywgZnMvdXRpbWVzLmMgYW5kIGZzL3hhdHRyLmMgYWxsIHJlYWNoIGl0LFxuJiM0MzsgKiB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZSBjb252ZXJzaW9uIHVzZWZ1bCByYXRoZXIgdGhhbiBhIHJlbmFtZSBvZiB0aGUgZXJyb3IuXG4mIzQzOyAqXG4mIzQzOyAqIEEgcmVxdWVzdCB0aGF0IG5hbWVzIHNvbWV0aGluZyB3aGljaCBjYW4gaXRzZWxmIGJlIGFic2VudCBpcyBsZWZ0IGFsb25lLFxuJiM0MzsgKiBiZWNhdXNlIEVOT0VOVCBpcyB0aGVuIGFtYmlndW91cyBhbmQgaXMgZnJlcXVlbnRseSB0aGUgYW5zd2VyIHRoZSBjYWxsZXJcbiYjNDM7ICogYXNrZWQgZm9yLiBGVVNFX0xPT0tVUCByZXBvcnRzIGEgbWlzc2luZyBuYW1lIGluIGEgbGl2aW5nIGRpcmVjdG9yeSBhbmQgdGhlXG4mIzQzOyAqIGRpcmVjdG9yeSBvcGVyYXRpb25zIGNhcnJ5IGEgcGFyZW50IG5vZGVpZCBiZXNpZGUgb25lLCBzbyBuZWl0aGVyIGNhbiBiZVxuJiM0MzsgKiByZWFkIGFzIGEgc3RhdGVtZW50IGFib3V0IHRoZSBpbm9kZS4gVGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSByZXF1ZXN0cyBiZWxvbmdcbiYjNDM7ICogd2l0aCB0aGVtOiB0aGV5IGNhcnJ5IGFuIGF0dHJpYnV0ZSBuYW1lLCBhbmQgd2hpbGUgYSBzZXJ2ZXIgc2hvdWxkIHJlcG9ydCBhXG4mIzQzOyAqIG1pc3NpbmcgYXR0cmlidXRlIGFzIEVOT0RBVEEsIG9uZSB0aGF0IGFuc3dlcnMgRU5PRU5UIGluc3RlYWQgd291bGQgaGF2ZSBhXG4mIzQzOyAqIGNvcnJlY3QgcmVwbHkgdHVybmVkIGludG8gYSByZXRyeSB0aGF0IGNhbm5vdCBzdWNjZWVkLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXF1ZXN0cyBhZ2FpbnN0IGFuIGFscmVhZHkgb3BlbiBkZXNjcmlwdG9yIGFyZSBhbHNvIGxlZnQgYWxvbmUsIHNpbmNlIHRoZXJlXG4mIzQzOyAqIGlzIG5vIGVxdWl2YWxlbnQgcmV0cnkgdG8gcmVhY2ggYW5kIGNvbnZlcnRpbmcgdGhlIGVycm9yIHdvdWxkIHJlbmFtZSBhXG4mIzQzOyAqIGZhaWx1cmUgcmF0aGVyIHRoYW4gcmVwYWlyIGl0LCBhbmQgRlVTRV9JT0NUTCBhbmQgRlVTRV9QT0xMIGhhbmQgdGhlXG4mIzQzOyAqIHNlcnZlciYjMzk7cyBlcnJubyB0byB1c2Vyc3BhY2UgdmVyYmF0aW0uXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfZml4dXBfc3RhbGVfZXJyb3Ioc3RydWN0IGZ1c2VfcmVxICpyZXEpXG4mIzQzO3tcbiYjNDM7XHRpZiAocmVxLVx1MDAzZW91dC5oLmVycm9yICE9IC1FTk9FTlQpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdHN3aXRjaCAocmVxLVx1MDAzZWluLmgub3Bjb2RlKSB7XG4mIzQzO1x0Y2FzZSBGVVNFX09QRU46XG4mIzQzO1x0Y2FzZSBGVVNFX09QRU5ESVI6XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogQW4gb3BlbiBzYXlzIEVPUEVOU1RBTEUsIGFuZCBwYXRoX29wZW5hdCgpIGRlY2lkZXMgd2hhdCB0aGVcbiYjNDM7XHRcdCAqIHdhbGsgaW4gcHJvZ3Jlc3Mgc2hvdWxkIG1ha2Ugb2YgaXQ6IEVDSElMRCB1bmRlciBMT09LVVBfUkNVXG4mIzQzO1x0XHQgKiBzbyBpdCBkcm9wcyB0byBSRUYtd2FsaywgRVNUQUxFIG90aGVyd2lzZSBzbyB0aGUgbmFtZSBpc1xuJiM0MztcdFx0ICogcmVzb2x2ZWQgYWdhaW4gdW5kZXIgTE9PS1VQX1JFVkFMLiBOYW1pbmcgRVNUQUxFIGhlcmUgd291bGRcbiYjNDM7XHRcdCAqIHRha2UgdGhlIHNlY29uZCBpbiBib3RoIGNhc2VzIGFuZCBza2lwIGEgY2hlYXBlciByZXRyeS5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0cmVxLVx1MDAzZW91dC5oLmVycm9yID0gLUVPUEVOU1RBTEU7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRjYXNlIEZVU0VfR0VUQVRUUjpcbiYjNDM7XHRjYXNlIEZVU0VfU0VUQVRUUjpcbiYjNDM7XHRjYXNlIEZVU0VfUkVBRExJTks6XG4mIzQzO1x0Y2FzZSBGVVNFX1NUQVRGUzpcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBOb3RoaW5nIHRyYW5zbGF0ZXMgRU9QRU5TVEFMRSBvdXRzaWRlIHRoZSBvcGVuIHBhdGgsIHNvXG4mIzQzO1x0XHQgKiB0aGVzZSBzYXkgRVNUQUxFIGRpcmVjdGx5LCB3aGljaCByZXRyeV9lc3RhbGUoKSBhbnN3ZXJzLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRyZXEtXHUwMDNlb3V0LmguZXJyb3IgPSAtRVNUQUxFO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuIC8qIFdvcmsgZnVuY3Rpb24gZm9yIHJlcXVlc3QgY29tcGxldGlvbiAqL1xuIHN0YXRpYyB2b2lkIHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlKHN0cnVjdCBmdXNlX3JlcSAqcmVxLFxuIFx0XHRcdFx0ICAgICAgIHN0cnVjdCB2aXJ0aW9fZnNfdnEgKmZzdnEpXG5AQCAtODEwLDYgJiM0Mzs4NzAsOCBAQCBzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZShzdHJ1Y3QgZnVzZV9yZXEgKnJlcSxcbiBcbiBcdGNsZWFyX2JpdChGUl9TRU5ULCBcdTAwMjZyZXEtXHUwMDNlZmxhZ3MpO1xuIFxuJiM0MztcdHZpcnRpb19mc19maXh1cF9zdGFsZV9lcnJvcihyZXEpO1xuJiM0MztcbiBcdGZ1c2VfcmVxdWVzdF9lbmQocmVxKTtcbiBcdHNwaW5fbG9jayhcdTAwMjZmc3ZxLVx1MDAzZWxvY2spO1xuIFx0ZGVjX2luX2ZsaWdodF9yZXEoZnN2cSk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uZ2l0aWdub3JlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uZ2l0aWdub3JlXG5pbmRleCBmYjUxNjAzZmU0MTk4Li45Y2IzMDQ4MTI4ZDViIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uZ2l0aWdub3JlXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlLy5naXRpZ25vcmVcbkBAIC0xLDQgJiM0MzsxLDYgQEBcbiAjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiYjNDM7ZnVzZV9hY2xfY2FjaGVfdGVzdFxuIGZ1c2VfbW50XG4mIzQzO2Z1c2VfZXN0YWxlX3Rlc3RcbiBmdXNlY3RsX3Rlc3RcbiB3cml0ZV9leHRlbmRfZW9mX3Rlc3RcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9NYWtlZmlsZVxuaW5kZXggOTVhMWVlOTQ3Y2E3Ni4uZjU2NGNiMzdiM2E1YiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvTWFrZWZpbGVcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvTWFrZWZpbGVcbkBAIC02LDExICYjNDM7NiwxMiBAQCBURVNUX0dFTl9QUk9HUyA6PSBmdXNlY3RsX3Rlc3RcbiBURVNUX0dFTl9QUk9HUyAmIzQzOz0gd3JpdGVfZXh0ZW5kX2VvZl90ZXN0XG4gVEVTVF9HRU5fRklMRVMgOj0gZnVzZV9tbnRcbiBcbi0jIGZ1c2VfYWNsX2NhY2hlX3Rlc3QgcmVxdWlyZXMgbGliZnVzZTM7IGFkZCBpdCBvbmx5IHdoZW4gdGhlIGxpYnJhcnkgaXMgcHJlc2VudC5cbi1BQ0xfQ0ZMQUdTIDo9ICQoc2hlbGwgcGtnLWNvbmZpZyBmdXNlMyAtLWNmbGFncyAyXHUwMDNlL2Rldi9udWxsKVxuLUFDTF9MRExJQlMgOj0gJChzaGVsbCBwa2ctY29uZmlnIGZ1c2UzIC0tbGlicyAyXHUwMDNlL2Rldi9udWxsKVxuLWlmbmVxICgkKEFDTF9DRkxBR1MpLClcbiYjNDM7IyBUaGVzZSB0ZXN0cyByZXF1aXJlIGxpYmZ1c2UzOyBhZGQgdGhlbSBvbmx5IHdoZW4gdGhlIGxpYnJhcnkgaXMgcHJlc2VudC5cbiYjNDM7RlVTRTNfQ0ZMQUdTIDo9ICQoc2hlbGwgcGtnLWNvbmZpZyBmdXNlMyAtLWNmbGFncyAyXHUwMDNlL2Rldi9udWxsKVxuJiM0MztGVVNFM19MRExJQlMgOj0gJChzaGVsbCBwa2ctY29uZmlnIGZ1c2UzIC0tbGlicyAyXHUwMDNlL2Rldi9udWxsKVxuJiM0MztpZm5lcSAoJChGVVNFM19DRkxBR1MpLClcbiBURVNUX0dFTl9QUk9HUyAmIzQzOz0gZnVzZV9hY2xfY2FjaGVfdGVzdFxuJiM0MztURVNUX0dFTl9QUk9HUyAmIzQzOz0gZnVzZV9lc3RhbGVfdGVzdFxuIGVuZGlmXG4gXG4gaW5jbHVkZSAuLi8uLi9saWIubWtcbkBAIC0zMCw1ICYjNDM7MzEsOCBAQCBlbmRpZlxuICQoT1VUUFVUKS9mdXNlX21udDogQ0ZMQUdTICYjNDM7PSAkKFZBUl9DRkxBR1MpXG4gJChPVVRQVVQpL2Z1c2VfbW50OiBMRExJQlMgJiM0Mzs9ICQoVkFSX0xETElCUylcbiBcbi0kKE9VVFBVVCkvZnVzZV9hY2xfY2FjaGVfdGVzdDogQ0ZMQUdTICYjNDM7PSAkKEFDTF9DRkxBR1MpXG4tJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IExETElCUyAmIzQzOz0gJChBQ0xfTERMSUJTKVxuJiM0MzskKE9VVFBVVCkvZnVzZV9hY2xfY2FjaGVfdGVzdDogQ0ZMQUdTICYjNDM7PSAkKEZVU0UzX0NGTEFHUylcbiYjNDM7JChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IExETElCUyAmIzQzOz0gJChGVVNFM19MRExJQlMpXG4mIzQzO1xuJiM0MzskKE9VVFBVVCkvZnVzZV9lc3RhbGVfdGVzdDogQ0ZMQUdTICYjNDM7PSAkKEZVU0UzX0NGTEFHUylcbiYjNDM7JChPVVRQVVQpL2Z1c2VfZXN0YWxlX3Rlc3Q6IExETElCUyAmIzQzOz0gJChGVVNFM19MRExJQlMpXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9mdXNlX2VzdGFsZV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL2Z1c2VfZXN0YWxlX3Rlc3QuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjgyYjg0MmQzYTVmN2Jcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvZnVzZV9lc3RhbGVfdGVzdC5jXG5AQCAtMCwwICYjNDM7MSw0NTAgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LypcbiYjNDM7ICogVGVzdDogYSByZXF1ZXN0IHJlZnVzZWQgZm9yIGFuIGlub2RlIHRoZSBjbGllbnQgc3RpbGwgaG9sZHMgYSByZWZlcmVuY2UgdG9cbiYjNDM7ICpcbiYjNDM7ICogRlVTRV9PUEVOLCBGVVNFX0dFVEFUVFIsIEZVU0VfU0VUQVRUUiwgRlVTRV9SRUFETElOSyBhbmQgRlVTRV9TVEFURlMgY2FycnkgYVxuJiM0MzsgKiBub2RlaWQgcmF0aGVyIHRoYW4gYSBwYXRoLiAgVGhlIGNsaWVudCBvbmx5IHNlbmRzIHRoZW0gZm9yIGFuIGlub2RlIGl0IGhhc1xuJiM0MzsgKiBhbHJlYWR5IGxvb2tlZCB1cCBhbmQgaG9sZHMgYSByZWZlcmVuY2UgdG8sIGFuZCBhIHNlcnZlciBvd2VzIHRoZSBjbGllbnQgdGhhdFxuJiM0MzsgKiBpbm9kZSB1bnRpbCBpdCBpcyBzZW50IEZVU0VfRk9SR0VULiAgQSBzZXJ2ZXIgdGhhdCBsZXRzIHRoZSBpbm9kZSBnbyBlYXJseSxcbiYjNDM7ICogYXMgb25lIGJhY2tpbmcgYSBzaGFyZWQgZGlyZWN0b3J5IGRvZXMgd2hlbiB0aGUgbmFtZSBpcyByZW5hbWVkIG92ZXIsIGFuc3dlcnNcbiYjNDM7ICogd2l0aCBFTk9FTlQuXG4mIzQzOyAqXG4mIzQzOyAqIE9uIGFuIHVuZml4ZWQga2VybmVsIHRoYXQgRU5PRU5UIGlzIHBhc3NlZCBvdXQgdW5jaGFuZ2VkLiAgVGhlIHBhdGggd2FsayBoYXNcbiYjNDM7ICogbm8gcmVhc29uIHRvIGRvdWJ0IGl0IGFuZCB0aGUgY2FsbGVyIGlzIHRvbGQgYSBmaWxlIGlzIG1pc3Npbmcgd2hlbiBpdCBuZXZlclxuJiM0MzsgKiBzdG9wcGVkIGV4aXN0aW5nLiAgQ2FsbGVycyB0aGF0IHJlYWQgYSBtaXNzaW5nIGZpbGUgYXMgYW4gZW1wdHkgb25lIGFjdCBvblxuJiM0MzsgKiB0aGUgZW1wdGluZXNzLlxuJiM0MzsgKlxuJiM0MzsgKiBGaXhlZCAoZnMvZnVzZS9maWxlLmMgYW5kIGZzL2Z1c2UvZGlyLmMpOiBFTk9FTlQgYmVjb21lcyBFU1RBTEUsIHdoaWNoXG4mIzQzOyAqIGRlc2NyaWJlcyB0aGUgaGFuZGxlIHJhdGhlciB0aGFuIHRoZSBuYW1lLiAgZmlsZW5hbWVfbG9va3VwKCkgYW5kXG4mIzQzOyAqIGRvX2ZpbHBfb3BlbigpIGFscmVhZHkgcmV0cnkgd2l0aCBMT09LVVBfUkVWQUwgb24gRVNUQUxFLCBzbyB0aGUgbmFtZSBpc1xuJiM0MzsgKiByZXNvbHZlZCBhZ2FpbiBhbmQgdGhlIGlub2RlIGl0IHJlZmVycyB0byBub3cgaXMgdXNlZC4gIEEgbmFtZSB0aGF0IGhhc1xuJiM0MzsgKiBnZW51aW5lbHkgZ29uZSBhd2F5IGZhaWxzIHRoZSByZXRyaWVkIGxvb2t1cCwgc28gRU5PRU5UIHN0aWxsIHJlYWNoZXMgYVxuJiM0MzsgKiBjYWxsZXIgdGhhdCBkZXNlcnZlcyBpdC5cbiYjNDM7ICpcbiYjNDM7ICogT25seSByZXF1ZXN0cyByZWFjaGFibGUgdGhyb3VnaCBhIHBhdGggd2FsayBhcmUgY292ZXJlZCwgYmVjYXVzZSB0aGUgcmV0cnlcbiYjNDM7ICogaXMgd2hhdCBtYWtlcyBFU1RBTEUgdXNlZnVsIGFuZCB0aGUgd2FsayBpcyB3aGF0IHBlcmZvcm1zIGl0LiAgQW4gb3BlcmF0aW9uXG4mIzQzOyAqIG9uIGEgZGVzY3JpcHRvciBhbHJlYWR5IG9wZW4gaGFzIG5vIGVxdWl2YWxlbnQgcmVjb3ZlcnkuXG4mIzQzOyAqXG4mIzQzOyAqIFRlc3Qgb3V0bGluZTpcbiYjNDM7ICogIDEuIE1vdW50IGEgbWluaW1hbCBGVVNFIGZzIGhvbGRpbmcgb25lIGZpbGUuXG4mIzQzOyAqICAyLiBUaGUgc2VydmVyIHJlZnVzZXMgdGhlIGZpcnN0IHJlcXVlc3Qgb2YgdGhlIGtpbmQgdW5kZXIgdGVzdCBhbmQgYWxsb3dzXG4mIzQzOyAqICAgICBldmVyeSBvbmUgYWZ0ZXIgaXQsIHN0YW5kaW5nIGluIGZvciBhIHNlcnZlciB0aGF0IHJlbGVhc2VkIHRoZSBpbm9kZSBhbmRcbiYjNDM7ICogICAgIGhhcyBzaW5jZSByZXNvbHZlZCB0aGUgbmFtZSBhZ2Fpbi5cbiYjNDM7ICogIDMuIG9wZW5hdCgpIHRoZSBmaWxlLlxuJiM0MzsgKiAgICAgQnVnZ3k6ICBFTk9FTlQgcmVhY2hlcyB0aGUgY2FsbGVyLCBvbmUgb3BlbiB3YXMgYXNrZWQgZm9yLiAgRkFJTC5cbiYjNDM7ICogICAgIEZpeGVkOiAgdGhlIHdhbGsgcmV0cmllcywgdGhlIHNlY29uZCBvcGVuIGlzIGFsbG93ZWQsIHRoZSBkZXNjcmlwdG9yIGlzXG4mIzQzOyAqICAgICAgICAgICAgIHJldHVybmVkLCB0d28gb3BlbnMgd2VyZSBhc2tlZCBmb3IuICBQQVNTLlxuJiM0MzsgKiAgNC4gc3RhdCgpLCBjaG1vZCgpLCByZWFkbGluaygpIGFuZCBzdGF0ZnMoKSBieSBuYW1lLCB3aGljaCBhcmUgdGhlIHNhbWVcbiYjNDM7ICogICAgIHJlY292ZXJ5IHRocm91Z2ggRlVTRV9HRVRBVFRSLCBGVVNFX1NFVEFUVFIsIEZVU0VfUkVBRExJTksgYW5kXG4mIzQzOyAqICAgICBGVVNFX1NUQVRGUy4gIEVhY2ggaXMgcmVhY2hlZCB0aHJvdWdoIGEgcGF0aCB3YWxrLCB3aGljaCBpcyB3aGF0IG1ha2VzXG4mIzQzOyAqICAgICB0aGUgcmV0cnkgYXZhaWxhYmxlLlxuJiM0MzsgKiAgNS4gT3BlbiBhIG5hbWUgdGhlIHNlcnZlciBkb2VzIG5vdCBoYXZlIGF0IGFsbC5cbiYjNDM7ICogICAgIEJvdGg6ICAgRU5PRU5ULCBiZWNhdXNlIHRoZSBsb29rdXAgZmFpbHMgcmF0aGVyIHRoYW4gdGhlIG9wZW4sIGFuZCBhXG4mIzQzOyAqICAgICAgICAgICAgIGZpbGUgdGhhdCBpcyBhYnNlbnQgbXVzdCBzdGlsbCBsb29rIGFic2VudC5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFXG4mIzQzOyNkZWZpbmUgRlVTRV9VU0VfVkVSU0lPTiAzNFxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZXJybm8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2Z1c2VfbG93bGV2ZWwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9saW1pdHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NwdGhyZWFkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRib29sLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3N0YXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdHZmcy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy92ZnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Li4vLi4va3NlbGZ0ZXN0X2hhcm5lc3MuaFwmIzM0O1xuJiM0MztcbiYjNDM7I2RlZmluZSBGSUxFX05BTUVcdFwmIzM0O2hlbGRcJiMzNDtcbiYjNDM7I2RlZmluZSBMSU5LX05BTUVcdFwmIzM0O2hlbGQtbGlua1wmIzM0O1xuJiM0MzsjZGVmaW5lIEFCU0VOVF9OQU1FXHRcJiMzNDtuby1zdWNoLWZpbGVcJiMzNDtcbiYjNDM7I2RlZmluZSBGSUxFX0lOT1x0MlxuJiM0MzsjZGVmaW5lIExJTktfSU5PXHQzXG4mIzQzOyNkZWZpbmUgQ09OVEVOVFNcdFwmIzM0O3ByZXNlbnRcXG5cJiMzNDtcbiYjNDM7I2RlZmluZSBMSU5LX1RBUkdFVFx0RklMRV9OQU1FXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBXaGljaCByZXF1ZXN0IHRoZSBzZXJ2ZXIgcmVmdXNlcywgYW5kIGhvdyBtYW55IHRpbWVzLiAgU2hhcmVkIHdpdGggdGhlXG4mIzQzOyAqIGRhZW1vbiB0aHJlYWQ7IG9uZSB0ZXN0IHJ1bnMgYXQgYSB0aW1lLCBzbyBwbGFpbiBpbnRzLlxuJiM0MzsgKlxuJiM0MzsgKiBFdmVyeSBvbmUgb2YgdGhlc2UgbmFtZXMgYW4gaW5vZGUgYnkgbm9kZWlkIHJhdGhlciB0aGFuIGJ5IG5hbWUsIHNvIGFcbiYjNDM7ICogcmVmdXNhbCBvZiBhbnkgb2YgdGhlbSBpcyBkZXNjcmliaW5nIGEgaGFuZGxlIHJhdGhlciB0aGFuIGEgbWlzc2luZyBmaWxlLlxuJiM0MzsgKiBGVVNFX0xPT0tVUCBpcyBkZWxpYmVyYXRlbHkgYWJzZW50OiBpdCBjYXJyaWVzIGEgbmFtZSwgc28gaXRzIEVOT0VOVCBpcyBhblxuJiM0MzsgKiBhbnN3ZXIgcmF0aGVyIHRoYW4gYSBmYXVsdCwgYW5kIGFic2VudF9uYW1lX3N0aWxsX3JlcG9ydHNfYWJzZW50IGNvdmVycyBpdC5cbiYjNDM7ICovXG4mIzQzO2VudW0gcmVmdXNlX3doYXQge1xuJiM0MztcdFJFRlVTRV9OT1RISU5HLFxuJiM0MztcdFJFRlVTRV9PUEVOLFxuJiM0MztcdFJFRlVTRV9HRVRBVFRSLFxuJiM0MztcdFJFRlVTRV9TRVRBVFRSLFxuJiM0MztcdFJFRlVTRV9SRUFETElOSyxcbiYjNDM7XHRSRUZVU0VfU1RBVEZTLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCB7XG4mIzQzO1x0ZW51bSByZWZ1c2Vfd2hhdCB3aGF0O1xuJiM0MztcdGludCByZWZ1c2Fsc19sZWZ0O1xuJiM0MztcdGludCBvcGVuc19zZWVuO1xuJiM0MztcdGludCBnZXRhdHRyc19zZWVuO1xuJiM0MztcdGludCBzZXRhdHRyc19zZWVuO1xuJiM0MztcdGludCByZWFkbGlua3Nfc2VlbjtcbiYjNDM7XHRpbnQgc3RhdGZzc19zZWVuO1xuJiM0Mzt9IGdfZHM7XG4mIzQzO1xuJiM0MzsvKiBUcnVlIG9uY2UsIGZvciB0aGUgcmVxdWVzdCB1bmRlciB0ZXN0LCBhbmQgdGhlbiBuZXZlciBhZ2Fpbi4gKi9cbiYjNDM7c3RhdGljIGJvb2wgcmVmdXNlX25vdyhlbnVtIHJlZnVzZV93aGF0IHdoYXQpXG4mIzQzO3tcbiYjNDM7XHRpZiAoZ19kcy53aGF0ICE9IHdoYXQgfHwgZ19kcy5yZWZ1c2Fsc19sZWZ0IFx1MDAzYz0gMClcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRnX2RzLnJlZnVzYWxzX2xlZnQtLTtcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgZmlsbF9hdHRyKGZ1c2VfaW5vX3QgaW5vLCBzdHJ1Y3Qgc3RhdCAqc3QpXG4mIzQzO3tcbiYjNDM7XHRtZW1zZXQoc3QsIDAsIHNpemVvZigqc3QpKTtcbiYjNDM7XHRzdC1cdTAwM2VzdF9pbm8gPSBpbm87XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBPd25lZCBieSB3aG9ldmVyIHJ1bnMgdGhlIHRlc3QsIHNvIHRoYXQgY2htb2QoKSBpcyBhIHJlcXVlc3QgdGhlXG4mIzQzO1x0ICoga2VybmVsIHdpbGwgY2FycnkgdGhyb3VnaCB0byB0aGUgc2VydmVyIHJhdGhlciB0aGFuIHJlZnVzZSBpdHNlbGYuXG4mIzQzO1x0ICovXG4mIzQzO1x0c3QtXHUwMDNlc3RfdWlkID0gZ2V0dWlkKCk7XG4mIzQzO1x0c3QtXHUwMDNlc3RfZ2lkID0gZ2V0Z2lkKCk7XG4mIzQzO1x0aWYgKGlubyA9PSBGVVNFX1JPT1RfSUQpIHtcbiYjNDM7XHRcdHN0LVx1MDAzZXN0X21vZGUgPSBTX0lGRElSIHwgMDc1NTtcbiYjNDM7XHRcdHN0LVx1MDAzZXN0X25saW5rID0gMjtcbiYjNDM7XHR9IGVsc2UgaWYgKGlubyA9PSBMSU5LX0lOTykge1xuJiM0MztcdFx0c3QtXHUwMDNlc3RfbW9kZSA9IFNfSUZMTksgfCAwNzc3O1xuJiM0MztcdFx0c3QtXHUwMDNlc3RfbmxpbmsgPSAxO1xuJiM0MztcdFx0c3QtXHUwMDNlc3Rfc2l6ZSA9IHNpemVvZihMSU5LX1RBUkdFVCkgLSAxO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRzdC1cdTAwM2VzdF9tb2RlID0gU19JRlJFRyB8IDA2NDQ7XG4mIzQzO1x0XHRzdC1cdTAwM2VzdF9ubGluayA9IDE7XG4mIzQzO1x0XHRzdC1cdTAwM2VzdF9zaXplID0gc2l6ZW9mKENPTlRFTlRTKSAtIDE7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0X2xvb2t1cChmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZnVzZV9lbnRyeV9wYXJhbSBlO1xuJiM0MztcdGZ1c2VfaW5vX3QgaW5vO1xuJiM0MztcbiYjNDM7XHRpZiAocGFyZW50ICE9IEZVU0VfUk9PVF9JRClcbiYjNDM7XHRcdGlubyA9IDA7XG4mIzQzO1x0ZWxzZSBpZiAoIXN0cmNtcChuYW1lLCBGSUxFX05BTUUpKVxuJiM0MztcdFx0aW5vID0gRklMRV9JTk87XG4mIzQzO1x0ZWxzZSBpZiAoIXN0cmNtcChuYW1lLCBMSU5LX05BTUUpKVxuJiM0MztcdFx0aW5vID0gTElOS19JTk87XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0aW5vID0gMDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFpbm8pIHtcbiYjNDM7XHRcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1lbXNldChcdTAwMjZlLCAwLCBzaXplb2YoZSkpO1xuJiM0MztcdGUuaW5vID0gaW5vO1xuJiM0MztcdGUuYXR0cl90aW1lb3V0ID0gMDtcbiYjNDM7XHRlLmVudHJ5X3RpbWVvdXQgPSAwO1xuJiM0MztcdGZpbGxfYXR0cihpbm8sIFx1MDAyNmUuYXR0cik7XG4mIzQzO1x0ZnVzZV9yZXBseV9lbnRyeShyZXEsIFx1MDAyNmUpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0X2dldGF0dHIoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgaW5vLFxuJiM0MztcdFx0ICAgICAgc3RydWN0IGZ1c2VfZmlsZV9pbmZvICpmaSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzdGF0IHN0O1xuJiM0MztcbiYjNDM7XHQodm9pZClmaTtcbiYjNDM7XHQvKiBUaGUgcm9vdCBpcyBsZWZ0IGFsb25lOyByZWZ1c2luZyBpdCB3b3VsZCBicmVhayB0aGUgbW91bnQgaXRzZWxmLiAqL1xuJiM0MztcdGlmIChpbm8gPT0gRklMRV9JTk8pIHtcbiYjNDM7XHRcdGdfZHMuZ2V0YXR0cnNfc2VlbiYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRpZiAocmVmdXNlX25vdyhSRUZVU0VfR0VUQVRUUikpIHtcbiYjNDM7XHRcdFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpO1xuJiM0MztcdFx0XHRyZXR1cm47XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdGZpbGxfYXR0cihpbm8sIFx1MDAyNnN0KTtcbiYjNDM7XHRmdXNlX3JlcGx5X2F0dHIocmVxLCBcdTAwMjZzdCwgMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRfb3BlbihmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8sIHN0cnVjdCBmdXNlX2ZpbGVfaW5mbyAqZmkpXG4mIzQzO3tcbiYjNDM7XHRpZiAoaW5vICE9IEZJTEVfSU5PKSB7XG4mIzQzO1x0XHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRnX2RzLm9wZW5zX3NlZW4mIzQzOyYjNDM7O1xuJiM0MztcdGlmIChyZWZ1c2Vfbm93KFJFRlVTRV9PUEVOKSkge1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIFRoZSBpbm9kZSBpcyBnb25lIGFzIGZhciBhcyB0aGlzIHNlcnZlciBpcyBjb25jZXJuZWQsIGV2ZW5cbiYjNDM7XHRcdCAqIHRob3VnaCB0aGUgY2xpZW50IGlzIGhvbGRpbmcgYSByZWZlcmVuY2UgdG8gaXQgYW5kIGFza2VkIGJ5XG4mIzQzO1x0XHQgKiBub2RlaWQgcmF0aGVyIHRoYW4gYnkgbmFtZS5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XHRmdXNlX3JlcGx5X29wZW4ocmVxLCBmaSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRfcmVhZChmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8sIHNpemVfdCBzaXplLCBvZmZfdCBvZmYsXG4mIzQzO1x0XHQgICBzdHJ1Y3QgZnVzZV9maWxlX2luZm8gKmZpKVxuJiM0Mzt7XG4mIzQzO1x0c2l6ZV90IGxlbiA9IHNpemVvZihDT05URU5UUykgLSAxO1xuJiM0MztcbiYjNDM7XHQodm9pZClmaTtcbiYjNDM7XHRpZiAoaW5vICE9IEZJTEVfSU5PKSB7XG4mIzQzO1x0XHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcdGlmICgoc2l6ZV90KW9mZiBcdTAwM2U9IGxlbikge1xuJiM0MztcdFx0ZnVzZV9yZXBseV9idWYocmVxLCBOVUxMLCAwKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKG9mZiAmIzQzOyBzaXplIFx1MDAzZSBsZW4pXG4mIzQzO1x0XHRzaXplID0gbGVuIC0gb2ZmO1xuJiM0MztcdGZ1c2VfcmVwbHlfYnVmKHJlcSwgQ09OVEVOVFMgJiM0Mzsgb2ZmLCBzaXplKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdF9zZXRhdHRyKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubywgc3RydWN0IHN0YXQgKmF0dHIsXG4mIzQzO1x0XHQgICAgICBpbnQgdG9fc2V0LCBzdHJ1Y3QgZnVzZV9maWxlX2luZm8gKmZpKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHN0YXQgc3Q7XG4mIzQzO1xuJiM0MztcdCh2b2lkKWF0dHI7XG4mIzQzO1x0KHZvaWQpdG9fc2V0O1xuJiM0MztcdCh2b2lkKWZpO1xuJiM0MztcdGlmIChpbm8gPT0gRklMRV9JTk8pIHtcbiYjNDM7XHRcdGdfZHMuc2V0YXR0cnNfc2VlbiYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRpZiAocmVmdXNlX25vdyhSRUZVU0VfU0VUQVRUUikpIHtcbiYjNDM7XHRcdFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpO1xuJiM0MztcdFx0XHRyZXR1cm47XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdGZpbGxfYXR0cihpbm8sIFx1MDAyNnN0KTtcbiYjNDM7XHRmdXNlX3JlcGx5X2F0dHIocmVxLCBcdTAwMjZzdCwgMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRfcmVhZGxpbmsoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgaW5vKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKGlubyAhPSBMSU5LX0lOTykge1xuJiM0MztcdFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFSU5WQUwpO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Z19kcy5yZWFkbGlua3Nfc2VlbiYjNDM7JiM0Mzs7XG4mIzQzO1x0aWYgKHJlZnVzZV9ub3coUkVGVVNFX1JFQURMSU5LKSkge1xuJiM0MztcdFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XHRmdXNlX3JlcGx5X3JlYWRsaW5rKHJlcSwgTElOS19UQVJHRVQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0X3N0YXRmcyhmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8pXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgc3RhdHZmcyBzZnM7XG4mIzQzO1xuJiM0MztcdCh2b2lkKWlubztcbiYjNDM7XHRnX2RzLnN0YXRmc3Nfc2VlbiYjNDM7JiM0Mzs7XG4mIzQzO1x0aWYgKHJlZnVzZV9ub3coUkVGVVNFX1NUQVRGUykpIHtcbiYjNDM7XHRcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1lbXNldChcdTAwMjZzZnMsIDAsIHNpemVvZihzZnMpKTtcbiYjNDM7XHRzZnMuZl9ic2l6ZSA9IDUxMjtcbiYjNDM7XHRzZnMuZl9mcnNpemUgPSA1MTI7XG4mIzQzO1x0c2ZzLmZfbmFtZW1heCA9IE5BTUVfTUFYO1xuJiM0MztcdGZ1c2VfcmVwbHlfc3RhdGZzKHJlcSwgXHUwMDI2c2ZzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBmdXNlX2xvd2xldmVsX29wcyBmc19vcHMgPSB7XG4mIzQzO1x0Lmxvb2t1cFx0XHQ9IHRfbG9va3VwLFxuJiM0MztcdC5nZXRhdHRyXHQ9IHRfZ2V0YXR0cixcbiYjNDM7XHQuc2V0YXR0clx0PSB0X3NldGF0dHIsXG4mIzQzO1x0LnJlYWRsaW5rXHQ9IHRfcmVhZGxpbmssXG4mIzQzO1x0LnN0YXRmc1x0XHQ9IHRfc3RhdGZzLFxuJiM0MztcdC5vcGVuXHRcdD0gdF9vcGVuLFxuJiM0MztcdC5yZWFkXHRcdD0gdF9yZWFkLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKnJ1bl9kYWVtb24odm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0ZnVzZV9zZXNzaW9uX2xvb3AoKHN0cnVjdCBmdXNlX3Nlc3Npb24gKilhcmcpO1xuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiAtLS0tIGtzZWxmdGVzdCBoYXJuZXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJiM0MztcbiYjNDM7RklYVFVSRShvcGVuX2VzdGFsZSkge1xuJiM0MztcdHN0cnVjdCBmdXNlX3Nlc3Npb24gKnNlO1xuJiM0MztcdGNoYXIgICAgICAgICAgICAgICAgIG1vdW50cG9pbnRbUEFUSF9NQVhdO1xuJiM0MztcdGNoYXIgICAgICAgICAgICAgICAgIGZpbGVfcGF0aFtQQVRIX01BWF07XG4mIzQzO1x0Y2hhciAgICAgICAgICAgICAgICAgbGlua19wYXRoW1BBVEhfTUFYXTtcbiYjNDM7XHRjaGFyICAgICAgICAgICAgICAgICBhYnNlbnRfcGF0aFtQQVRIX01BWF07XG4mIzQzO1x0cHRocmVhZF90ICAgICAgICAgICAgdGhyZWFkO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7RklYVFVSRV9TRVRVUChvcGVuX2VzdGFsZSlcbiYjNDM7e1xuJiM0MztcdGNoYXIgKmZ1c2VfYXJndltdID0geyBcJiMzNDtmdXNlX2VzdGFsZV90ZXN0XCYjMzQ7LCBOVUxMIH07XG4mIzQzO1x0c3RydWN0IGZ1c2VfYXJncyBhcmdzID0gRlVTRV9BUkdTX0lOSVQoMSwgZnVzZV9hcmd2KTtcbiYjNDM7XG4mIzQzO1x0bWVtc2V0KFx1MDAyNmdfZHMsIDAsIHNpemVvZihnX2RzKSk7XG4mIzQzO1x0Z19kcy53aGF0ID0gUkVGVVNFX05PVEhJTkc7XG4mIzQzO1x0Z19kcy5yZWZ1c2Fsc19sZWZ0ID0gMTtcbiYjNDM7XG4mIzQzO1x0c3RyY3B5KHNlbGYtXHUwMDNlbW91bnRwb2ludCwgXCYjMzQ7L3RtcC9vcGVuX2VzdGFsZV90ZXN0X1hYWFhYWFwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFta2R0ZW1wKHNlbGYtXHUwMDNlbW91bnRwb2ludCkpXG4mIzQzO1x0XHRTS0lQKHJldHVybiwgXCYjMzQ7bWtkdGVtcDogJXNcJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKHNlbGYtXHUwMDNlZmlsZV9wYXRoLCBzaXplb2Yoc2VsZi1cdTAwM2VmaWxlX3BhdGgpLFxuJiM0MztcdFx0IFwmIzM0OyVzL1wmIzM0OyBGSUxFX05BTUUsIHNlbGYtXHUwMDNlbW91bnRwb2ludCk7XG4mIzQzO1x0c25wcmludGYoc2VsZi1cdTAwM2VsaW5rX3BhdGgsIHNpemVvZihzZWxmLVx1MDAzZWxpbmtfcGF0aCksXG4mIzQzO1x0XHQgXCYjMzQ7JXMvXCYjMzQ7IExJTktfTkFNRSwgc2VsZi1cdTAwM2Vtb3VudHBvaW50KTtcbiYjNDM7XHRzbnByaW50ZihzZWxmLVx1MDAzZWFic2VudF9wYXRoLCBzaXplb2Yoc2VsZi1cdTAwM2VhYnNlbnRfcGF0aCksXG4mIzQzO1x0XHQgXCYjMzQ7JXMvXCYjMzQ7IEFCU0VOVF9OQU1FLCBzZWxmLVx1MDAzZW1vdW50cG9pbnQpO1xuJiM0MztcbiYjNDM7XHRzZWxmLVx1MDAzZXNlID0gZnVzZV9zZXNzaW9uX25ldyhcdTAwMjZhcmdzLCBcdTAwMjZmc19vcHMsIHNpemVvZihmc19vcHMpLCBOVUxMKTtcbiYjNDM7XHRpZiAoIXNlbGYtXHUwMDNlc2UpIHtcbiYjNDM7XHRcdHJtZGlyKHNlbGYtXHUwMDNlbW91bnRwb2ludCk7XG4mIzQzO1x0XHRTS0lQKHJldHVybiwgXCYjMzQ7ZnVzZV9zZXNzaW9uX25ldyBmYWlsZWRcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGZ1c2Vfc2Vzc2lvbl9tb3VudChzZWxmLVx1MDAzZXNlLCBzZWxmLVx1MDAzZW1vdW50cG9pbnQpKSB7XG4mIzQzO1x0XHRmdXNlX3Nlc3Npb25fZGVzdHJveShzZWxmLVx1MDAzZXNlKTtcbiYjNDM7XHRcdHJtZGlyKHNlbGYtXHUwMDNlbW91bnRwb2ludCk7XG4mIzQzO1x0XHRTS0lQKHJldHVybiwgXCYjMzQ7ZnVzZV9zZXNzaW9uX21vdW50IGZhaWxlZCAobm8gZnVzZXJtb3VudDMgb3Igbm8gcHJpdmlsZWdlcylcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHB0aHJlYWRfY3JlYXRlKFx1MDAyNnNlbGYtXHUwMDNldGhyZWFkLCBOVUxMLCBydW5fZGFlbW9uLCBzZWxmLVx1MDAzZXNlKSkge1xuJiM0MztcdFx0ZnVzZV9zZXNzaW9uX3VubW91bnQoc2VsZi1cdTAwM2VzZSk7XG4mIzQzO1x0XHRmdXNlX3Nlc3Npb25fZGVzdHJveShzZWxmLVx1MDAzZXNlKTtcbiYjNDM7XHRcdHJtZGlyKHNlbGYtXHUwMDNlbW91bnRwb2ludCk7XG4mIzQzO1x0XHRTS0lQKHJldHVybiwgXCYjMzQ7cHRocmVhZF9jcmVhdGU6ICVzXCYjMzQ7LCBzdHJlcnJvcihlcnJubykpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZnVzZV9vcHRfZnJlZV9hcmdzKFx1MDAyNmFyZ3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztGSVhUVVJFX1RFQVJET1dOKG9wZW5fZXN0YWxlKVxuJiM0Mzt7XG4mIzQzO1x0ZnVzZV9zZXNzaW9uX2V4aXQoc2VsZi1cdTAwM2VzZSk7XG4mIzQzO1x0ZnVzZV9zZXNzaW9uX3VubW91bnQoc2VsZi1cdTAwM2VzZSk7XG4mIzQzO1x0cHRocmVhZF9qb2luKHNlbGYtXHUwMDNldGhyZWFkLCBOVUxMKTtcbiYjNDM7XHRmdXNlX3Nlc3Npb25fZGVzdHJveShzZWxmLVx1MDAzZXNlKTtcbiYjNDM7XHRybWRpcihzZWxmLVx1MDAzZW1vdW50cG9pbnQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfb3Blbl9pc19yZXRyaWVkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGZkO1xuJiM0MztcbiYjNDM7XHRnX2RzLndoYXQgPSBSRUZVU0VfT1BFTjtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBvcGVuKHNlbGYtXHUwMDNlZmlsZV9wYXRoLCBPX1JET05MWSk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIHJlZnVzYWwgZGVzY3JpYmVzIGEgaGFuZGxlIHRoZSBzZXJ2ZXIgc2hvdWxkIGhhdmUgaG9ub3VyZWQsIHNvXG4mIzQzO1x0ICogdGhlIHdhbGsgaXMgZW50aXRsZWQgdG8gcmVzb2x2ZSB0aGUgbmFtZSBhZ2FpbiBhbmQgb3BlbiB3aGF0IGl0XG4mIzQzO1x0ICogcmVmZXJzIHRvIG5vdy4gUmVwb3J0aW5nIHRoZSBmaWxlIG1pc3NpbmcgaW5zdGVhZCBlbmRzIHRoZSB3YWxrLlxuJiM0MztcdCAqL1xuJiM0MztcdEFTU0VSVF9HRShmZCwgMCkge1xuJiM0MztcdFx0VEhfTE9HKFwmIzM0O29wZW4gZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgb3BlbiByZXF1ZXN0KHMpXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIHN0cmVycm9yKGVycm5vKSwgZ19kcy5vcGVuc19zZWVuKTtcbiYjNDM7XHR9XG4mIzQzO1x0RVhQRUNUX0VRKDIsIGdfZHMub3BlbnNfc2Vlbik7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfZ2V0YXR0cl9vbl9wYXRoX2lzX3JldHJpZWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgc3RhdCBzdDtcbiYjNDM7XG4mIzQzO1x0Z19kcy53aGF0ID0gUkVGVVNFX0dFVEFUVFI7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogUmVhY2hlZCBieSBuYW1lLCBzbyB0aGUgd2FsayBjYW4gcmVzb2x2ZSBpdCBhZ2FpbiBhbmQgYXNrIGEgc2Vjb25kXG4mIzQzO1x0ICogdGltZSwgdGhlIHNhbWUgcmVjb3ZlcnkgdGhlIG9wZW4gZ2V0cy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRBU1NFUlRfRVEoMCwgc3RhdChzZWxmLVx1MDAzZWZpbGVfcGF0aCwgXHUwMDI2c3QpKSB7XG4mIzQzO1x0XHRUSF9MT0coXCYjMzQ7c3RhdCBmYWlsZWQgd2l0aCAlcyBhZnRlciAlZCBnZXRhdHRyIHJlcXVlc3QocylcJiMzNDssXG4mIzQzO1x0XHQgICAgICAgc3RyZXJyb3IoZXJybm8pLCBnX2RzLmdldGF0dHJzX3NlZW4pO1xuJiM0MztcdH1cbiYjNDM7XHRFWFBFQ1RfR1QoZ19kcy5nZXRhdHRyc19zZWVuLCAxKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX3NldGF0dHJfb25fcGF0aF9pc19yZXRyaWVkKVxuJiM0Mzt7XG4mIzQzO1x0Z19kcy53aGF0ID0gUkVGVVNFX1NFVEFUVFI7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogY2htb2QoKSByZWFjaGVzIHRoZSBpbm9kZSBieSBuYW1lLCBzbyB0aGUgc2FtZSByZXRyeSBhcHBsaWVzOiB0aGVcbiYjNDM7XHQgKiByZWZ1c2FsIGRlc2NyaWJlcyBhIGhhbmRsZSBhbmQgdGhlIHdhbGsgbWF5IHJlc29sdmUgdGhlIG5hbWUgYWdhaW4uXG4mIzQzO1x0ICovXG4mIzQzO1x0QVNTRVJUX0VRKDAsIGNobW9kKHNlbGYtXHUwMDNlZmlsZV9wYXRoLCAwNjAwKSkge1xuJiM0MztcdFx0VEhfTE9HKFwmIzM0O2NobW9kIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHNldGF0dHIgcmVxdWVzdChzKVwmIzM0OyxcbiYjNDM7XHRcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMuc2V0YXR0cnNfc2Vlbik7XG4mIzQzO1x0fVxuJiM0MztcdEVYUEVDVF9HVChnX2RzLnNldGF0dHJzX3NlZW4sIDEpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfcmVhZGxpbmtfb25fcGF0aF9pc19yZXRyaWVkKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBidWZbUEFUSF9NQVhdO1xuJiM0MztcdHNzaXplX3QgbjtcbiYjNDM7XG4mIzQzO1x0Z19kcy53aGF0ID0gUkVGVVNFX1JFQURMSU5LO1xuJiM0MztcbiYjNDM7XHRuID0gcmVhZGxpbmsoc2VsZi1cdTAwM2VsaW5rX3BhdGgsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKTtcbiYjNDM7XHRBU1NFUlRfR0UobiwgMCkge1xuJiM0MztcdFx0VEhfTE9HKFwmIzM0O3JlYWRsaW5rIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHJlYWRsaW5rIHJlcXVlc3QocylcJiMzNDssXG4mIzQzO1x0XHQgICAgICAgc3RyZXJyb3IoZXJybm8pLCBnX2RzLnJlYWRsaW5rc19zZWVuKTtcbiYjNDM7XHR9XG4mIzQzO1x0YnVmW25dID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRFWFBFQ1RfU1RSRVEoTElOS19UQVJHRVQsIGJ1Zik7XG4mIzQzO1x0RVhQRUNUX0dUKGdfZHMucmVhZGxpbmtzX3NlZW4sIDEpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfc3RhdGZzX29uX3BhdGhfaXNfcmV0cmllZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzdGF0ZnMgc2ZzO1xuJiM0MztcbiYjNDM7XHRnX2RzLndoYXQgPSBSRUZVU0VfU1RBVEZTO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIHN0YXRmcygpIGRlc2NyaWJlcyB0aGUgbW91bnQgcmF0aGVyIHRoYW4gdGhlIGZpbGUsIGJ1dCBpdCBpcyBzdGlsbFxuJiM0MztcdCAqIHJlYWNoZWQgdGhyb3VnaCBhIHBhdGggd2Fsaywgc28gYSByZWZ1c2FsIHRoYXQgbmFtZXMgYSBoYW5kbGUgaXNcbiYjNDM7XHQgKiByZXRyaWVkIHRoZSBzYW1lIHdheS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRBU1NFUlRfRVEoMCwgc3RhdGZzKHNlbGYtXHUwMDNlZmlsZV9wYXRoLCBcdTAwMjZzZnMpKSB7XG4mIzQzO1x0XHRUSF9MT0coXCYjMzQ7c3RhdGZzIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHN0YXRmcyByZXF1ZXN0KHMpXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIHN0cmVycm9yKGVycm5vKSwgZ19kcy5zdGF0ZnNzX3NlZW4pO1xuJiM0MztcdH1cbiYjNDM7XHRFWFBFQ1RfR1QoZ19kcy5zdGF0ZnNzX3NlZW4sIDEpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0Yob3Blbl9lc3RhbGUsIGFic2VudF9uYW1lX3N0aWxsX3JlcG9ydHNfYWJzZW50KVxuJiM0Mzt7XG4mIzQzO1x0aW50IGZkO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEhlcmUgaXQgaXMgdGhlIGxvb2t1cCB0aGF0IGZhaWxzIHJhdGhlciB0aGFuIHRoZSBvcGVuLCBzbyBub3RoaW5nIGlzXG4mIzQzO1x0ICogYmVpbmcgZGVzY3JpYmVkIGFzIHN0YWxlIGFuZCB0aGUgY2FsbGVyIG11c3Qgc3RpbGwgYmUgdG9sZCB0aGUgbmFtZVxuJiM0MztcdCAqIGlzIG5vdCB0aGVyZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRmZCA9IG9wZW4oc2VsZi1cdTAwM2VhYnNlbnRfcGF0aCwgT19SRE9OTFkpO1xuJiM0MztcdEFTU0VSVF9MVChmZCwgMCk7XG4mIzQzO1x0RVhQRUNUX0VRKEVOT0VOVCwgZXJybm8pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0hBUk5FU1NfTUFJTlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDAwOjA1PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0ZVU0VfRlMmIzM0OywKICAgICYjMzQ7VklSVElPX0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7ZnVzZV9kb19zZXRhdHRyJiMzNDssCiAgICAmIzM0O2Z1c2Vfb3BlbiYjMzQ7LAogICAgJiMzNDtmdXNlX2Rpcl9vcGVuJiMzNDssCiAgICAmIzM0O2Z1c2VfZG9fZ2V0YXR0ciYjMzQ7LAogICAgJiMzNDtmdXNlX3N0YXRmcyYjMzQ7LAogICAgJiMzNDtmdXNlX3JlYWRsaW5rX2ZvbGlvJiMzNDssCiAgICAmIzM0O3ZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHVwZGF0ZXMgZXJyb3IgaGFuZGxpbmcgZm9yIGxpdmUgbm9kZSBJRHMgaW4gRlVTRSBhbmQgdmlydGlvLWZzIHdoZW4gdGhlIHVzZXIvaG9zdCBzZXJ2ZXIgcmV0dXJucyAtRU5PRU5ULCB0cmFuc2xhdGluZyBpdCB0byAtRVNUQUxFIG9yIC1FT1BFTlNUQUxFIHRvIHRyaWdnZXIgVkZTIHBhdGggbG9va3VwIHJldHJpZXMgKExPT0tVUF9SRVZBTCkuIFRoZXNlIGZ1bmN0aW9uYWwgY2hhbmdlcyBpbXBhY3QgY29yZSBmaWxlIG9wZXJhdGlvbnMgKG9wZW4sIGdldGF0dHIsIHNldGF0dHIsIHJlYWRsaW5rLCBzdGF0ZnMpIGluIEZVU0UgYW5kIHZpcnRpby1mcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGI0Y2NhMzRiNmZlZTk0ODYzYjFiZTIwMzkyMDkzOGUxZjRhZjliZTQKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIEF1ZyAyOCAwMDowNTozMCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZGlyLmMgYi9mcy9mdXNlL2Rpci5jCmluZGV4IGU0OWI0ZTg3NGIxNWYuLjIxN2EwMzk5OTA1MDcgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZGlyLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZnVzZS9kaXIuYwpAQCAtMTUzMiw2ICYjNDM7MTUzMiw4IEBAIHN0YXRpYyBpbnQgZnVzZV9kb19nZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJaWYgKHN0YXQpCiAJCQkJZnVzZV9maWxsYXR0cihpZG1hcCwgaW5vZGUsICZhbXA7b3V0YXJnLmF0dHIsIHN0YXQpOwogCQl9CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQllcnIgPSBmdXNlX3N0YWxlX2lub2RlX2VycihlcnIpOwogCX0KIAlyZXR1cm4gZXJyOwogfQpAQCAtMTg0OCw2ICYjNDM7MTg1MCw3IEBAIHN0YXRpYyBpbnQgZnVzZV9yZWFkbGlua19mb2xpbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKQogCiAJZnVzZV9pbnZhbGlkYXRlX2F0aW1lKGlub2RlKTsKIAomIzQzOwlyZXMgPSBmdXNlX3N0YWxlX2lub2RlX2VycihyZXMpOwogCWlmIChyZXMgJmx0OyAwKQogCQlyZXR1cm4gcmVzOwogCkBAIC0xOTEwLDYgJiM0MzsxOTEzLDEyIEBAIHN0YXRpYyBpbnQgZnVzZV9kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIAkJcmV0dXJuIGVycjsKIAogCWVyciA9IGZ1c2VfZG9fb3BlbihmbSwgZ2V0X25vZGVfaWQoaW5vZGUpLCBmaWxlLCB0cnVlKTsKJiM0MzsJLyoKJiM0MzsJICogQXMgaW4gZnVzZV9vcGVuX2NvbW1vbigpOiBhIHBhdGggd2FsayBzdGFuZHMgYmVoaW5kIHRoaXMgb3BlbiwKJiM0MzsJICogc28gdGhlIHJlZnVzYWwgaXMgRU9QRU5TVEFMRSBmb3IgcGF0aF9vcGVuYXQoKSB0byBhbnN3ZXIuCiYjNDM7CSAqLwomIzQzOwlpZiAoZXJyID09IC1FTk9FTlQpCiYjNDM7CQllcnIgPSAtRU9QRU5TVEFMRTsKIAlpZiAoIWVycikgewogCQlzdHJ1Y3QgZnVzZV9maWxlICpmZiA9IGZpbGUtJmd0O3ByaXZhdGVfZGF0YTsKIApAQCAtMjI0OSw2ICYjNDM7MjI1OCw3IEBAIGludCBmdXNlX2RvX3NldGF0dHIoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAlpZiAoZXJyKSB7CiAJCWlmIChlcnIgPT0gLUVJTlRSKQogCQkJZnVzZV9pbnZhbGlkYXRlX2F0dHIoaW5vZGUpOwomIzQzOwkJZXJyID0gZnVzZV9zdGFsZV9pbm9kZV9lcnIoZXJyKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZmlsZS5jIGIvZnMvZnVzZS9maWxlLmMKaW5kZXggOGQ2MTM1YTYxMDhhNC4uMzA4YjE1YzMwZjM0ZCAxMDA2NDQKLS0tIGEvZnMvZnVzZS9maWxlLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZnVzZS9maWxlLmMKQEAgLTI3OSw2ICYjNDM7Mjc5LDE3IEBAIHN0YXRpYyBpbnQgZnVzZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogCQlmdXNlX3NldF9ub3dyaXRlKGlub2RlKTsKIAogCWVyciA9IGZ1c2VfZG9fb3BlbihmbSwgZ2V0X25vZGVfaWQoaW5vZGUpLCBmaWxlLCBmYWxzZSk7CiYjNDM7CS8qCiYjNDM7CSAqIFRoaXMgb3BlbiByZWFjaGVkIHRoZSBzZXJ2ZXIgdGhyb3VnaCBhIHBhdGggd2Fsaywgc28gYSByZWZ1c2FsCiYjNDM7CSAqIGZvciB0aGUgbGl2ZSBub2RlaWQgaXMgcmVwb3J0ZWQgYXMgRU9QRU5TVEFMRSByYXRoZXIgdGhhbiB0aGUKJiM0MzsJICogRVNUQUxFIHRoZSBub2RlaWQtb25seSByZXF1ZXN0cyBzYXk6IHBhdGhfb3BlbmF0KCkgcGlja3MgdGhlCiYjNDM7CSAqIGNoZWFwZXN0IHJldHJ5IGZvciB0aGUgd2FsayBpbiBwcm9ncmVzcywgRUNISUxEIHVuZGVyIExPT0tVUF9SQ1UKJiM0MzsJICogYW5kIEVTVEFMRSBvdGhlcndpc2UuIGZ1c2VfZmlsZV9vcGVuKCkgaXMgbGVmdCBhbG9uZSBiZWNhdXNlCiYjNDM7CSAqIGZ1c2VfcHJpdl9pb2N0bF9wcmVwYXJlKCkgcmVhY2hlcyBpdCB0byBzZXJ2ZSBGU19JT0NfR0VURkxBR1MsCiYjNDM7CSAqIHdpdGggbm8gb3BlbiBiZWhpbmQgaXQgdG8gdHJhbnNsYXRlIHRoZSBpbnRlcm5hbCBlcnJuby4KJiM0MzsJICovCiYjNDM7CWlmIChlcnIgPT0gLUVOT0VOVCkKJiM0MzsJCWVyciA9IC1FT1BFTlNUQUxFOwogCWlmICghZXJyKSB7CiAJCWZmID0gZmlsZS0mZ3Q7cHJpdmF0ZV9kYXRhOwogCQllcnIgPSBmdXNlX2ZpbmlzaF9vcGVuKGlub2RlLCBmaWxlKTsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZnVzZV9pLmggYi9mcy9mdXNlL2Z1c2VfaS5oCmluZGV4IGM4ZDRjNWYzYWY3ZTguLmU2YjI1OTdkNmRkNmYgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZnVzZV9pLmgKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZnVzZS9mdXNlX2kuaApAQCAtMTI1MCw2ICYjNDM7MTI1MCwyNSBAQCB2b2lkIGZ1c2VfaW5vZGVfdW5jYWNoZWRfaW9fZW5kKHN0cnVjdCBmdXNlX2lub2RlICpmaSk7CiBpbnQgZnVzZV9maWxlX2lvX29wZW4oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogdm9pZCBmdXNlX2ZpbGVfaW9fcmVsZWFzZShzdHJ1Y3QgZnVzZV9maWxlICpmZiwgc3RydWN0IGlub2RlICppbm9kZSk7CiAKJiM0MzsvKgomIzQzOyAqIFJlcG9ydCBhIHJlcXVlc3QgcmVmdXNlZCBmb3IgYSBsaXZlIG5vZGVpZCBhcyBzdGFsZS4KJiM0MzsgKgomIzQzOyAqIEEgcmVxdWVzdCB0aGF0IG5hbWVzIGEgbm9kZWlkIGFuZCBub3RoaW5nIGVsc2UgaXMgb25seSBzZW50IGZvciBhbgomIzQzOyAqIGlub2RlIHRoZSBjbGllbnQgaGFzIGxvb2tlZCB1cCBhbmQgaG9sZHMgYSByZWZlcmVuY2UgdG8sIGFuZCB0aGUKJiM0MzsgKiBzZXJ2ZXIgb3dlcyB0aGUgY2xpZW50IHRoYXQgaW5vZGUgdW50aWwgaXQgaXMgc2VudCBGVVNFX0ZPUkdFVC4KJiM0MzsgKiBFTk9FTlQgZnJvbSB0aGUgc2VydmVyIGRlc2NyaWJlcyB0aGUgaW5vZGUgaXRzZWxmIHJhdGhlciB0aGFuIGEgbmFtZQomIzQzOyAqIHRoYXQgaGFzIGdvbmUgYXdheS4gUmVwb3J0IHRoZSBoYW5kbGUgYXMgc3RhbGUsIHdoaWNoIHRoZSBjYWxsZXIKJiM0MzsgKiBhbnN3ZXJzIGJ5IHJlc29sdmluZyB0aGUgbmFtZSBhZ2FpbiB1bmRlciBMT09LVVBfUkVWQUwgYW5kIGFjdGluZyBvbgomIzQzOyAqIHdoYXRldmVyIGl0IHJlZmVycyB0byBub3cuIEEgbmFtZSB0aGF0IHJlYWxseSBoYXMgZ29uZSBmYWlscyB0aGF0CiYjNDM7ICogc2Vjb25kIGxvb2t1cCBhbmQgdGhlIGNhbGxlciBzdGlsbCBzZWVzIEVOT0VOVC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGludCBmdXNlX3N0YWxlX2lub2RlX2VycihpbnQgZXJyKQomIzQzO3sKJiM0MzsJaWYgKGVyciA9PSAtRU5PRU5UKQomIzQzOwkJcmV0dXJuIC1FU1RBTEU7CiYjNDM7CXJldHVybiBlcnI7CiYjNDM7fQomIzQzOwogLyogZmlsZS5jICovCiBzdHJ1Y3QgZnVzZV9maWxlICpmdXNlX2ZpbGVfb3BlbihzdHJ1Y3QgZnVzZV9tb3VudCAqZm0sIHU2NCBub2RlaWQsCiAJCQkJIHVuc2lnbmVkIGludCBvcGVuX2ZsYWdzLCBib29sIGlzZGlyKTsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvaW5vZGUuYyBiL2ZzL2Z1c2UvaW5vZGUuYwppbmRleCBlOTU1MmJlMzYzN2JjLi5jZGUwYTUzMzUwODk3IDEwMDY0NAotLS0gYS9mcy9mdXNlL2lub2RlLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZnVzZS9pbm9kZS5jCkBAIC02NjYsNyAmIzQzOzY2Niw3IEBAIHN0YXRpYyBpbnQgZnVzZV9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogCWVyciA9IGZ1c2Vfc2ltcGxlX3JlcXVlc3QoZm0sICZhbXA7YXJncyk7CiAJaWYgKCFlcnIpCiAJCWNvbnZlcnRfZnVzZV9zdGF0ZnMoYnVmLCAmYW1wO291dGFyZy5zdCk7Ci0JcmV0dXJuIGVycjsKJiM0MzsJcmV0dXJuIGZ1c2Vfc3RhbGVfaW5vZGVfZXJyKGVycik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZnVzZV9zeW5jX2J1Y2tldCAqZnVzZV9zeW5jX2J1Y2tldF9hbGxvYyh2b2lkKQpkaWZmIC0tZ2l0IGEvZnMvZnVzZS92aXJ0aW9fZnMuYyBiL2ZzL2Z1c2UvdmlydGlvX2ZzLmMKaW5kZXggZjE1ZTUxNmViY2I1Yy4uN2IwM2JmODdjMmFlOCAxMDA2NDQKLS0tIGEvZnMvZnVzZS92aXJ0aW9fZnMuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9mdXNlL3ZpcnRpb19mcy5jCkBAIC03ODAsNiAmIzQzOzc4MCw2NiBAQCBzdGF0aWMgYm9vbCB2aXJ0aW9fZnNfdmVyaWZ5X3Jlc3BvbnNlKHN0cnVjdCBmdXNlX3JlcSAqcmVxLCB1bnNpZ25lZCBpbnQgbGVuKQogCXJldHVybiB0cnVlOwogfQogCiYjNDM7LyoKJiM0MzsgKiBSZXBvcnQgYSByZXF1ZXN0IHJlZnVzZWQgZm9yIGEgbGl2ZSBub2RlaWQgYXMgc3RhbGUuCiYjNDM7ICoKJiM0MzsgKiBUaGVzZSByZXF1ZXN0cyBjYXJyeSBhIG5vZGVpZCBhbmQgbm8gbmFtZSwgc28gdGhlIGNsaWVudCBvbmx5IHNlbmRzIHRoZW0gZm9yCiYjNDM7ICogYW4gaW5vZGUgaXQgaGFzIGFscmVhZHkgbG9va2VkIHVwIGFuZCBob2xkcyBhIHJlZmVyZW5jZSB0bywgYW5kIGEgc2VydmVyIG93ZXMKJiM0MzsgKiB0aGUgY2xpZW50IHRoYXQgaW5vZGUgdW50aWwgaXQgaXMgc2VudCBGVVNFX0ZPUkdFVC4gQSBzZXJ2ZXIgYW5zd2VyaW5nIHdpdGgKJiM0MzsgKiBFTk9FTlQgaXMgZGVzY3JpYmluZyBhIGhhbmRsZSBpdCB3YXMgb2JsaWdlZCB0byBob25vdXIgcmF0aGVyIHRoYW4gYSBuYW1lCiYjNDM7ICogdGhhdCBoYXMgZ29uZSBhd2F5LCBhbmQgdGhlIGNhbGxlciBoYXMgbm8gcmVhc29uIHRvIGRvdWJ0IGl0LgomIzQzOyAqCiYjNDM7ICogU2F5aW5nIHRoZSBoYW5kbGUgaXMgc3RhbGUgaXMgc29tZXRoaW5nIHRoZSBjYWxsZXIga25vd3MgaG93IHRvIGFuc3dlcjogaXQKJiM0MzsgKiByZXBlYXRzIHRoZSBsb29rdXAgdW5kZXIgTE9PS1VQX1JFVkFMIGFuZCBhY3RzIG9uIHdoYXRldmVyIHRoZSBuYW1lIHJlZmVycyB0bwomIzQzOyAqIG5vdy4gQSBuYW1lIHRoYXQgZ2VudWluZWx5IGhhcyBnb25lIGZhaWxzIHRoZSByZXRyaWVkIGxvb2t1cCwgc28gYSBjYWxsZXIKJiM0MzsgKiBzdGlsbCBsZWFybnMgaXQgaXMgZ29uZS4gcmV0cnlfZXN0YWxlKCkgaXMgd2hhdCBkb2VzIHRoaXMsIGFuZCBmcy9uYW1laS5jLAomIzQzOyAqIGZzL29wZW4uYywgZnMvc3RhdC5jLCBmcy9zdGF0ZnMuYywgZnMvdXRpbWVzLmMgYW5kIGZzL3hhdHRyLmMgYWxsIHJlYWNoIGl0LAomIzQzOyAqIHdoaWNoIGlzIHdoYXQgbWFrZXMgdGhlIGNvbnZlcnNpb24gdXNlZnVsIHJhdGhlciB0aGFuIGEgcmVuYW1lIG9mIHRoZSBlcnJvci4KJiM0MzsgKgomIzQzOyAqIEEgcmVxdWVzdCB0aGF0IG5hbWVzIHNvbWV0aGluZyB3aGljaCBjYW4gaXRzZWxmIGJlIGFic2VudCBpcyBsZWZ0IGFsb25lLAomIzQzOyAqIGJlY2F1c2UgRU5PRU5UIGlzIHRoZW4gYW1iaWd1b3VzIGFuZCBpcyBmcmVxdWVudGx5IHRoZSBhbnN3ZXIgdGhlIGNhbGxlcgomIzQzOyAqIGFza2VkIGZvci4gRlVTRV9MT09LVVAgcmVwb3J0cyBhIG1pc3NpbmcgbmFtZSBpbiBhIGxpdmluZyBkaXJlY3RvcnkgYW5kIHRoZQomIzQzOyAqIGRpcmVjdG9yeSBvcGVyYXRpb25zIGNhcnJ5IGEgcGFyZW50IG5vZGVpZCBiZXNpZGUgb25lLCBzbyBuZWl0aGVyIGNhbiBiZQomIzQzOyAqIHJlYWQgYXMgYSBzdGF0ZW1lbnQgYWJvdXQgdGhlIGlub2RlLiBUaGUgZXh0ZW5kZWQgYXR0cmlidXRlIHJlcXVlc3RzIGJlbG9uZwomIzQzOyAqIHdpdGggdGhlbTogdGhleSBjYXJyeSBhbiBhdHRyaWJ1dGUgbmFtZSwgYW5kIHdoaWxlIGEgc2VydmVyIHNob3VsZCByZXBvcnQgYQomIzQzOyAqIG1pc3NpbmcgYXR0cmlidXRlIGFzIEVOT0RBVEEsIG9uZSB0aGF0IGFuc3dlcnMgRU5PRU5UIGluc3RlYWQgd291bGQgaGF2ZSBhCiYjNDM7ICogY29ycmVjdCByZXBseSB0dXJuZWQgaW50byBhIHJldHJ5IHRoYXQgY2Fubm90IHN1Y2NlZWQuCiYjNDM7ICoKJiM0MzsgKiBSZXF1ZXN0cyBhZ2FpbnN0IGFuIGFscmVhZHkgb3BlbiBkZXNjcmlwdG9yIGFyZSBhbHNvIGxlZnQgYWxvbmUsIHNpbmNlIHRoZXJlCiYjNDM7ICogaXMgbm8gZXF1aXZhbGVudCByZXRyeSB0byByZWFjaCBhbmQgY29udmVydGluZyB0aGUgZXJyb3Igd291bGQgcmVuYW1lIGEKJiM0MzsgKiBmYWlsdXJlIHJhdGhlciB0aGFuIHJlcGFpciBpdCwgYW5kIEZVU0VfSU9DVEwgYW5kIEZVU0VfUE9MTCBoYW5kIHRoZQomIzQzOyAqIHNlcnZlciYjMzk7cyBlcnJubyB0byB1c2Vyc3BhY2UgdmVyYmF0aW0uCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgdmlydGlvX2ZzX2ZpeHVwX3N0YWxlX2Vycm9yKHN0cnVjdCBmdXNlX3JlcSAqcmVxKQomIzQzO3sKJiM0MzsJaWYgKHJlcS0mZ3Q7b3V0LmguZXJyb3IgIT0gLUVOT0VOVCkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJc3dpdGNoIChyZXEtJmd0O2luLmgub3Bjb2RlKSB7CiYjNDM7CWNhc2UgRlVTRV9PUEVOOgomIzQzOwljYXNlIEZVU0VfT1BFTkRJUjoKJiM0MzsJCS8qCiYjNDM7CQkgKiBBbiBvcGVuIHNheXMgRU9QRU5TVEFMRSwgYW5kIHBhdGhfb3BlbmF0KCkgZGVjaWRlcyB3aGF0IHRoZQomIzQzOwkJICogd2FsayBpbiBwcm9ncmVzcyBzaG91bGQgbWFrZSBvZiBpdDogRUNISUxEIHVuZGVyIExPT0tVUF9SQ1UKJiM0MzsJCSAqIHNvIGl0IGRyb3BzIHRvIFJFRi13YWxrLCBFU1RBTEUgb3RoZXJ3aXNlIHNvIHRoZSBuYW1lIGlzCiYjNDM7CQkgKiByZXNvbHZlZCBhZ2FpbiB1bmRlciBMT09LVVBfUkVWQUwuIE5hbWluZyBFU1RBTEUgaGVyZSB3b3VsZAomIzQzOwkJICogdGFrZSB0aGUgc2Vjb25kIGluIGJvdGggY2FzZXMgYW5kIHNraXAgYSBjaGVhcGVyIHJldHJ5LgomIzQzOwkJICovCiYjNDM7CQlyZXEtJmd0O291dC5oLmVycm9yID0gLUVPUEVOU1RBTEU7CiYjNDM7CQlicmVhazsKJiM0MzsJY2FzZSBGVVNFX0dFVEFUVFI6CiYjNDM7CWNhc2UgRlVTRV9TRVRBVFRSOgomIzQzOwljYXNlIEZVU0VfUkVBRExJTks6CiYjNDM7CWNhc2UgRlVTRV9TVEFURlM6CiYjNDM7CQkvKgomIzQzOwkJICogTm90aGluZyB0cmFuc2xhdGVzIEVPUEVOU1RBTEUgb3V0c2lkZSB0aGUgb3BlbiBwYXRoLCBzbwomIzQzOwkJICogdGhlc2Ugc2F5IEVTVEFMRSBkaXJlY3RseSwgd2hpY2ggcmV0cnlfZXN0YWxlKCkgYW5zd2Vycy4KJiM0MzsJCSAqLwomIzQzOwkJcmVxLSZndDtvdXQuaC5lcnJvciA9IC1FU1RBTEU7CiYjNDM7CQlicmVhazsKJiM0MzsJfQomIzQzO30KJiM0MzsKIC8qIFdvcmsgZnVuY3Rpb24gZm9yIHJlcXVlc3QgY29tcGxldGlvbiAqLwogc3RhdGljIHZvaWQgdmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGUoc3RydWN0IGZ1c2VfcmVxICpyZXEsCiAJCQkJICAgICAgIHN0cnVjdCB2aXJ0aW9fZnNfdnEgKmZzdnEpCkBAIC04MTAsNiAmIzQzOzg3MCw4IEBAIHN0YXRpYyB2b2lkIHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlKHN0cnVjdCBmdXNlX3JlcSAqcmVxLAogCiAJY2xlYXJfYml0KEZSX1NFTlQsICZhbXA7cmVxLSZndDtmbGFncyk7CiAKJiM0MzsJdmlydGlvX2ZzX2ZpeHVwX3N0YWxlX2Vycm9yKHJlcSk7CiYjNDM7CiAJZnVzZV9yZXF1ZXN0X2VuZChyZXEpOwogCXNwaW5fbG9jaygmYW1wO2ZzdnEtJmd0O2xvY2spOwogCWRlY19pbl9mbGlnaHRfcmVxKGZzdnEpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uZ2l0aWdub3JlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uZ2l0aWdub3JlCmluZGV4IGZiNTE2MDNmZTQxOTguLjljYjMwNDgxMjhkNWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZQomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlLy5naXRpZ25vcmUKQEAgLTEsNCAmIzQzOzEsNiBAQAogIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5CiYjNDM7ZnVzZV9hY2xfY2FjaGVfdGVzdAogZnVzZV9tbnQKJiM0MztmdXNlX2VzdGFsZV90ZXN0CiBmdXNlY3RsX3Rlc3QKIHdyaXRlX2V4dGVuZF9lb2ZfdGVzdApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvTWFrZWZpbGUKaW5kZXggOTVhMWVlOTQ3Y2E3Ni4uZjU2NGNiMzdiM2E1YiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL01ha2VmaWxlCkBAIC02LDExICYjNDM7NiwxMiBAQCBURVNUX0dFTl9QUk9HUyA6PSBmdXNlY3RsX3Rlc3QKIFRFU1RfR0VOX1BST0dTICYjNDM7PSB3cml0ZV9leHRlbmRfZW9mX3Rlc3QKIFRFU1RfR0VOX0ZJTEVTIDo9IGZ1c2VfbW50CiAKLSMgZnVzZV9hY2xfY2FjaGVfdGVzdCByZXF1aXJlcyBsaWJmdXNlMzsgYWRkIGl0IG9ubHkgd2hlbiB0aGUgbGlicmFyeSBpcyBwcmVzZW50LgotQUNMX0NGTEFHUyA6PSAkKHNoZWxsIHBrZy1jb25maWcgZnVzZTMgLS1jZmxhZ3MgMiZndDsvZGV2L251bGwpCi1BQ0xfTERMSUJTIDo9ICQoc2hlbGwgcGtnLWNvbmZpZyBmdXNlMyAtLWxpYnMgMiZndDsvZGV2L251bGwpCi1pZm5lcSAoJChBQ0xfQ0ZMQUdTKSwpCiYjNDM7IyBUaGVzZSB0ZXN0cyByZXF1aXJlIGxpYmZ1c2UzOyBhZGQgdGhlbSBvbmx5IHdoZW4gdGhlIGxpYnJhcnkgaXMgcHJlc2VudC4KJiM0MztGVVNFM19DRkxBR1MgOj0gJChzaGVsbCBwa2ctY29uZmlnIGZ1c2UzIC0tY2ZsYWdzIDImZ3Q7L2Rldi9udWxsKQomIzQzO0ZVU0UzX0xETElCUyA6PSAkKHNoZWxsIHBrZy1jb25maWcgZnVzZTMgLS1saWJzIDImZ3Q7L2Rldi9udWxsKQomIzQzO2lmbmVxICgkKEZVU0UzX0NGTEFHUyksKQogVEVTVF9HRU5fUFJPR1MgJiM0Mzs9IGZ1c2VfYWNsX2NhY2hlX3Rlc3QKJiM0MztURVNUX0dFTl9QUk9HUyAmIzQzOz0gZnVzZV9lc3RhbGVfdGVzdAogZW5kaWYKIAogaW5jbHVkZSAuLi8uLi9saWIubWsKQEAgLTMwLDUgJiM0MzszMSw4IEBAIGVuZGlmCiAkKE9VVFBVVCkvZnVzZV9tbnQ6IENGTEFHUyAmIzQzOz0gJChWQVJfQ0ZMQUdTKQogJChPVVRQVVQpL2Z1c2VfbW50OiBMRExJQlMgJiM0Mzs9ICQoVkFSX0xETElCUykKIAotJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IENGTEFHUyAmIzQzOz0gJChBQ0xfQ0ZMQUdTKQotJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IExETElCUyAmIzQzOz0gJChBQ0xfTERMSUJTKQomIzQzOyQoT1VUUFVUKS9mdXNlX2FjbF9jYWNoZV90ZXN0OiBDRkxBR1MgJiM0Mzs9ICQoRlVTRTNfQ0ZMQUdTKQomIzQzOyQoT1VUUFVUKS9mdXNlX2FjbF9jYWNoZV90ZXN0OiBMRExJQlMgJiM0Mzs9ICQoRlVTRTNfTERMSUJTKQomIzQzOwomIzQzOyQoT1VUUFVUKS9mdXNlX2VzdGFsZV90ZXN0OiBDRkxBR1MgJiM0Mzs9ICQoRlVTRTNfQ0ZMQUdTKQomIzQzOyQoT1VUUFVUKS9mdXNlX2VzdGFsZV90ZXN0OiBMRExJQlMgJiM0Mzs9ICQoRlVTRTNfTERMSUJTKQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9mdXNlX2VzdGFsZV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL2Z1c2VfZXN0YWxlX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi44MmI4NDJkM2E1ZjdiCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9mdXNlX2VzdGFsZV90ZXN0LmMKQEAgLTAsMCAmIzQzOzEsNDUwIEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKgomIzQzOyAqIFRlc3Q6IGEgcmVxdWVzdCByZWZ1c2VkIGZvciBhbiBpbm9kZSB0aGUgY2xpZW50IHN0aWxsIGhvbGRzIGEgcmVmZXJlbmNlIHRvCiYjNDM7ICoKJiM0MzsgKiBGVVNFX09QRU4sIEZVU0VfR0VUQVRUUiwgRlVTRV9TRVRBVFRSLCBGVVNFX1JFQURMSU5LIGFuZCBGVVNFX1NUQVRGUyBjYXJyeSBhCiYjNDM7ICogbm9kZWlkIHJhdGhlciB0aGFuIGEgcGF0aC4gIFRoZSBjbGllbnQgb25seSBzZW5kcyB0aGVtIGZvciBhbiBpbm9kZSBpdCBoYXMKJiM0MzsgKiBhbHJlYWR5IGxvb2tlZCB1cCBhbmQgaG9sZHMgYSByZWZlcmVuY2UgdG8sIGFuZCBhIHNlcnZlciBvd2VzIHRoZSBjbGllbnQgdGhhdAomIzQzOyAqIGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuICBBIHNlcnZlciB0aGF0IGxldHMgdGhlIGlub2RlIGdvIGVhcmx5LAomIzQzOyAqIGFzIG9uZSBiYWNraW5nIGEgc2hhcmVkIGRpcmVjdG9yeSBkb2VzIHdoZW4gdGhlIG5hbWUgaXMgcmVuYW1lZCBvdmVyLCBhbnN3ZXJzCiYjNDM7ICogd2l0aCBFTk9FTlQuCiYjNDM7ICoKJiM0MzsgKiBPbiBhbiB1bmZpeGVkIGtlcm5lbCB0aGF0IEVOT0VOVCBpcyBwYXNzZWQgb3V0IHVuY2hhbmdlZC4gIFRoZSBwYXRoIHdhbGsgaGFzCiYjNDM7ICogbm8gcmVhc29uIHRvIGRvdWJ0IGl0IGFuZCB0aGUgY2FsbGVyIGlzIHRvbGQgYSBmaWxlIGlzIG1pc3Npbmcgd2hlbiBpdCBuZXZlcgomIzQzOyAqIHN0b3BwZWQgZXhpc3RpbmcuICBDYWxsZXJzIHRoYXQgcmVhZCBhIG1pc3NpbmcgZmlsZSBhcyBhbiBlbXB0eSBvbmUgYWN0IG9uCiYjNDM7ICogdGhlIGVtcHRpbmVzcy4KJiM0MzsgKgomIzQzOyAqIEZpeGVkIChmcy9mdXNlL2ZpbGUuYyBhbmQgZnMvZnVzZS9kaXIuYyk6IEVOT0VOVCBiZWNvbWVzIEVTVEFMRSwgd2hpY2gKJiM0MzsgKiBkZXNjcmliZXMgdGhlIGhhbmRsZSByYXRoZXIgdGhhbiB0aGUgbmFtZS4gIGZpbGVuYW1lX2xvb2t1cCgpIGFuZAomIzQzOyAqIGRvX2ZpbHBfb3BlbigpIGFscmVhZHkgcmV0cnkgd2l0aCBMT09LVVBfUkVWQUwgb24gRVNUQUxFLCBzbyB0aGUgbmFtZSBpcwomIzQzOyAqIHJlc29sdmVkIGFnYWluIGFuZCB0aGUgaW5vZGUgaXQgcmVmZXJzIHRvIG5vdyBpcyB1c2VkLiAgQSBuYW1lIHRoYXQgaGFzCiYjNDM7ICogZ2VudWluZWx5IGdvbmUgYXdheSBmYWlscyB0aGUgcmV0cmllZCBsb29rdXAsIHNvIEVOT0VOVCBzdGlsbCByZWFjaGVzIGEKJiM0MzsgKiBjYWxsZXIgdGhhdCBkZXNlcnZlcyBpdC4KJiM0MzsgKgomIzQzOyAqIE9ubHkgcmVxdWVzdHMgcmVhY2hhYmxlIHRocm91Z2ggYSBwYXRoIHdhbGsgYXJlIGNvdmVyZWQsIGJlY2F1c2UgdGhlIHJldHJ5CiYjNDM7ICogaXMgd2hhdCBtYWtlcyBFU1RBTEUgdXNlZnVsIGFuZCB0aGUgd2FsayBpcyB3aGF0IHBlcmZvcm1zIGl0LiAgQW4gb3BlcmF0aW9uCiYjNDM7ICogb24gYSBkZXNjcmlwdG9yIGFscmVhZHkgb3BlbiBoYXMgbm8gZXF1aXZhbGVudCByZWNvdmVyeS4KJiM0MzsgKgomIzQzOyAqIFRlc3Qgb3V0bGluZToKJiM0MzsgKiAgMS4gTW91bnQgYSBtaW5pbWFsIEZVU0UgZnMgaG9sZGluZyBvbmUgZmlsZS4KJiM0MzsgKiAgMi4gVGhlIHNlcnZlciByZWZ1c2VzIHRoZSBmaXJzdCByZXF1ZXN0IG9mIHRoZSBraW5kIHVuZGVyIHRlc3QgYW5kIGFsbG93cwomIzQzOyAqICAgICBldmVyeSBvbmUgYWZ0ZXIgaXQsIHN0YW5kaW5nIGluIGZvciBhIHNlcnZlciB0aGF0IHJlbGVhc2VkIHRoZSBpbm9kZSBhbmQKJiM0MzsgKiAgICAgaGFzIHNpbmNlIHJlc29sdmVkIHRoZSBuYW1lIGFnYWluLgomIzQzOyAqICAzLiBvcGVuYXQoKSB0aGUgZmlsZS4KJiM0MzsgKiAgICAgQnVnZ3k6ICBFTk9FTlQgcmVhY2hlcyB0aGUgY2FsbGVyLCBvbmUgb3BlbiB3YXMgYXNrZWQgZm9yLiAgRkFJTC4KJiM0MzsgKiAgICAgRml4ZWQ6ICB0aGUgd2FsayByZXRyaWVzLCB0aGUgc2Vjb25kIG9wZW4gaXMgYWxsb3dlZCwgdGhlIGRlc2NyaXB0b3IgaXMKJiM0MzsgKiAgICAgICAgICAgICByZXR1cm5lZCwgdHdvIG9wZW5zIHdlcmUgYXNrZWQgZm9yLiAgUEFTUy4KJiM0MzsgKiAgNC4gc3RhdCgpLCBjaG1vZCgpLCByZWFkbGluaygpIGFuZCBzdGF0ZnMoKSBieSBuYW1lLCB3aGljaCBhcmUgdGhlIHNhbWUKJiM0MzsgKiAgICAgcmVjb3ZlcnkgdGhyb3VnaCBGVVNFX0dFVEFUVFIsIEZVU0VfU0VUQVRUUiwgRlVTRV9SRUFETElOSyBhbmQKJiM0MzsgKiAgICAgRlVTRV9TVEFURlMuICBFYWNoIGlzIHJlYWNoZWQgdGhyb3VnaCBhIHBhdGggd2Fsaywgd2hpY2ggaXMgd2hhdCBtYWtlcwomIzQzOyAqICAgICB0aGUgcmV0cnkgYXZhaWxhYmxlLgomIzQzOyAqICA1LiBPcGVuIGEgbmFtZSB0aGUgc2VydmVyIGRvZXMgbm90IGhhdmUgYXQgYWxsLgomIzQzOyAqICAgICBCb3RoOiAgIEVOT0VOVCwgYmVjYXVzZSB0aGUgbG9va3VwIGZhaWxzIHJhdGhlciB0aGFuIHRoZSBvcGVuLCBhbmQgYQomIzQzOyAqICAgICAgICAgICAgIGZpbGUgdGhhdCBpcyBhYnNlbnQgbXVzdCBzdGlsbCBsb29rIGFic2VudC4KJiM0MzsgKi8KJiM0MzsKJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFCiYjNDM7I2RlZmluZSBGVVNFX1VTRV9WRVJTSU9OIDM0CiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2Vycm5vLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2Z1c2VfbG93bGV2ZWwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3B0aHJlYWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGJvb2wuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0dmZzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy92ZnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDsuLi8uLi9rc2VsZnRlc3RfaGFybmVzcy5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIEZJTEVfTkFNRQkmIzM0O2hlbGQmIzM0OwomIzQzOyNkZWZpbmUgTElOS19OQU1FCSYjMzQ7aGVsZC1saW5rJiMzNDsKJiM0MzsjZGVmaW5lIEFCU0VOVF9OQU1FCSYjMzQ7bm8tc3VjaC1maWxlJiMzNDsKJiM0MzsjZGVmaW5lIEZJTEVfSU5PCTIKJiM0MzsjZGVmaW5lIExJTktfSU5PCTMKJiM0MzsjZGVmaW5lIENPTlRFTlRTCSYjMzQ7cHJlc2VudFxuJiMzNDsKJiM0MzsjZGVmaW5lIExJTktfVEFSR0VUCUZJTEVfTkFNRQomIzQzOwomIzQzOy8qCiYjNDM7ICogV2hpY2ggcmVxdWVzdCB0aGUgc2VydmVyIHJlZnVzZXMsIGFuZCBob3cgbWFueSB0aW1lcy4gIFNoYXJlZCB3aXRoIHRoZQomIzQzOyAqIGRhZW1vbiB0aHJlYWQ7IG9uZSB0ZXN0IHJ1bnMgYXQgYSB0aW1lLCBzbyBwbGFpbiBpbnRzLgomIzQzOyAqCiYjNDM7ICogRXZlcnkgb25lIG9mIHRoZXNlIG5hbWVzIGFuIGlub2RlIGJ5IG5vZGVpZCByYXRoZXIgdGhhbiBieSBuYW1lLCBzbyBhCiYjNDM7ICogcmVmdXNhbCBvZiBhbnkgb2YgdGhlbSBpcyBkZXNjcmliaW5nIGEgaGFuZGxlIHJhdGhlciB0aGFuIGEgbWlzc2luZyBmaWxlLgomIzQzOyAqIEZVU0VfTE9PS1VQIGlzIGRlbGliZXJhdGVseSBhYnNlbnQ6IGl0IGNhcnJpZXMgYSBuYW1lLCBzbyBpdHMgRU5PRU5UIGlzIGFuCiYjNDM7ICogYW5zd2VyIHJhdGhlciB0aGFuIGEgZmF1bHQsIGFuZCBhYnNlbnRfbmFtZV9zdGlsbF9yZXBvcnRzX2Fic2VudCBjb3ZlcnMgaXQuCiYjNDM7ICovCiYjNDM7ZW51bSByZWZ1c2Vfd2hhdCB7CiYjNDM7CVJFRlVTRV9OT1RISU5HLAomIzQzOwlSRUZVU0VfT1BFTiwKJiM0MzsJUkVGVVNFX0dFVEFUVFIsCiYjNDM7CVJFRlVTRV9TRVRBVFRSLAomIzQzOwlSRUZVU0VfUkVBRExJTkssCiYjNDM7CVJFRlVTRV9TVEFURlMsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IHsKJiM0MzsJZW51bSByZWZ1c2Vfd2hhdCB3aGF0OwomIzQzOwlpbnQgcmVmdXNhbHNfbGVmdDsKJiM0MzsJaW50IG9wZW5zX3NlZW47CiYjNDM7CWludCBnZXRhdHRyc19zZWVuOwomIzQzOwlpbnQgc2V0YXR0cnNfc2VlbjsKJiM0MzsJaW50IHJlYWRsaW5rc19zZWVuOwomIzQzOwlpbnQgc3RhdGZzc19zZWVuOwomIzQzO30gZ19kczsKJiM0MzsKJiM0MzsvKiBUcnVlIG9uY2UsIGZvciB0aGUgcmVxdWVzdCB1bmRlciB0ZXN0LCBhbmQgdGhlbiBuZXZlciBhZ2Fpbi4gKi8KJiM0MztzdGF0aWMgYm9vbCByZWZ1c2Vfbm93KGVudW0gcmVmdXNlX3doYXQgd2hhdCkKJiM0Mzt7CiYjNDM7CWlmIChnX2RzLndoYXQgIT0gd2hhdCB8fCBnX2RzLnJlZnVzYWxzX2xlZnQgJmx0Oz0gMCkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJZ19kcy5yZWZ1c2Fsc19sZWZ0LS07CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBmaWxsX2F0dHIoZnVzZV9pbm9fdCBpbm8sIHN0cnVjdCBzdGF0ICpzdCkKJiM0Mzt7CiYjNDM7CW1lbXNldChzdCwgMCwgc2l6ZW9mKCpzdCkpOwomIzQzOwlzdC0mZ3Q7c3RfaW5vID0gaW5vOwomIzQzOwkvKgomIzQzOwkgKiBPd25lZCBieSB3aG9ldmVyIHJ1bnMgdGhlIHRlc3QsIHNvIHRoYXQgY2htb2QoKSBpcyBhIHJlcXVlc3QgdGhlCiYjNDM7CSAqIGtlcm5lbCB3aWxsIGNhcnJ5IHRocm91Z2ggdG8gdGhlIHNlcnZlciByYXRoZXIgdGhhbiByZWZ1c2UgaXRzZWxmLgomIzQzOwkgKi8KJiM0MzsJc3QtJmd0O3N0X3VpZCA9IGdldHVpZCgpOwomIzQzOwlzdC0mZ3Q7c3RfZ2lkID0gZ2V0Z2lkKCk7CiYjNDM7CWlmIChpbm8gPT0gRlVTRV9ST09UX0lEKSB7CiYjNDM7CQlzdC0mZ3Q7c3RfbW9kZSA9IFNfSUZESVIgfCAwNzU1OwomIzQzOwkJc3QtJmd0O3N0X25saW5rID0gMjsKJiM0MzsJfSBlbHNlIGlmIChpbm8gPT0gTElOS19JTk8pIHsKJiM0MzsJCXN0LSZndDtzdF9tb2RlID0gU19JRkxOSyB8IDA3Nzc7CiYjNDM7CQlzdC0mZ3Q7c3RfbmxpbmsgPSAxOwomIzQzOwkJc3QtJmd0O3N0X3NpemUgPSBzaXplb2YoTElOS19UQVJHRVQpIC0gMTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXN0LSZndDtzdF9tb2RlID0gU19JRlJFRyB8IDA2NDQ7CiYjNDM7CQlzdC0mZ3Q7c3RfbmxpbmsgPSAxOwomIzQzOwkJc3QtJmd0O3N0X3NpemUgPSBzaXplb2YoQ09OVEVOVFMpIC0gMTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0X2xvb2t1cChmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZnVzZV9lbnRyeV9wYXJhbSBlOwomIzQzOwlmdXNlX2lub190IGlubzsKJiM0MzsKJiM0MzsJaWYgKHBhcmVudCAhPSBGVVNFX1JPT1RfSUQpCiYjNDM7CQlpbm8gPSAwOwomIzQzOwllbHNlIGlmICghc3RyY21wKG5hbWUsIEZJTEVfTkFNRSkpCiYjNDM7CQlpbm8gPSBGSUxFX0lOTzsKJiM0MzsJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCBMSU5LX05BTUUpKQomIzQzOwkJaW5vID0gTElOS19JTk87CiYjNDM7CWVsc2UKJiM0MzsJCWlubyA9IDA7CiYjNDM7CiYjNDM7CWlmICghaW5vKSB7CiYjNDM7CQlmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJbWVtc2V0KCZhbXA7ZSwgMCwgc2l6ZW9mKGUpKTsKJiM0MzsJZS5pbm8gPSBpbm87CiYjNDM7CWUuYXR0cl90aW1lb3V0ID0gMDsKJiM0MzsJZS5lbnRyeV90aW1lb3V0ID0gMDsKJiM0MzsJZmlsbF9hdHRyKGlubywgJmFtcDtlLmF0dHIpOwomIzQzOwlmdXNlX3JlcGx5X2VudHJ5KHJlcSwgJmFtcDtlKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdF9nZXRhdHRyKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubywKJiM0MzsJCSAgICAgIHN0cnVjdCBmdXNlX2ZpbGVfaW5mbyAqZmkpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc3RhdCBzdDsKJiM0MzsKJiM0MzsJKHZvaWQpZmk7CiYjNDM7CS8qIFRoZSByb290IGlzIGxlZnQgYWxvbmU7IHJlZnVzaW5nIGl0IHdvdWxkIGJyZWFrIHRoZSBtb3VudCBpdHNlbGYuICovCiYjNDM7CWlmIChpbm8gPT0gRklMRV9JTk8pIHsKJiM0MzsJCWdfZHMuZ2V0YXR0cnNfc2VlbiYjNDM7JiM0Mzs7CiYjNDM7CQlpZiAocmVmdXNlX25vdyhSRUZVU0VfR0VUQVRUUikpIHsKJiM0MzsJCQlmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7CiYjNDM7CQkJcmV0dXJuOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CWZpbGxfYXR0cihpbm8sICZhbXA7c3QpOwomIzQzOwlmdXNlX3JlcGx5X2F0dHIocmVxLCAmYW1wO3N0LCAwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdF9vcGVuKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubywgc3RydWN0IGZ1c2VfZmlsZV9pbmZvICpmaSkKJiM0Mzt7CiYjNDM7CWlmIChpbm8gIT0gRklMRV9JTk8pIHsKJiM0MzsJCWZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwomIzQzOwlnX2RzLm9wZW5zX3NlZW4mIzQzOyYjNDM7OwomIzQzOwlpZiAocmVmdXNlX25vdyhSRUZVU0VfT1BFTikpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBUaGUgaW5vZGUgaXMgZ29uZSBhcyBmYXIgYXMgdGhpcyBzZXJ2ZXIgaXMgY29uY2VybmVkLCBldmVuCiYjNDM7CQkgKiB0aG91Z2ggdGhlIGNsaWVudCBpcyBob2xkaW5nIGEgcmVmZXJlbmNlIHRvIGl0IGFuZCBhc2tlZCBieQomIzQzOwkJICogbm9kZWlkIHJhdGhlciB0aGFuIGJ5IG5hbWUuCiYjNDM7CQkgKi8KJiM0MzsJCWZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwlmdXNlX3JlcGx5X29wZW4ocmVxLCBmaSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRfcmVhZChmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8sIHNpemVfdCBzaXplLCBvZmZfdCBvZmYsCiYjNDM7CQkgICBzdHJ1Y3QgZnVzZV9maWxlX2luZm8gKmZpKQomIzQzO3sKJiM0MzsJc2l6ZV90IGxlbiA9IHNpemVvZihDT05URU5UUykgLSAxOwomIzQzOwomIzQzOwkodm9pZClmaTsKJiM0MzsJaWYgKGlubyAhPSBGSUxFX0lOTykgewomIzQzOwkJZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CWlmICgoc2l6ZV90KW9mZiAmZ3Q7PSBsZW4pIHsKJiM0MzsJCWZ1c2VfcmVwbHlfYnVmKHJlcSwgTlVMTCwgMCk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsJaWYgKG9mZiAmIzQzOyBzaXplICZndDsgbGVuKQomIzQzOwkJc2l6ZSA9IGxlbiAtIG9mZjsKJiM0MzsJZnVzZV9yZXBseV9idWYocmVxLCBDT05URU5UUyAmIzQzOyBvZmYsIHNpemUpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0X3NldGF0dHIoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgaW5vLCBzdHJ1Y3Qgc3RhdCAqYXR0ciwKJiM0MzsJCSAgICAgIGludCB0b19zZXQsIHN0cnVjdCBmdXNlX2ZpbGVfaW5mbyAqZmkpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc3RhdCBzdDsKJiM0MzsKJiM0MzsJKHZvaWQpYXR0cjsKJiM0MzsJKHZvaWQpdG9fc2V0OwomIzQzOwkodm9pZClmaTsKJiM0MzsJaWYgKGlubyA9PSBGSUxFX0lOTykgewomIzQzOwkJZ19kcy5zZXRhdHRyc19zZWVuJiM0MzsmIzQzOzsKJiM0MzsJCWlmIChyZWZ1c2Vfbm93KFJFRlVTRV9TRVRBVFRSKSkgewomIzQzOwkJCWZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTsKJiM0MzsJCQlyZXR1cm47CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJZmlsbF9hdHRyKGlubywgJmFtcDtzdCk7CiYjNDM7CWZ1c2VfcmVwbHlfYXR0cihyZXEsICZhbXA7c3QsIDApOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0X3JlYWRsaW5rKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubykKJiM0Mzt7CiYjNDM7CWlmIChpbm8gIT0gTElOS19JTk8pIHsKJiM0MzsJCWZ1c2VfcmVwbHlfZXJyKHJlcSwgRUlOVkFMKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwomIzQzOwlnX2RzLnJlYWRsaW5rc19zZWVuJiM0MzsmIzQzOzsKJiM0MzsJaWYgKHJlZnVzZV9ub3coUkVGVVNFX1JFQURMSU5LKSkgewomIzQzOwkJZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CWZ1c2VfcmVwbHlfcmVhZGxpbmsocmVxLCBMSU5LX1RBUkdFVCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRfc3RhdGZzKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzdGF0dmZzIHNmczsKJiM0MzsKJiM0MzsJKHZvaWQpaW5vOwomIzQzOwlnX2RzLnN0YXRmc3Nfc2VlbiYjNDM7JiM0Mzs7CiYjNDM7CWlmIChyZWZ1c2Vfbm93KFJFRlVTRV9TVEFURlMpKSB7CiYjNDM7CQlmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJbWVtc2V0KCZhbXA7c2ZzLCAwLCBzaXplb2Yoc2ZzKSk7CiYjNDM7CXNmcy5mX2JzaXplID0gNTEyOwomIzQzOwlzZnMuZl9mcnNpemUgPSA1MTI7CiYjNDM7CXNmcy5mX25hbWVtYXggPSBOQU1FX01BWDsKJiM0MzsJZnVzZV9yZXBseV9zdGF0ZnMocmVxLCAmYW1wO3Nmcyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgZnVzZV9sb3dsZXZlbF9vcHMgZnNfb3BzID0gewomIzQzOwkubG9va3VwCQk9IHRfbG9va3VwLAomIzQzOwkuZ2V0YXR0cgk9IHRfZ2V0YXR0ciwKJiM0MzsJLnNldGF0dHIJPSB0X3NldGF0dHIsCiYjNDM7CS5yZWFkbGluawk9IHRfcmVhZGxpbmssCiYjNDM7CS5zdGF0ZnMJCT0gdF9zdGF0ZnMsCiYjNDM7CS5vcGVuCQk9IHRfb3BlbiwKJiM0MzsJLnJlYWQJCT0gdF9yZWFkLAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKnJ1bl9kYWVtb24odm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJZnVzZV9zZXNzaW9uX2xvb3AoKHN0cnVjdCBmdXNlX3Nlc3Npb24gKilhcmcpOwomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLS0tLSBrc2VsZnRlc3QgaGFybmVzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KJiM0MzsKJiM0MztGSVhUVVJFKG9wZW5fZXN0YWxlKSB7CiYjNDM7CXN0cnVjdCBmdXNlX3Nlc3Npb24gKnNlOwomIzQzOwljaGFyICAgICAgICAgICAgICAgICBtb3VudHBvaW50W1BBVEhfTUFYXTsKJiM0MzsJY2hhciAgICAgICAgICAgICAgICAgZmlsZV9wYXRoW1BBVEhfTUFYXTsKJiM0MzsJY2hhciAgICAgICAgICAgICAgICAgbGlua19wYXRoW1BBVEhfTUFYXTsKJiM0MzsJY2hhciAgICAgICAgICAgICAgICAgYWJzZW50X3BhdGhbUEFUSF9NQVhdOwomIzQzOwlwdGhyZWFkX3QgICAgICAgICAgICB0aHJlYWQ7CiYjNDM7fTsKJiM0MzsKJiM0MztGSVhUVVJFX1NFVFVQKG9wZW5fZXN0YWxlKQomIzQzO3sKJiM0MzsJY2hhciAqZnVzZV9hcmd2W10gPSB7ICYjMzQ7ZnVzZV9lc3RhbGVfdGVzdCYjMzQ7LCBOVUxMIH07CiYjNDM7CXN0cnVjdCBmdXNlX2FyZ3MgYXJncyA9IEZVU0VfQVJHU19JTklUKDEsIGZ1c2VfYXJndik7CiYjNDM7CiYjNDM7CW1lbXNldCgmYW1wO2dfZHMsIDAsIHNpemVvZihnX2RzKSk7CiYjNDM7CWdfZHMud2hhdCA9IFJFRlVTRV9OT1RISU5HOwomIzQzOwlnX2RzLnJlZnVzYWxzX2xlZnQgPSAxOwomIzQzOwomIzQzOwlzdHJjcHkoc2VsZi0mZ3Q7bW91bnRwb2ludCwgJiMzNDsvdG1wL29wZW5fZXN0YWxlX3Rlc3RfWFhYWFhYJiMzNDspOwomIzQzOwlpZiAoIW1rZHRlbXAoc2VsZi0mZ3Q7bW91bnRwb2ludCkpCiYjNDM7CQlTS0lQKHJldHVybiwgJiMzNDtta2R0ZW1wOiAlcyYjMzQ7LCBzdHJlcnJvcihlcnJubykpOwomIzQzOwomIzQzOwlzbnByaW50ZihzZWxmLSZndDtmaWxlX3BhdGgsIHNpemVvZihzZWxmLSZndDtmaWxlX3BhdGgpLAomIzQzOwkJICYjMzQ7JXMvJiMzNDsgRklMRV9OQU1FLCBzZWxmLSZndDttb3VudHBvaW50KTsKJiM0MzsJc25wcmludGYoc2VsZi0mZ3Q7bGlua19wYXRoLCBzaXplb2Yoc2VsZi0mZ3Q7bGlua19wYXRoKSwKJiM0MzsJCSAmIzM0OyVzLyYjMzQ7IExJTktfTkFNRSwgc2VsZi0mZ3Q7bW91bnRwb2ludCk7CiYjNDM7CXNucHJpbnRmKHNlbGYtJmd0O2Fic2VudF9wYXRoLCBzaXplb2Yoc2VsZi0mZ3Q7YWJzZW50X3BhdGgpLAomIzQzOwkJICYjMzQ7JXMvJiMzNDsgQUJTRU5UX05BTUUsIHNlbGYtJmd0O21vdW50cG9pbnQpOwomIzQzOwomIzQzOwlzZWxmLSZndDtzZSA9IGZ1c2Vfc2Vzc2lvbl9uZXcoJmFtcDthcmdzLCAmYW1wO2ZzX29wcywgc2l6ZW9mKGZzX29wcyksIE5VTEwpOwomIzQzOwlpZiAoIXNlbGYtJmd0O3NlKSB7CiYjNDM7CQlybWRpcihzZWxmLSZndDttb3VudHBvaW50KTsKJiM0MzsJCVNLSVAocmV0dXJuLCAmIzM0O2Z1c2Vfc2Vzc2lvbl9uZXcgZmFpbGVkJiMzNDspOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChmdXNlX3Nlc3Npb25fbW91bnQoc2VsZi0mZ3Q7c2UsIHNlbGYtJmd0O21vdW50cG9pbnQpKSB7CiYjNDM7CQlmdXNlX3Nlc3Npb25fZGVzdHJveShzZWxmLSZndDtzZSk7CiYjNDM7CQlybWRpcihzZWxmLSZndDttb3VudHBvaW50KTsKJiM0MzsJCVNLSVAocmV0dXJuLCAmIzM0O2Z1c2Vfc2Vzc2lvbl9tb3VudCBmYWlsZWQgKG5vIGZ1c2VybW91bnQzIG9yIG5vIHByaXZpbGVnZXMpJiMzNDspOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChwdGhyZWFkX2NyZWF0ZSgmYW1wO3NlbGYtJmd0O3RocmVhZCwgTlVMTCwgcnVuX2RhZW1vbiwgc2VsZi0mZ3Q7c2UpKSB7CiYjNDM7CQlmdXNlX3Nlc3Npb25fdW5tb3VudChzZWxmLSZndDtzZSk7CiYjNDM7CQlmdXNlX3Nlc3Npb25fZGVzdHJveShzZWxmLSZndDtzZSk7CiYjNDM7CQlybWRpcihzZWxmLSZndDttb3VudHBvaW50KTsKJiM0MzsJCVNLSVAocmV0dXJuLCAmIzM0O3B0aHJlYWRfY3JlYXRlOiAlcyYjMzQ7LCBzdHJlcnJvcihlcnJubykpOwomIzQzOwl9CiYjNDM7CiYjNDM7CWZ1c2Vfb3B0X2ZyZWVfYXJncygmYW1wO2FyZ3MpOwomIzQzO30KJiM0MzsKJiM0MztGSVhUVVJFX1RFQVJET1dOKG9wZW5fZXN0YWxlKQomIzQzO3sKJiM0MzsJZnVzZV9zZXNzaW9uX2V4aXQoc2VsZi0mZ3Q7c2UpOwomIzQzOwlmdXNlX3Nlc3Npb25fdW5tb3VudChzZWxmLSZndDtzZSk7CiYjNDM7CXB0aHJlYWRfam9pbihzZWxmLSZndDt0aHJlYWQsIE5VTEwpOwomIzQzOwlmdXNlX3Nlc3Npb25fZGVzdHJveShzZWxmLSZndDtzZSk7CiYjNDM7CXJtZGlyKHNlbGYtJmd0O21vdW50cG9pbnQpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfb3Blbl9pc19yZXRyaWVkKQomIzQzO3sKJiM0MzsJaW50IGZkOwomIzQzOwomIzQzOwlnX2RzLndoYXQgPSBSRUZVU0VfT1BFTjsKJiM0MzsKJiM0MzsJZmQgPSBvcGVuKHNlbGYtJmd0O2ZpbGVfcGF0aCwgT19SRE9OTFkpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgcmVmdXNhbCBkZXNjcmliZXMgYSBoYW5kbGUgdGhlIHNlcnZlciBzaG91bGQgaGF2ZSBob25vdXJlZCwgc28KJiM0MzsJICogdGhlIHdhbGsgaXMgZW50aXRsZWQgdG8gcmVzb2x2ZSB0aGUgbmFtZSBhZ2FpbiBhbmQgb3BlbiB3aGF0IGl0CiYjNDM7CSAqIHJlZmVycyB0byBub3cuIFJlcG9ydGluZyB0aGUgZmlsZSBtaXNzaW5nIGluc3RlYWQgZW5kcyB0aGUgd2Fsay4KJiM0MzsJICovCiYjNDM7CUFTU0VSVF9HRShmZCwgMCkgewomIzQzOwkJVEhfTE9HKCYjMzQ7b3BlbiBmYWlsZWQgd2l0aCAlcyBhZnRlciAlZCBvcGVuIHJlcXVlc3QocykmIzM0OywKJiM0MzsJCSAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMub3BlbnNfc2Vlbik7CiYjNDM7CX0KJiM0MzsJRVhQRUNUX0VRKDIsIGdfZHMub3BlbnNfc2Vlbik7CiYjNDM7CWNsb3NlKGZkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX2dldGF0dHJfb25fcGF0aF9pc19yZXRyaWVkKQomIzQzO3sKJiM0MzsJc3RydWN0IHN0YXQgc3Q7CiYjNDM7CiYjNDM7CWdfZHMud2hhdCA9IFJFRlVTRV9HRVRBVFRSOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBSZWFjaGVkIGJ5IG5hbWUsIHNvIHRoZSB3YWxrIGNhbiByZXNvbHZlIGl0IGFnYWluIGFuZCBhc2sgYSBzZWNvbmQKJiM0MzsJICogdGltZSwgdGhlIHNhbWUgcmVjb3ZlcnkgdGhlIG9wZW4gZ2V0cy4KJiM0MzsJICovCiYjNDM7CUFTU0VSVF9FUSgwLCBzdGF0KHNlbGYtJmd0O2ZpbGVfcGF0aCwgJmFtcDtzdCkpIHsKJiM0MzsJCVRIX0xPRygmIzM0O3N0YXQgZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgZ2V0YXR0ciByZXF1ZXN0KHMpJiMzNDssCiYjNDM7CQkgICAgICAgc3RyZXJyb3IoZXJybm8pLCBnX2RzLmdldGF0dHJzX3NlZW4pOwomIzQzOwl9CiYjNDM7CUVYUEVDVF9HVChnX2RzLmdldGF0dHJzX3NlZW4sIDEpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfc2V0YXR0cl9vbl9wYXRoX2lzX3JldHJpZWQpCiYjNDM7ewomIzQzOwlnX2RzLndoYXQgPSBSRUZVU0VfU0VUQVRUUjsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogY2htb2QoKSByZWFjaGVzIHRoZSBpbm9kZSBieSBuYW1lLCBzbyB0aGUgc2FtZSByZXRyeSBhcHBsaWVzOiB0aGUKJiM0MzsJICogcmVmdXNhbCBkZXNjcmliZXMgYSBoYW5kbGUgYW5kIHRoZSB3YWxrIG1heSByZXNvbHZlIHRoZSBuYW1lIGFnYWluLgomIzQzOwkgKi8KJiM0MzsJQVNTRVJUX0VRKDAsIGNobW9kKHNlbGYtJmd0O2ZpbGVfcGF0aCwgMDYwMCkpIHsKJiM0MzsJCVRIX0xPRygmIzM0O2NobW9kIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHNldGF0dHIgcmVxdWVzdChzKSYjMzQ7LAomIzQzOwkJICAgICAgIHN0cmVycm9yKGVycm5vKSwgZ19kcy5zZXRhdHRyc19zZWVuKTsKJiM0MzsJfQomIzQzOwlFWFBFQ1RfR1QoZ19kcy5zZXRhdHRyc19zZWVuLCAxKTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX3JlYWRsaW5rX29uX3BhdGhfaXNfcmV0cmllZCkKJiM0Mzt7CiYjNDM7CWNoYXIgYnVmW1BBVEhfTUFYXTsKJiM0MzsJc3NpemVfdCBuOwomIzQzOwomIzQzOwlnX2RzLndoYXQgPSBSRUZVU0VfUkVBRExJTks7CiYjNDM7CiYjNDM7CW4gPSByZWFkbGluayhzZWxmLSZndDtsaW5rX3BhdGgsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKTsKJiM0MzsJQVNTRVJUX0dFKG4sIDApIHsKJiM0MzsJCVRIX0xPRygmIzM0O3JlYWRsaW5rIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHJlYWRsaW5rIHJlcXVlc3QocykmIzM0OywKJiM0MzsJCSAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMucmVhZGxpbmtzX3NlZW4pOwomIzQzOwl9CiYjNDM7CWJ1ZltuXSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJRVhQRUNUX1NUUkVRKExJTktfVEFSR0VULCBidWYpOwomIzQzOwlFWFBFQ1RfR1QoZ19kcy5yZWFkbGlua3Nfc2VlbiwgMSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihvcGVuX2VzdGFsZSwgcmVmdXNlZF9zdGF0ZnNfb25fcGF0aF9pc19yZXRyaWVkKQomIzQzO3sKJiM0MzsJc3RydWN0IHN0YXRmcyBzZnM7CiYjNDM7CiYjNDM7CWdfZHMud2hhdCA9IFJFRlVTRV9TVEFURlM7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIHN0YXRmcygpIGRlc2NyaWJlcyB0aGUgbW91bnQgcmF0aGVyIHRoYW4gdGhlIGZpbGUsIGJ1dCBpdCBpcyBzdGlsbAomIzQzOwkgKiByZWFjaGVkIHRocm91Z2ggYSBwYXRoIHdhbGssIHNvIGEgcmVmdXNhbCB0aGF0IG5hbWVzIGEgaGFuZGxlIGlzCiYjNDM7CSAqIHJldHJpZWQgdGhlIHNhbWUgd2F5LgomIzQzOwkgKi8KJiM0MzsJQVNTRVJUX0VRKDAsIHN0YXRmcyhzZWxmLSZndDtmaWxlX3BhdGgsICZhbXA7c2ZzKSkgewomIzQzOwkJVEhfTE9HKCYjMzQ7c3RhdGZzIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHN0YXRmcyByZXF1ZXN0KHMpJiMzNDssCiYjNDM7CQkgICAgICAgc3RyZXJyb3IoZXJybm8pLCBnX2RzLnN0YXRmc3Nfc2Vlbik7CiYjNDM7CX0KJiM0MzsJRVhQRUNUX0dUKGdfZHMuc3RhdGZzc19zZWVuLCAxKTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKG9wZW5fZXN0YWxlLCBhYnNlbnRfbmFtZV9zdGlsbF9yZXBvcnRzX2Fic2VudCkKJiM0Mzt7CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogSGVyZSBpdCBpcyB0aGUgbG9va3VwIHRoYXQgZmFpbHMgcmF0aGVyIHRoYW4gdGhlIG9wZW4sIHNvIG5vdGhpbmcgaXMKJiM0MzsJICogYmVpbmcgZGVzY3JpYmVkIGFzIHN0YWxlIGFuZCB0aGUgY2FsbGVyIG11c3Qgc3RpbGwgYmUgdG9sZCB0aGUgbmFtZQomIzQzOwkgKiBpcyBub3QgdGhlcmUuCiYjNDM7CSAqLwomIzQzOwlmZCA9IG9wZW4oc2VsZi0mZ3Q7YWJzZW50X3BhdGgsIE9fUkRPTkxZKTsKJiM0MzsJQVNTRVJUX0xUKGZkLCAwKTsKJiM0MzsJRVhQRUNUX0VRKEVOT0VOVCwgZXJybm8pOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0hBUk5FU1NfTUFJTgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAwMDowNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDEzMgoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDE0NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhpcyBQYXRjaCBTZXJpZXMgZm9yIEZ1enppbmcgUG90ZW50aWFsKioKCk9rYXksIHNvIHRoZSB0YXNrIGF0IGhhbmQgaXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgTGludXgga2VybmVsIHBhdGNoIHNlcmllcyBtZXJpdHMgZnV6emluZyBhdHRlbnRpb24uIEFuZCBpZiBpdCBkb2VzLCB0aGUgbmV4dCBzdGVwIGlzIHRvIHBpbnBvaW50IHRoZSBjcnVjaWFsIGBGb2N1c1N5bWJvbHNgIGFuZCBgRW5hYmxlQ29uZmlnc2AgdGhhdCB3aWxsIG1ha2UgZnV6emluZyBtb3N0IGVmZmVjdGl2ZS4gTGV0JiMzOTtzIGRpZyBpbi4gVGhlIGluaXRpYWwgZ2xhbmNlIGF0IHRoZSBwYXRjaCByZXZlYWxzIGl0cyBzY29wZTogaXQmIzM5O3MgcGxheWluZyBpbiB0aGUgYGZzL2Z1c2VgIGRpcmVjdG9yeSwgdG91Y2hpbmcgYGRpci5jYCwgYGZpbGUuY2AsIGBmdXNlX2kuaGAsIGBpbm9kZS5jYCwgYW5kIGB2aXJ0aW9fZnMuY2AsIHBsdXMgYSBjaHVuayBvZiB0aGUgc2VsZi10ZXN0cyBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uLi5gLiBUaGlzIHRlbGxzIG1lIHdlJiMzOTtyZSBsb29raW5nIGF0IHBvdGVudGlhbGx5IHNlbnNpdGl2ZSBmaWxlc3lzdGVtIGludGVyYWN0aW9ucyB3aXRoaW4gdGhlIEZVU0UgKEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlKSBjb250ZXh0LCB3aGljaCBpcyBkZWZpbml0ZWx5IHNvbWV0aGluZyBJIHdhbnQgdG8gdGFrZSBhIGNsb3NlciBsb29rIGF0LgoKTm93LCBpdCYjMzk7cyB0aW1lIHRvIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzOiBJJiMzOTtsbCBzdGFydCBieSBleGFtaW5pbmcgdGhlIHJlbGV2YW50IGBLY29uZmlnYCBmaWxlcy4gVGhhdCYjMzk7cyB0aGUgZ28tdG8gZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGRlcGVuZGVuY2llcyBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zIGF0IHBsYXkuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzIHRvIHVzZSBteSBncmVwcGVyIG9yIHBlcmhhcHMgYSBxdWljayBgcmVhZC1maWxlYCB0byBnZXQgYSBoYW5kbGUgb24gd2hhdCYjMzk7cyBhdmFpbGFibGUgYW5kIGNvbmRpdGlvbmFsIG9uIHRoaXMgc2VjdGlvbiBvZiBjb2RlLiBUaGUgYWltIGlzIHRvIHVuZGVyc3RhbmQgd2hhdCBidWlsZCBmbGFncyBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSByZWxldmFudCBhbmQgaG93IHRoZXkgbWlnaHQgaW5mbHVlbmNlIHRoZSBhdHRhY2sgc3VyZmFjZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAwMDowNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtGVVNFX0ZTJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZnVzZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9mdXNlL0tjb25maWctMS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbmZzL2Z1c2UvS2NvbmZpZzoyOmNvbmZpZyBGVVNFX0ZTXG5mcy9mdXNlL0tjb25maWctMy1cdHRyaXN0YXRlIFwmIzM0O0ZVU0UgKEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlKSBzdXBwb3J0XCYjMzQ7XG4tLVxuZnMvZnVzZS9LY29uZmlnPTIyPWNvbmZpZyBDVVNFXG5mcy9mdXNlL0tjb25maWctMjMtXHR0cmlzdGF0ZSBcJiMzNDtDaGFyYWN0ZXIgZGV2aWNlIGluIFVzZXJzcGFjZSBzdXBwb3J0XCYjMzQ7XG5mcy9mdXNlL0tjb25maWc6MjQ6XHRkZXBlbmRzIG9uIEZVU0VfRlNcbmZzL2Z1c2UvS2NvbmZpZy0yNS1cdGhlbHBcbi0tXG5mcy9mdXNlL0tjb25maWc9MzI9Y29uZmlnIFZJUlRJT19GU1xuZnMvZnVzZS9LY29uZmlnLTMzLVx0dHJpc3RhdGUgXCYjMzQ7VmlydGlvIEZpbGVzeXN0ZW1cJiMzNDtcbmZzL2Z1c2UvS2NvbmZpZzozNDpcdGRlcGVuZHMgb24gRlVTRV9GU1xuZnMvZnVzZS9LY29uZmlnLTM1LVx0c2VsZWN0IFZJUlRJT1xuLS1cbmZzL2Z1c2UvS2NvbmZpZz01Nz1jb25maWcgRlVTRV9QQVNTVEhST1VHSFxuLS1cbmZzL2Z1c2UvS2NvbmZpZy01OS1cdGRlZmF1bHQgeVxuZnMvZnVzZS9LY29uZmlnOjYwOlx0ZGVwZW5kcyBvbiBGVVNFX0ZTXG5mcy9mdXNlL0tjb25maWctNjEtXHRzZWxlY3QgRlNfU1RBQ0tcbi0tXG5mcy9mdXNlL0tjb25maWc9Njg9Y29uZmlnIEZVU0VfSU9fVVJJTkdcbi0tXG5mcy9mdXNlL0tjb25maWctNzAtXHRkZWZhdWx0IHlcbmZzL2Z1c2UvS2NvbmZpZzo3MTpcdGRlcGVuZHMgb24gRlVTRV9GU1xuZnMvZnVzZS9LY29uZmlnLTcyLVx0ZGVwZW5kcyBvbiBJT19VUklOR1xuLS1cbmZzL2Z1c2UvTWFrZWZpbGU9Nz1jY2ZsYWdzLXkgPSAtSSQoc3JjKVxuZnMvZnVzZS9NYWtlZmlsZS04LVxuZnMvZnVzZS9NYWtlZmlsZTo5Om9iai0kKENPTkZJR19GVVNFX0ZTKSAmIzQzOz0gZnVzZS5vXG5mcy9mdXNlL01ha2VmaWxlLTEwLW9iai0kKENPTkZJR19DVVNFKSAmIzQzOz0gY3VzZS5vXG4tLVxuZnMvZnVzZS9kaXIuYz0xOTQ2PXN0YXRpYyBpbnQgZnVzZV9kaXJfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCxcbi0tXG5mcy9mdXNlL2Rpci5jLTE5NTktXHRpbm9kZV9sb2NrKGlub2RlKTtcbmZzL2Z1c2UvZGlyLmM6MTk2MDpcdGVyciA9IGZ1c2VfZnN5bmNfY29tbW9uKGZpbGUsIHN0YXJ0LCBlbmQsIGRhdGFzeW5jLCBGVVNFX0ZTWU5DRElSKTtcbmZzL2Z1c2UvZGlyLmMtMTk2MS1cdGlmIChlcnIgPT0gLUVOT1NZUykge1xuLS1cbmZzL2Z1c2UvZmlsZS5jPTUzMT1pbnQgZnVzZV9mc3luY19jb21tb24oc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCxcbi0tXG5mcy9mdXNlL2ZpbGUuYy01NDEtXHRpbmFyZy5maCA9IGZmLVx1MDAzZWZoO1xuZnMvZnVzZS9maWxlLmM6NTQyOlx0aW5hcmcuZnN5bmNfZmxhZ3MgPSBkYXRhc3luYyA/IEZVU0VfRlNZTkNfRkRBVEFTWU5DIDogMDtcbmZzL2Z1c2UvZmlsZS5jLTU0My1cdGFyZ3Mub3Bjb2RlID0gb3Bjb2RlO1xuLS1cbmZzL2Z1c2UvZmlsZS5jPTU1MT1zdGF0aWMgaW50IGZ1c2VfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCxcbi0tXG5mcy9mdXNlL2ZpbGUuYy01ODktXG5mcy9mdXNlL2ZpbGUuYzo1OTA6XHRlcnIgPSBmdXNlX2ZzeW5jX2NvbW1vbihmaWxlLCBzdGFydCwgZW5kLCBkYXRhc3luYywgRlVTRV9GU1lOQyk7XG5mcy9mdXNlL2ZpbGUuYy01OTEtXHRpZiAoZXJyID09IC1FTk9TWVMpIHtcbi0tXG5mcy9mdXNlL2Z1c2VfdHJhY2UuaC0yNy1cdEVNKCBGVVNFX1JFTEVBU0UsXHRcdFwmIzM0O0ZVU0VfUkVMRUFTRVwmIzM0OylcdFx0XFxcbmZzL2Z1c2UvZnVzZV90cmFjZS5oOjI4Olx0RU0oIEZVU0VfRlNZTkMsXHRcdFx0XCYjMzQ7RlVTRV9GU1lOQ1wmIzM0OylcdFx0XFxcbmZzL2Z1c2UvZnVzZV90cmFjZS5oLTI5LVx0RU0oIEZVU0VfU0VUWEFUVFIsXHRcdFwmIzM0O0ZVU0VfU0VUWEFUVFJcJiMzNDspXHRcXFxuLS1cbmZzL2Z1c2UvZnVzZV90cmFjZS5oLTM3LVx0RU0oIEZVU0VfUkVMRUFTRURJUixcdFx0XCYjMzQ7RlVTRV9SRUxFQVNFRElSXCYjMzQ7KVx0XFxcbmZzL2Z1c2UvZnVzZV90cmFjZS5oOjM4Olx0RU0oIEZVU0VfRlNZTkNESVIsXHRcdFwmIzM0O0ZVU0VfRlNZTkNESVJcJiMzNDspXHRcXFxuZnMvZnVzZS9mdXNlX3RyYWNlLmgtMzktXHRFTSggRlVTRV9HRVRMSyxcdFx0XHRcJiMzNDtGVVNFX0dFVExLXCYjMzQ7KVx0XHRcXFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDAwOjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExNjE2CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gdGhlIEZVU0UgS2VybmVsIE1vZHVsZSBDb25maWd1cmF0aW9uKioKClJpZ2h0LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gTGV0JiMzOTtzIHNlZSB3aGF0JiMzOTtzIGFjdHVhbGx5IGdvaW5nIG9uIHdpdGggdGhlIEZVU0Uga2VybmVsIG1vZHVsZSBidWlsZCBhbmQgY29uZmlndXJhdGlvbi4gTXkgaW5pdGlhbCBzdGVwIGlzIGFsd2F5cyB0byBnbyBzdHJhaWdodCB0byB0aGUgc291cmNlLiBJJiMzOTttIHRoaW5raW5nIEkmIzM5O2xsIHN0YXJ0IGJ5IGNoZWNraW5nIHRoZSBgZnMvZnVzZS9LY29uZmlnYCBmaWxlLiBUaGF0JiMzOTtzIHdoZXJlIGFsbCB0aGUgYnVpbGQtdGltZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIEZVU0Ugc2hvdWxkIGJlIGRlZmluZWQg4oCTIHRoaW5ncyBsaWtlIHdoZXRoZXIgaXQmIzM5O3MgYnVpbHQtaW4sIGEgbW9kdWxlLCBmZWF0dXJlcyB0byBlbmFibGUgb3IgZGlzYWJsZSwgYW5kIHNvIG9uLiBVbmRlcnN0YW5kaW5nIHRoZSBLY29uZmlnIG9wdGlvbnMgaXMgZnVuZGFtZW50YWwgdG8gY29uZmlndXJpbmcgdGhlIEZVU0UgbW9kdWxlIGFwcHJvcHJpYXRlbHkgZm9yIGEgc3BlY2lmaWMgZW52aXJvbm1lbnQgb3IgdXNlIGNhc2UuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHdoaWNoIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSBhbmQgd2hhdCB0aGV5JiMzOTtyZSBzZXQgdG8uIFRoZW4sIHdpdGggdGhhdCB1bmRlcnN0YW5kaW5nLCBJJiMzOTtsbCBtb3ZlIG9uIHRvIGBmcy9mdXNlL01ha2VmaWxlYC4gVGhlIE1ha2VmaWxlIHdpbGwgc2hvdyBtZSB0aGUgYnVpbGQgcHJvY2VzcyBpdHNlbGY6IHRoZSBkZXBlbmRlbmNpZXMsIHRoZSBzb3VyY2UgZmlsZXMgaW5jbHVkZWQsIGNvbXBpbGVyIGZsYWdzLCBhbmQgdGhlIG92ZXJhbGwgc3RydWN0dXJlIG9mIGhvdyBGVVNFIGlzIGNvbXBpbGVkIGFuZCBsaW5rZWQgaW50byB0aGUga2VybmVsLiBCeSBleGFtaW5pbmcgYm90aCBvZiB0aGVzZSBmaWxlcywgSSBzaG91bGQgZ2V0IGEgY2xlYXIgcGljdHVyZSBvZiBob3cgRlVTRSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkLCBpdHMgY29tcGlsYXRpb24gcHJvY2VzcywgYW5kIHRoZSBmbGV4aWJpbGl0eSBvZmZlcmVkIHRvIGFuIGVuZC11c2VyIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAwMDowNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2Z1c2UvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNzUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuICAgMjpcdGNvbmZpZyBGVVNFX0ZTXG4gICAzOlx0XHR0cmlzdGF0ZSBcJiMzNDtGVVNFIChGaWxlc3lzdGVtIGluIFVzZXJzcGFjZSkgc3VwcG9ydFwmIzM0O1xuICAgNDpcdFx0c2VsZWN0IEZTX1BPU0lYX0FDTFxuICAgNTpcdFx0c2VsZWN0IEZTX0lPTUFQXG4gICA2Olx0XHRoZWxwXG4gICA3Olx0XHQgIFdpdGggRlVTRSBpdCBpcyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgYSBmdWxseSBmdW5jdGlvbmFsIGZpbGVzeXN0ZW1cbiAgIDg6XHRcdCAgaW4gYSB1c2Vyc3BhY2UgcHJvZ3JhbS5cbiAgIDk6XHRcbiAgMTA6XHRcdCAgVGhlcmUmIzM5O3MgYWxzbyBhIGNvbXBhbmlvbiBsaWJyYXJ5OiBsaWJmdXNlMi4gIFRoaXMgbGlicmFyeSBpcyBhdmFpbGFibGVcbiAgMTE6XHRcdCAgZnJvbSB0aGUgRlVTRSBob21lcGFnZTpcbiAgMTI6XHRcdCAgXHUwMDNjaHR0cHM6Ly9naXRodWIuY29tL2xpYmZ1c2UvXHUwMDNlXG4gIDEzOlx0XHQgIGFsdGhvdWdoIGNoYW5jZXMgYXJlIHlvdXIgZGlzdHJpYnV0aW9uIGFscmVhZHkgaGFzIHRoYXQgbGlicmFyeVxuICAxNDpcdFx0ICBpbnN0YWxsZWQgaWYgeW91JiMzOTt2ZSBpbnN0YWxsZWQgdGhlIFwmIzM0O2Z1c2VcJiMzNDsgcGFja2FnZSBpdHNlbGYuXG4gIDE1Olx0XG4gIDE2Olx0XHQgIFNlZSBcdTAwM2NmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZnVzZS9mdXNlLnJzdFx1MDAzZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgMTc6XHRcdCAgU2VlIFx1MDAzY2ZpbGU6RG9jdW1lbnRhdGlvbi9DaGFuZ2VzXHUwMDNlIGZvciBuZWVkZWQgbGlicmFyeS91dGlsaXR5IHZlcnNpb24uXG4gIDE4Olx0XG4gIDE5Olx0XHQgIElmIHlvdSB3YW50IHRvIGRldmVsb3AgYSB1c2Vyc3BhY2UgRlMsIG9yIGlmIHlvdSB3YW50IHRvIHVzZVxuICAyMDpcdFx0ICBhIGZpbGVzeXN0ZW0gYmFzZWQgb24gRlVTRSwgYW5zd2VyIFkgb3IgTS5cbiAgMjE6XHRcbiAgMjI6XHRjb25maWcgQ1VTRVxuICAyMzpcdFx0dHJpc3RhdGUgXCYjMzQ7Q2hhcmFjdGVyIGRldmljZSBpbiBVc2Vyc3BhY2Ugc3VwcG9ydFwmIzM0O1xuICAyNDpcdFx0ZGVwZW5kcyBvbiBGVVNFX0ZTXG4gIDI1Olx0XHRoZWxwXG4gIDI2Olx0XHQgIFRoaXMgRlVTRSBleHRlbnNpb24gYWxsb3dzIGNoYXJhY3RlciBkZXZpY2VzIHRvIGJlXG4gIDI3Olx0XHQgIGltcGxlbWVudGVkIGluIHVzZXJzcGFjZS5cbiAgMjg6XHRcbiAgMjk6XHRcdCAgSWYgeW91IHdhbnQgdG8gZGV2ZWxvcCBvciB1c2UgYSB1c2Vyc3BhY2UgY2hhcmFjdGVyIGRldmljZVxuICAzMDpcdFx0ICBiYXNlZCBvbiBDVVNFLCBhbnN3ZXIgWSBvciBNLlxuICAzMTpcdFxuICAzMjpcdGNvbmZpZyBWSVJUSU9fRlNcbiAgMzM6XHRcdHRyaXN0YXRlIFwmIzM0O1ZpcnRpbyBGaWxlc3lzdGVtXCYjMzQ7XG4gIDM0Olx0XHRkZXBlbmRzIG9uIEZVU0VfRlNcbiAgMzU6XHRcdHNlbGVjdCBWSVJUSU9cbiAgMzY6XHRcdGhlbHBcbiAgMzc6XHRcdCAgVGhlIFZpcnRpbyBGaWxlc3lzdGVtIGFsbG93cyBndWVzdHMgdG8gbW91bnQgZmlsZSBzeXN0ZW1zIGZyb20gdGhlXG4gIDM4Olx0XHQgIGhvc3QuXG4gIDM5Olx0XG4gIDQwOlx0XHQgIElmIHlvdSB3YW50IHRvIHNoYXJlIGZpbGVzIGJldHdlZW4gZ3Vlc3RzIG9yIHdpdGggdGhlIGhvc3QsIGFuc3dlciBZXG4gIDQxOlx0XHQgIG9yIE0uXG4gIDQyOlx0XG4gIDQzOlx0Y29uZmlnIEZVU0VfREFYXG4gIDQ0Olx0XHRib29sIFwmIzM0O1ZpcnRpbyBGaWxlc3lzdGVtIERpcmVjdCBIb3N0IE1lbW9yeSBBY2Nlc3Mgc3VwcG9ydFwmIzM0O1xuICA0NTpcdFx0ZGVmYXVsdCB5XG4gIDQ2Olx0XHRzZWxlY3QgSU5URVJWQUxfVFJFRVxuICA0NzpcdFx0ZGVwZW5kcyBvbiBWSVJUSU9fRlNcbiAgNDg6XHRcdGRlcGVuZHMgb24gRlNfREFYXG4gIDQ5Olx0XHRkZXBlbmRzIG9uIERBWFxuICA1MDpcdFx0aGVscFxuICA1MTpcdFx0ICBUaGlzIGFsbG93cyBieXBhc3NpbmcgZ3Vlc3QgcGFnZSBjYWNoZSBhbmQgYWxsb3dzIG1hcHBpbmcgaG9zdCBwYWdlXG4gIDUyOlx0XHQgIGNhY2hlIGRpcmVjdGx5IGluIGd1ZXN0IGFkZHJlc3Mgc3BhY2UuXG4gIDUzOlx0XG4gIDU0Olx0XHQgIElmIHlvdSB3YW50IHRvIGFsbG93IG1vdW50aW5nIGEgVmlydGlvIEZpbGVzeXN0ZW0gd2l0aCB0aGUgXCYjMzQ7ZGF4XCYjMzQ7XG4gIDU1Olx0XHQgIG9wdGlvbiwgYW5zd2VyIFkuXG4gIDU2Olx0XG4gIDU3Olx0Y29uZmlnIEZVU0VfUEFTU1RIUk9VR0hcbiAgNTg6XHRcdGJvb2wgXCYjMzQ7RlVTRSBwYXNzdGhyb3VnaCBvcGVyYXRpb25zIHN1cHBvcnRcJiMzNDtcbiAgNTk6XHRcdGRlZmF1bHQgeVxuICA2MDpcdFx0ZGVwZW5kcyBvbiBGVVNFX0ZTXG4gIDYxOlx0XHRzZWxlY3QgRlNfU1RBQ0tcbiAgNjI6XHRcdGhlbHBcbiAgNjM6XHRcdCAgVGhpcyBhbGxvd3MgYnlwYXNzaW5nIEZVU0Ugc2VydmVyIGJ5IG1hcHBpbmcgc3BlY2lmaWMgRlVTRSBvcGVyYXRpb25zXG4gIDY0Olx0XHQgIHRvIGJlIHBlcmZvcm1lZCBkaXJlY3RseSBvbiBhIGJhY2tpbmcgZmlsZS5cbiAgNjU6XHRcbiAgNjY6XHRcdCAgSWYgeW91IHdhbnQgdG8gYWxsb3cgcGFzc3Rocm91Z2ggb3BlcmF0aW9ucywgYW5zd2VyIFkuXG4gIDY3Olx0XG4gIDY4Olx0Y29uZmlnIEZVU0VfSU9fVVJJTkdcbiAgNjk6XHRcdGJvb2wgXCYjMzQ7RlVTRSBjb21tdW5pY2F0aW9uIG92ZXIgaW8tdXJpbmdcJiMzNDtcbiAgNzA6XHRcdGRlZmF1bHQgeVxuICA3MTpcdFx0ZGVwZW5kcyBvbiBGVVNFX0ZTXG4gIDcyOlx0XHRkZXBlbmRzIG9uIElPX1VSSU5HXG4gIDczOlx0XHRoZWxwXG4gIDc0Olx0XHQgIFRoaXMgYWxsb3dzIHNlbmRpbmcgRlVTRSByZXF1ZXN0cyBvdmVyIHRoZSBpby11cmluZyBpbnRlcmZhY2UgYW5kXG4gIDc1Olx0ICAgICAgICAgIGFsc28gYWRkcyByZXF1ZXN0IGNvcmUgYWZmaW5pdHkuXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjggMDA6MDU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI5MTEKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAxOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOgoKKipBbmFseXppbmcgdGhlIEZ1c2UgTWFrZWZpbGUgZm9yIEJ1aWxkIENvbmZpZ3VyYXRpb25zKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhlIGBmcy9mdXNlL01ha2VmaWxlYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGJ1aWxkIHByb2Nlc3MgZm9yIHRoZSBGVVNFIG1vZHVsZS4gSSYjMzk7bSBzcGVjaWZpY2FsbHkgaW50ZXJlc3RlZCBpbiBob3cgdGhlIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYWZmZWN0IHdoaWNoIGZpbGVzIGFyZSBjb21waWxlZCBhbmQgbGlua2VkLiBJIHdhbnQgdG8gc2VlIHdoaWNoIHNvdXJjZSBmaWxlcyBnZXQgaW5jbHVkZWQgb3IgZXhjbHVkZWQgYmFzZWQgb24gZGlmZmVyZW50IGtlcm5lbCBjb25maWdzLiBUaGlzIGxldmVsIG9mIGdyYW51bGFyIHVuZGVyc3RhbmRpbmcgaXMgY3JpdGljYWwgZm9yIGRlYnVnZ2luZyBhbmQgb3B0aW1pemF0aW9uLiBBIHRob3JvdWdoIHJldmlldyBvZiB0aGUgTWFrZWZpbGUgaXMgdGhlIGJlc3Qgd2F5IHRvIGdldCB0aGF0IGJpcmQmIzM5O3MtZXllIHZpZXcgb2YgdGhlIGJ1aWxkIHByb2Nlc3MuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjggMDA6MDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9mdXNlL01ha2VmaWxlJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4gICAyOlx0I1xuICAgMzpcdCMgTWFrZWZpbGUgZm9yIHRoZSBGVVNFIGZpbGVzeXN0ZW0uXG4gICA0Olx0I1xuICAgNTpcdFxuICAgNjpcdCMgTmVlZGVkIGZvciB0cmFjZSBldmVudHNcbiAgIDc6XHRjY2ZsYWdzLXkgPSAtSSQoc3JjKVxuICAgODpcdFxuICAgOTpcdG9iai0kKENPTkZJR19GVVNFX0ZTKSAmIzQzOz0gZnVzZS5vXG4gIDEwOlx0b2JqLSQoQ09ORklHX0NVU0UpICYjNDM7PSBjdXNlLm9cbiAgMTE6XHRvYmotJChDT05GSUdfVklSVElPX0ZTKSAmIzQzOz0gdmlydGlvZnMub1xuICAxMjpcdFxuICAxMzpcdGZ1c2UteSA6PSB0cmFjZS5vXHQjIHB1dCB0cmFjZS5vIGZpcnN0IHNvIHdlIHNlZSBmdHJhY2UgZXJyb3JzIHNvb25lclxuICAxNDpcdGZ1c2UteSAmIzQzOz0gZGV2Lm8gZGlyLm8gZmlsZS5vIGlub2RlLm8gY29udHJvbC5vIHhhdHRyLm8gYWNsLm8gcmVhZGRpci5vIGlvY3RsLm8gcmVxX3RpbWVvdXQubyByZXEub1xuICAxNTpcdGZ1c2UteSAmIzQzOz0gcG9sbC5vIG5vdGlmeS5vXG4gIDE2Olx0ZnVzZS15ICYjNDM7PSBpb21vZGUub1xuICAxNzpcdGZ1c2UtJChDT05GSUdfRlVTRV9EQVgpICYjNDM7PSBkYXgub1xuICAxODpcdGZ1c2UtJChDT05GSUdfRlVTRV9QQVNTVEhST1VHSCkgJiM0Mzs9IHBhc3N0aHJvdWdoLm8gYmFja2luZy5vXG4gIDE5Olx0ZnVzZS0kKENPTkZJR19TWVNDVEwpICYjNDM7PSBzeXNjdGwub1xuICAyMDpcdGZ1c2UtJChDT05GSUdfRlVTRV9JT19VUklORykgJiM0Mzs9IGRldl91cmluZy5vXG4gIDIxOlx0XG4gIDIyOlx0dmlydGlvZnMteSA6PSB2aXJ0aW9fZnMub1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDAwOjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzNDY0CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogNzA3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgRlVTRSBQYXRjaDogQSBGdXp6aW5nIE9wcG9ydHVuaXR5KioKCk9rYXksIGxldCYjMzk7cyBicmVhayBkb3duIHRoaXMgcGF0Y2guIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IGl0JiMzOTtzIGZvY3VzaW5nIG9uIGVuaGFuY2luZyBGVVNFIGFuZCB2aXJ0aW8tZnMgZXJyb3IgaGFuZGxpbmcsIHNwZWNpZmljYWxseSBjb25jZXJuaW5nIEVOT0VOVCBlcnJvcnMgd2hlbiBkZWFsaW5nIHdpdGggbGl2ZSBub2RlIElEcy4gSXQgc2VlbXMgbGlrZSB0aGUgY29yZSBpc3N1ZSBpcyBob3cgd2UmIzM5O3JlIGhhbmRsaW5nIHN0YWxlIGlub2RlcywgYWltaW5nIHRvIHByb3ZpZGUgbW9yZSByb2J1c3QgZXJyb3Igc2lnbmFsaW5nLgoKTXkga2V5IGNvbmNlcm4gaXMgaG93IHRoaXMgZXJyb3IgaGFuZGxpbmcgcGVyY29sYXRlcyB1cCB0aHJvdWdoIHRoZSBWRlMuIFRoaXMgcGF0Y2ggaXMgbW9kaWZ5aW5nIHNldmVyYWwga2V5IGFyZWFzOiBgZnMvZnVzZS9kaXIuY2AsIGBmcy9mdXNlL2ZpbGUuY2AsIGBmcy9mdXNlL2Z1c2VfaS5oYCwgYGZzL2Z1c2UvaW5vZGUuY2AsIGFuZCBgZnMvZnVzZS92aXJ0aW9fZnMuY2AuIEl0IGxvb2tzIGxpa2UgRU5PRU5UIGlzIGJlaW5nIGNvbnZlcnRlZCB0byBFU1RBTEUgb3IgRU9QRU5TVEFMRSBpbiBzZXZlcmFsIGNvbnRleHRzOiBgZnVzZV9kb19nZXRhdHRyYCwgYGZ1c2VfcmVhZGxpbmtfZm9saW9gLCBgZnVzZV9kaXJfb3BlbmAsIGBmdXNlX2RvX3NldGF0dHJgLCBgZnVzZV9vcGVuYCwgYW5kIGBmdXNlX3N0YXRmc2AsIHdpdGggc3BlY2lmaWMgaGFuZGxpbmcgaW4gYHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlYC4gVGhlIGFkZGl0aW9uIG9mIG5ldyB0ZXN0cyBpcyBwcm9taXNpbmcsIGJ1dCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY292ZXJhZ2UgYW5kIGZvY3VzLgoKVGhlIHNpZ25pZmljYW50IGNoYW5nZXMgYXJlOgoqICAgSW4gYGZzL2Z1c2UvZGlyLmNgLCBgZnVzZV9kb19nZXRhdHRyYCwgYGZ1c2VfcmVhZGxpbmtfZm9saW9gLCBgZnVzZV9kaXJfb3BlbmAsIGFuZCBgZnVzZV9kb19zZXRhdHRyYC4KKiAgIEluIGBmcy9mdXNlL2ZpbGUuY2AsIGBmdXNlX29wZW5gLgoqICAgQSBuZXcgaGVscGVyIGBmdXNlX3N0YWxlX2lub2RlX2VycigpYCBpbiBgZnMvZnVzZS9mdXNlX2kuaGAuCiogICBJbiBgZnMvZnVzZS9pbm9kZS5jYCwgYGZ1c2Vfc3RhdGZzYC4KKiAgIEluIGBmcy9mdXNlL3ZpcnRpb19mcy5jYCwgYHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlYC4KCk5vdywgZG9lcyB0aGlzIG1lcml0IGZ1enppbmc/IEFic29sdXRlbHksIHllcyEgVGhlIEZVU0UgZXJyb3IgaGFuZGxpbmcgYW5kIHJldHVybiBjb2RlcyAoRVNUQUxFLCBFT1BFTlNUQUxFLCBhbmQgdGhlIEVOT0VOVCByZXRyeSBsb2dpYykgZGlyZWN0bHkgaW1wYWN0IFZGUyBwYXRoIHJlc29sdXRpb24gYW5kIGZpbGUgb3BlcmF0aW9ucyBhY3Jvc3MgdGhlIGJvYXJkLiBPcGVyYXRpb25zIGxpa2Ugb3BlbiwgZ2V0YXR0ciwgc2V0YXR0ciwgc3RhdGZzLCBhbmQgcmVhZGxpbmsgd2lsbCBiZSBkaXJlY3RseSBhZmZlY3RlZCBieSB0aGVzZSBjaGFuZ2VzIHdoZW4gaW50ZXJhY3Rpbmcgd2l0aCB1c2Vyc3BhY2UgRlVTRSBzZXJ2ZXJzIG9yIHZpcnRpby1mcy4gVGhpcyBpcyBhY2Nlc3NpYmxlIGZyb20gcHJldHR5IHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgc3VjaCBhcyBRRU1VIG9yIEdDRS4KCkkgbmVlZCB0byBjb25maXJtIHRoZSBzY29wZSBvZiB0aGlzLiBJJiMzOTttIGZvY3VzaW5nIG9uIHRob3NlIG1vZGlmaWNhdGlvbnM6IGBmdXNlX2RvX3NldGF0dHJgLCBgZnVzZV9kb19nZXRhdHRyYCwgYGZ1c2VfZGlyX29wZW5gLCBgZnVzZV9vcGVuYCwgYGZ1c2VfcmVhZGxpbmtfZm9saW9gLCBgZnVzZV9zdGF0ZnNgLCBhbmQgYHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlYC4gVGhlIG5vbi1zdGF0aWMgbmF0dXJlIG9mIGBmdXNlX2RvX3NldGF0dHJgIGlzIHdvcnRoIGEgZGVlcGVyIGRpdmUuIEkgd2FudCB0byBjaGVjayBpdHMgZGVjbGFyYXRpb25zLCBjYWxsZXJzLCBhbmQgb3ZlcmFsbCB1c2FnZSBhY3Jvc3MgRlVTRSBmaWxlcy4gTGV0JiMzOTtzIGFuYWx5emUgdGhlIGNhbGxlcnMgb2YgdGhlIGBzdGF0aWNgIGZ1bmN0aW9ucyBhcyB3ZWxsLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY2FsbCBjaGFpbnMgYW5kIGhvdyB0aGVzZSBlcnJvciBjb2RlcyBhcmUgcHJvcGFnYXRlZC4gR2l2ZW4gdGhhdCB0aGVzZSBmdW5jdGlvbnMgYXJlIGRlZXBseSBpbnZvbHZlZCB3aXRoIGZpbGUgb3BlcmF0aW9ucywgdGhleSByZXByZXNlbnQgZmVydGlsZSBncm91bmQgZm9yIGZ1enppbmcgdG8gdW5jb3ZlciBwb3RlbnRpYWwgaXNzdWVzLCBlc3BlY2lhbGx5IHJhY2UgY29uZGl0aW9ucyBvciBpbmNvcnJlY3QgZXJyb3IgcHJvcGFnYXRpb24uCgpTbywgbGV0JiMzOTtzIG1hcCBvdXQgdGhlIGZ1bmN0aW9ucy4gSSYjMzk7bGwgbmVlZCB0byBjaGVjayB0aGUgZXhhY3QgZGVjbGFyYXRpb25zLCB3aGVyZSB0aGV5JiMzOTtyZSBkZWZpbmVkLCBhbmQgdGhlIGNhbGxlcnMgb2YgZWFjaC4gQSB0aG9yb3VnaCBhbmFseXNpcyBoZXJlIHdpbGwgcmV2ZWFsIHBvdGVudGlhbCBlbnRyeSBwb2ludHMgZm9yIGZ1enppbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDAwOjA2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2Z1c2VfZG9fc2V0YXR0ciYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2Z1c2UmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZnVzZS9kaXIuYz0yMTE5PWludCBmdXNlX2ZsdXNoX3RpbWVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmdXNlX2ZpbGUgKmZmKVxuLS1cbmZzL2Z1c2UvZGlyLmMtMjE1My0gKi9cbmZzL2Z1c2UvZGlyLmM6MjE1NDppbnQgZnVzZV9kb19zZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksXG5mcy9mdXNlL2Rpci5jLTIxNTUtXHRcdCAgICBzdHJ1Y3QgaWF0dHIgKmF0dHIsIHN0cnVjdCBmaWxlICpmaWxlKVxuLS1cbmZzL2Z1c2UvZGlyLmM9MjMzNj1zdGF0aWMgaW50IGZ1c2Vfc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZW50cnksXG4tLVxuZnMvZnVzZS9kaXIuYy0yMzgyLVxuZnMvZnVzZS9kaXIuYzoyMzgzOlx0cmV0ID0gZnVzZV9kb19zZXRhdHRyKGlkbWFwLCBlbnRyeSwgYXR0ciwgZmlsZSk7XG5mcy9mdXNlL2Rpci5jLTIzODQtXHRpZiAoIXJldCkge1xuLS1cbmZzL2Z1c2UvZmlsZS5jPTI3MTI9c3RhdGljIHZvaWQgZnVzZV9kb190cnVuY2F0ZShzdHJ1Y3QgZmlsZSAqZmlsZSlcbi0tXG5mcy9mdXNlL2ZpbGUuYy0yNzIyLVxuZnMvZnVzZS9maWxlLmM6MjcyMzpcdGZ1c2VfZG9fc2V0YXR0cihmaWxlX21udF9pZG1hcChmaWxlKSwgZmlsZV9kZW50cnkoZmlsZSksIFx1MDAyNmF0dHIsIGZpbGUpO1xuZnMvZnVzZS9maWxlLmMtMjcyNC19XG4tLVxuZnMvZnVzZS9mdXNlX2kuaD0xMTkwPWludCBmdXNlX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKTtcbmZzL2Z1c2UvZnVzZV9pLmgtMTE5MS1cbmZzL2Z1c2UvZnVzZV9pLmg6MTE5MjppbnQgZnVzZV9kb19zZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksXG5mcy9mdXNlL2Z1c2VfaS5oLTExOTMtXHRcdCAgICBzdHJ1Y3QgaWF0dHIgKmF0dHIsIHN0cnVjdCBmaWxlICpmaWxlKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjggMDA6MDY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTUzNzMKCQkJCQkJCW91dHB1dDogNTQKCQkJCQkJCXRob3VnaHRzOiA3NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIGZ1bmN0aW9ucy4KCioqSW5pdGlhbCBDb25zaWRlcmF0aW9ucyBmb3IgRlVTRSBLZXJuZWwgTW9kdWxlIFJldmlldyoqCgpBbHJpZ2h0LCBiZWZvcmUgSSBkaXZlIGluIHRvbyBkZWVwLCBsZXQmIzM5O3MgZXN0YWJsaXNoIG91ciBpbW1lZGlhdGUgcHJpb3JpdGllcy4gTXkgbWluZCBpcyBhbHJlYWR5IHJ1bm5pbmcgdGhyb3VnaCBhIHF1aWNrIGNoZWNrbGlzdCBvZiBjcml0aWNhbCBGVVNFIGZ1bmN0aW9ucyB0aGF0IGRlbWFuZCBteSBhdHRlbnRpb24uIFNwZWNpZmljYWxseSwgSSYjMzk7bSB0aGlua2luZyBhYm91dCBgZnVzZV9vcGVuYCwgYGZ1c2VfZGlyX29wZW5gLCBgZnVzZV9zdGF0ZnNgLCBgZnVzZV9nZXRhdHRyYCwgYW5kIGBmdXNlX3NldGF0dHJgLiBUaGVzZSBhcmUgdGhlIGNvcmUgYnVpbGRpbmcgYmxvY2tzIGZvciBmaWxlIGFjY2VzcywgZGlyZWN0b3J5IHRyYXZlcnNhbCwgZmlsZXN5c3RlbSBzdGF0aXN0aWNzLCBhdHRyaWJ1dGUgcmV0cmlldmFsLCBhbmQgYXR0cmlidXRlIG1vZGlmaWNhdGlvbiwgcmVzcGVjdGl2ZWx5LiBUaGVuIHRoZXJlJiMzOTtzIHRoZSBmb2xpby1zcGVjaWZpYyBoYW5kbGluZywgd2hpY2ggYWxzbyBuZWVkcyBhIGxvb2sgYXQgYGZ1c2VfcmVhZGxpbmtfZm9saW9gLCBhbmQgYGZ1c2Vfc3ltbGlua19yZWFkX2ZvbGlvYCwgYW5kIGZpbmFsbHkgbGV0JiMzOTtzIHRocm93IGluIGB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZWAsIHRvIGVuc3VyZSBhIGNvbXBsZXRlIHBpY3R1cmUuIFdpdGggdGhvc2UgaW4gbWluZCwgSSBuZWVkIHRvIGtub3cgdGhlIGV4YWN0IGRlZmluaXRpb25zIG9mIHRoZXNlIGluIHRoZSBGVVNFIGtlcm5lbCBtb2R1bGUuIExvb2tzIGxpa2UgdGhlIGxvZ2ljYWwgZmlyc3Qgc3RlcCBpcyB0byBpbW1lZGlhdGVseSBwdWxsIHVwIGBmcy9mdXNlL2AgYW5kIGJlZ2luIHRoZSBjb2RlIHJldmlldy4gVGhhdCYjMzk7bGwgYmUgYSBnb29kIHN0YXJ0aW5nIHBvaW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAwMDowNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDteKHN0YXRpYyApPyhpbnR8dm9pZCkgZnVzZV8ob3BlbnxkaXJfb3BlbnxzdGF0ZnN8Z2V0YXR0cnxzZXRhdHRyfHN5bWxpbmtfcmVhZF9mb2xpbykmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9mdXNlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2Z1c2UvZGlyLmM9MTg2Nj1zdGF0aWMgY29uc3QgY2hhciAqZnVzZV9nZXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZnVzZS9kaXIuYy0xOTAyLVxuZnMvZnVzZS9kaXIuYzoxOTAzOnN0YXRpYyBpbnQgZnVzZV9kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcbmZzL2Z1c2UvZGlyLmMtMTkwNC17XG4tLVxuZnMvZnVzZS9kaXIuYz0yMDkyPXZvaWQgZnVzZV9yZWxlYXNlX25vd3JpdGUoc3RydWN0IGlub2RlICppbm9kZSlcbi0tXG5mcy9mdXNlL2Rpci5jLTIxMDAtXG5mcy9mdXNlL2Rpci5jOjIxMDE6c3RhdGljIHZvaWQgZnVzZV9zZXRhdHRyX2ZpbGwoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX2FyZ3MgKmFyZ3MsXG5mcy9mdXNlL2Rpci5jLTIxMDItXHRcdFx0ICAgICAgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9mdXNlL2Rpci5jPTIxNTQ9aW50IGZ1c2VfZG9fc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuLS1cbmZzL2Z1c2UvZGlyLmMtMjMzNS1cbmZzL2Z1c2UvZGlyLmM6MjMzNjpzdGF0aWMgaW50IGZ1c2Vfc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZW50cnksXG5mcy9mdXNlL2Rpci5jLTIzMzctXHRcdFx0c3RydWN0IGlhdHRyICphdHRyKVxuLS1cbmZzL2Z1c2UvZGlyLmMtMjM5OC1cbmZzL2Z1c2UvZGlyLmM6MjM5OTpzdGF0aWMgaW50IGZ1c2VfZ2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCxcbmZzL2Z1c2UvZGlyLmMtMjQwMC1cdFx0XHRjb25zdCBzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IGtzdGF0ICpzdGF0LFxuLS1cbmZzL2Z1c2UvZGlyLmM9MjQ4Mz12b2lkIGZ1c2VfaW5pdF9kaXIoc3RydWN0IGlub2RlICppbm9kZSlcbi0tXG5mcy9mdXNlL2Rpci5jLTI0OTYtXG5mcy9mdXNlL2Rpci5jOjI0OTc6c3RhdGljIGludCBmdXNlX3N5bWxpbmtfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqbnVsbCwgc3RydWN0IGZvbGlvICpmb2xpbylcbmZzL2Z1c2UvZGlyLmMtMjQ5OC17XG4tLVxuZnMvZnVzZS9maWxlLmM9MjM3PXN0YXRpYyB2b2lkIGZ1c2VfdHJ1bmNhdGVfdXBkYXRlX2F0dHIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG4tLVxuZnMvZnVzZS9maWxlLmMtMjQ5LVxuZnMvZnVzZS9maWxlLmM6MjUwOnN0YXRpYyBpbnQgZnVzZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxuZnMvZnVzZS9maWxlLmMtMjUxLXtcbi0tXG5mcy9mdXNlL2lub2RlLmM9NjMyPXN0YXRpYyB2b2lkIGNvbnZlcnRfZnVzZV9zdGF0ZnMoc3RydWN0IGtzdGF0ZnMgKnN0YnVmLCBzdHJ1Y3QgZnVzZV9rc3RhdGZzICphdHRyKVxuLS1cbmZzL2Z1c2UvaW5vZGUuYy02NDUtXG5mcy9mdXNlL2lub2RlLmM6NjQ2OnN0YXRpYyBpbnQgZnVzZV9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKVxuZnMvZnVzZS9pbm9kZS5jLTY0Ny17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDAwOjA2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2NDIzCgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIHRoZSBvbmUgdGhpbmtpbmcgaXQ6CgoqKkRpZ2dpbmcgaW50byB2aXJ0aW9fZnMuYyBmb3IgQ29tcGxldGlvbiBIYW5kbGluZyoqCgpPa2F5LCBzbyB3ZSYjMzk7cmUgbG9va2luZyBhdCBjb21wbGV0aW9uIGhhbmRsaW5nIHdpdGhpbiB2aXJ0aW8tZnMuIE15IGluaXRpYWwgZm9jdXMgaXMgZGVmaW5pdGVseSBnb2luZyB0byBiZSBvbiBgdmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGVgLiBUaGF0JiMzOTtzIHdoZXJlIHRoZSBydWJiZXIgbWVldHMgdGhlIHJvYWQsIHdoZXJlIHRoZSBrZXJuZWwgc2lnbmFscyBhIHJlcXVlc3QgaXMgZmluaXNoZWQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgaG93IHRoZSBkYXRhIGdldHMgY2xlYW5lZCB1cCwgaG93IGVycm9ycyBhcmUgcmVwb3J0ZWQgYmFjayAoaWYgYW55KSwgYW5kIGhvdyB0aGUgd2hvbGUgdGhpbmcgdHJhbnNpdGlvbnMgdG8gdGhlIG5leHQgcGhhc2UgaW4gdGhlIHJlcXVlc3QgbGlmZWN5Y2xlLiBJJiMzOTtsbCBsaWtlbHkgYmUgY2hlY2tpbmcgdGhlIHN1cnJvdW5kaW5nIGNvZGUgZm9yIGhvdyB0aGF0IGZ1bmN0aW9uIGlzIGNhbGxlZCBhbmQgd2hlcmUgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBjb21wbGV0ZSB0aGUgcmVxdWVzdCBjb21lcyBmcm9tIGluIHRoZSBmaXJzdCBwbGFjZS4gSeKAmW0gdGhpbmtpbmcgdGhlcmUgbWlnaHQgYmUgc2V2ZXJhbCBjcml0aWNhbCBwb2ludHMgdGhlcmUuIEFuZCBJJiMzOTtsbCBiZSBrZWVwaW5nIGFuIGV5ZSBvdXQgZm9yIGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIG9yIGVkZ2UgY2FzZXMuIFRpbWUgdG8gZGlnIGluIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAwMDowNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2Z1c2UmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZnVzZS92aXJ0aW9fZnMuYz04MTM9c3RhdGljIHZvaWQgdmlydGlvX2ZzX2ZpeHVwX3N0YWxlX2Vycm9yKHN0cnVjdCBmdXNlX3JlcSAqcmVxKVxuLS1cbmZzL2Z1c2UvdmlydGlvX2ZzLmMtODQzLS8qIFdvcmsgZnVuY3Rpb24gZm9yIHJlcXVlc3QgY29tcGxldGlvbiAqL1xuZnMvZnVzZS92aXJ0aW9fZnMuYzo4NDQ6c3RhdGljIHZvaWQgdmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGUoc3RydWN0IGZ1c2VfcmVxICpyZXEsXG5mcy9mdXNlL3ZpcnRpb19mcy5jLTg0NS1cdFx0XHRcdCAgICAgICBzdHJ1Y3QgdmlydGlvX2ZzX3ZxICpmc3ZxKVxuLS1cbmZzL2Z1c2UvdmlydGlvX2ZzLmM9ODgxPXN0YXRpYyB2b2lkIHZpcnRpb19mc19jb21wbGV0ZV9yZXFfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4tLVxuZnMvZnVzZS92aXJ0aW9fZnMuYy04ODUtXG5mcy9mdXNlL3ZpcnRpb19mcy5jOjg4NjpcdHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlKHctXHUwMDNlcmVxLCB3LVx1MDAzZWZzdnEpO1xuZnMvZnVzZS92aXJ0aW9fZnMuYy04ODctXHRrZnJlZSh3KTtcbi0tXG5mcy9mdXNlL3ZpcnRpb19mcy5jPTg5MD1zdGF0aWMgdm9pZCB2aXJ0aW9fZnNfcmVxdWVzdHNfZG9uZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbi0tXG5mcy9mdXNlL3ZpcnRpb19mcy5jLTkzMS1cdFx0fSBlbHNlIHtcbmZzL2Z1c2UvdmlydGlvX2ZzLmM6OTMyOlx0XHRcdHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlKHJlcSwgZnN2cSk7XG5mcy9mdXNlL3ZpcnRpb19mcy5jLTkzMy1cdFx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAwMDowNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzAzMQoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDEwMDkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIEZVU0UvVmlydGlvRlMgU3ltYm9sIFZpc2liaWxpdHkqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgcHJpbWFyeSBjb25jZXJuIGlzIHRoZSB2aXNpYmlsaXR5IG9mIGNlcnRhaW4gRlVTRSBhbmQgVmlydGlvRlMgZnVuY3Rpb25zLCBzcGVjaWZpY2FsbHkgdG8gZGV0ZXJtaW5lIHdoaWNoIG9uZXMgYXJlIGV4cG9zZWQgYXMgcHJvcGVyIHN5bWJvbHMuIFRoZSBnb2FsIGlzIHRvIGlkZW50aWZ5IEFQSSBlbnRyeSBwb2ludHMsIGZhdm9yaW5nIHRob3NlIHRoYXQgYXJlIG5vbi1zdGF0aWMgYW5kIG5vdCBpbmxpbmVkIGJlY2F1c2UgdGhlc2UgYXJlIG1vcmUgbGlrZWx5IHRvIGJlIGFjY2Vzc2libGUgaW4gYSBwcmVkaWN0YWJsZSB3YXkuCgpGaXJzdCwgSSBjb25maXJtZWQgdGhhdCBgZnVzZV9kb19zZXRhdHRyYCBpcyBpbmRlZWQgbm9uLXN0YXRpYywgYSBnb29kIHN0YXJ0LiBUaGVuLCBJIHF1aWNrbHkgc2Nhbm5lZCBvdGhlciBmdW5jdGlvbnMgd2l0aGluIGBmcy9mdXNlL2Rpci5jYCwgYW5kIGBmcy9mdXNlL2ZpbGUuY2AgdG8gaWRlbnRpZnkgb3RoZXIgZnVuY3Rpb25zIG9mIGludGVyZXN0OiBgZnVzZV9vcGVuYCwgYGZ1c2VfZGlyX29wZW5gLCBgZnVzZV9kb19nZXRhdHRyYCwgYGZ1c2Vfc3RhdGZzYCwgYGZ1c2VfcmVhZGxpbmtfZm9saW9gLCBhbmQgYHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlYC4KCkxvb2tpbmcgYXQgdGhlIGRpZmYsIGl0IHNlZW1zIHNldmVyYWwgb2YgdGhlc2UgaGF2ZSBiZWVuIG1vZGlmaWVkOiBgZnVzZV9kb19nZXRhdHRyYCwgYGZ1c2VfcmVhZGxpbmtfZm9saW9gLCBgZnVzZV9kaXJfb3BlbmAsIGBmdXNlX2RvX3NldGF0dHJgIChpbiBgZnMvZnVzZS9kaXIuY2ApIGFuZCBgZnVzZV9vcGVuYCAoaW4gYGZzL2Z1c2UvZmlsZS5jYCkuIEFkZGl0aW9uYWxseSwgYGZ1c2Vfc3RhdGZzYCBpcyBjaGFuZ2VkIGluIGBmcy9mdXNlL2lub2RlLmNgLCBhbmQgdGhlcmUgYXJlIGNoYW5nZXMgaW4gYGZzL2Z1c2UvdmlydGlvX2ZzLmNgIHJlbGF0ZWQgdG8gYHZpcnRpb19mc19maXh1cF9zdGFsZV9lcnJvcmAgYW5kIGB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZWAuIFRoZSBgZnVzZV9zdGFsZV9pbm9kZV9lcnJgIGZ1bmN0aW9uIGlzIGFsc28gbm93IGFuIGlubGluZSBmdW5jdGlvbiBkZWZpbmVkIGluIGBmcy9mdXNlL2Z1c2VfaS5oYC4KCkkgdGhlbiBtYWRlIGEgbm90ZSBvZiB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbiBvcHRpb25zOiBgRlVTRV9GU2AgYW5kIGBWSVJUSU9fRlNgLiBBIHF1aWNrIGNyb3NzLXJlZmVyZW5jZSBvZiB0aGUgS2NvbmZpZyBzaG93ZWQgdGhhdCBgVklSVElPX0ZTYCBkZXBlbmRzIG9uIGBGVVNFX0ZTYCBhbmQgYEZVU0VfRlNgIHNlbGVjdHMgYEZTX1BPU0lYX0FDTGAgYW5kIGBGU19JT01BUGAuCgpOb3csIHRoZSBmb2N1cyBpcyBvbiBhIHN1YnNldCBvZiBzeW1ib2xzOiBgZnVzZV9kb19zZXRhdHRyYCwgYGZ1c2VfZG9fZ2V0YXR0cmAsIGBmdXNlX2Rpcl9vcGVuYCwgYGZ1c2Vfb3BlbmAsIGBmdXNlX3JlYWRsaW5rX2ZvbGlvYCwgYGZ1c2Vfc3RhdGZzYCwgYW5kIGB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZWAuIEkgbmVlZCB0byBkZXRlcm1pbmUgaWYgdGhlc2UgYXJlIGNvbXBpbGVkIGFzIGRpc3RpbmN0IHN5bWJvbHMuCgpgZnVzZV9kb19zZXRhdHRyYCBoYXMgYWxyZWFkeSBiZWVuIGVzdGFibGlzaGVkIGFzIG5vbi1zdGF0aWMuIEhvd2V2ZXIsIGFmdGVyIGNhcmVmdWwgcmV2aWV3LCBpdCBsb29rcyBsaWtlIGBmdXNlX29wZW5gLCBgZnVzZV9kaXJfb3BlbmAsIGFuZCBgZnVzZV9zdGF0ZnNgIGFyZSBzdGF0aWMgZmlsZV9vcGVyYXRpb25zL3N1cGVyX29wZXJhdGlvbnMgY2FsbGJhY2tzLiBUaGlzIGlzIGdvb2QgYmVjYXVzZSBldmVuIHRob3VnaCB0aGV5IGFyZSBzdGF0aWMsIGJlY2F1c2UgdGhlaXIgYWRkcmVzcyBpcyB0YWtlbiBhbmQgYXNzaWduZWQgaW50byBhIHN0cnVjdCBmdW5jdGlvbiBwb2ludGVyLCB0aGV5IGFyZSBub3QgaW5saW5lZC4gYGZ1c2VfZG9fZ2V0YXR0cmAgYW5kIGBmdXNlX3JlYWRsaW5rX2ZvbGlvYCBhcmUgYm90aCBzdGF0aWMgaGVscGVycy4gQW5kIGB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZWAgaXMgc3RhdGljIGFzIHdlbGwuCgpUaGVyZWZvcmUsIGBmdXNlX2RvX3NldGF0dHJgLCBgZnVzZV9vcGVuYCwgYGZ1c2VfZGlyX29wZW5gLCBhbmQgYGZ1c2Vfc3RhdGZzYCBhcmUgdGhlIHNpZ25pZmljYW50IHN5bWJvbHMgdG8gZm9jdXMgb24uIFRoZXkgYXJlICpsaWtlbHkqIHRoZSBwcmltYXJ5IGV4cG9zZWQgQVBJIGVudHJ5IHBvaW50cyBpbiB0aGUgbW9kdWxlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAwMDowNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtmdXNlX29wZW4mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9mdXNlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2Z1c2UvZGV2LmM9NzczPXN0YXRpYyB2b2lkIGZ1c2VfYWRqdXN0X2NvbXBhdChzdHJ1Y3QgZnVzZV9jaGFuICpmY2gsIHN0cnVjdCBmdXNlX2FyZ3MgKmFyZ3MpXG4tLVxuZnMvZnVzZS9kZXYuYy03OTYtXHRcdGNhc2UgRlVTRV9DUkVBVEU6XG5mcy9mdXNlL2Rldi5jOjc5NzpcdFx0XHRhcmdzLVx1MDAzZWluX2FyZ3NbMF0uc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZnVzZV9vcGVuX2luKTtcbmZzL2Z1c2UvZGV2LmMtNzk4LVx0XHRcdGJyZWFrO1xuLS1cbmZzL2Z1c2UvZGlyLmM9ODIzPXN0YXRpYyBpbnQgZnVzZV9jcmVhdGVfb3BlbihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGlub2RlICpkaXIsXG4tLVxuZnMvZnVzZS9kaXIuYy04MzEtXHRzdHJ1Y3QgZnVzZV9jcmVhdGVfaW4gaW5hcmc7XG5mcy9mdXNlL2Rpci5jOjgzMjpcdHN0cnVjdCBmdXNlX29wZW5fb3V0ICpvdXRvcGVucDtcbmZzL2Z1c2UvZGlyLmMtODMzLVx0c3RydWN0IGZ1c2VfZW50cnlfb3V0IG91dGVudHJ5O1xuLS1cbmZzL2Z1c2UvZGlyLmM9MTkwMz1zdGF0aWMgaW50IGZ1c2VfZGlyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG4tLVxuZnMvZnVzZS9kaXIuYy0xOTE2LVx0LypcbmZzL2Z1c2UvZGlyLmM6MTkxNzpcdCAqIEFzIGluIGZ1c2Vfb3Blbl9jb21tb24oKTogYSBwYXRoIHdhbGsgc3RhbmRzIGJlaGluZCB0aGlzIG9wZW4sXG5mcy9mdXNlL2Rpci5jLTE5MTgtXHQgKiBzbyB0aGUgcmVmdXNhbCBpcyBFT1BFTlNUQUxFIGZvciBwYXRoX29wZW5hdCgpIHRvIGFuc3dlci5cbi0tXG5mcy9mdXNlL2ZpbGUuYz0yNT1zdGF0aWMgaW50IGZ1c2Vfc2VuZF9vcGVuKHN0cnVjdCBmdXNlX21vdW50ICpmbSwgdTY0IG5vZGVpZCxcbmZzL2Z1c2UvZmlsZS5jLTI2LVx0XHRcdCAgdW5zaWduZWQgaW50IG9wZW5fZmxhZ3MsIGludCBvcGNvZGUsXG5mcy9mdXNlL2ZpbGUuYzoyNzpcdFx0XHQgIHN0cnVjdCBmdXNlX29wZW5fb3V0ICpvdXRhcmdwKVxuZnMvZnVzZS9maWxlLmMtMjgte1xuZnMvZnVzZS9maWxlLmM6Mjk6XHRzdHJ1Y3QgZnVzZV9vcGVuX2luIGluYXJnO1xuZnMvZnVzZS9maWxlLmMtMzAtXHRGVVNFX0FSR1MoYXJncyk7XG4tLVxuZnMvZnVzZS9maWxlLmM9MTMzPXN0cnVjdCBmdXNlX2ZpbGUgKmZ1c2VfZmlsZV9vcGVuKHN0cnVjdCBmdXNlX21vdW50ICpmbSwgdTY0IG5vZGVpZCxcbi0tXG5mcy9mdXNlL2ZpbGUuYy0xNTgtXHRcdC8qIFN0b3JlIG91dGFyZyBmb3IgZnVzZV9maW5pc2hfb3BlbigpICovXG5mcy9mdXNlL2ZpbGUuYzoxNTk6XHRcdHN0cnVjdCBmdXNlX29wZW5fb3V0ICpvdXRhcmdwID0gXHUwMDI2ZmYtXHUwMDNlYXJncy1cdTAwM2VvcGVuX291dGFyZztcbmZzL2Z1c2UvZmlsZS5jLTE2MC1cdFx0aW50IGVycjtcbi0tXG5mcy9mdXNlL2ZpbGUuYz0yMzc9c3RhdGljIHZvaWQgZnVzZV90cnVuY2F0ZV91cGRhdGVfYXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcbi0tXG5mcy9mdXNlL2ZpbGUuYy0yNDktXG5mcy9mdXNlL2ZpbGUuYzoyNTA6c3RhdGljIGludCBmdXNlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG5mcy9mdXNlL2ZpbGUuYy0yNTEte1xuLS1cbmZzL2Z1c2UvZmlsZS5jPTMwODg9c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnVzZV9maWxlX29wZXJhdGlvbnMgPSB7XG4tLVxuZnMvZnVzZS9maWxlLmMtMzA5Mi1cdC5tbWFwXHRcdD0gZnVzZV9maWxlX21tYXAsXG5mcy9mdXNlL2ZpbGUuYzozMDkzOlx0Lm9wZW5cdFx0PSBmdXNlX29wZW4sXG5mcy9mdXNlL2ZpbGUuYy0zMDk0LVx0LmZsdXNoXHRcdD0gZnVzZV9mbHVzaCxcbi0tXG5mcy9mdXNlL2Z1c2VfaS5oPTMzMz11bmlvbiBmdXNlX2ZpbGVfYXJncyB7XG5mcy9mdXNlL2Z1c2VfaS5oLTMzNC1cdC8qIFVzZWQgZHVyaW5nIG9wZW4oKSAqL1xuZnMvZnVzZS9mdXNlX2kuaDozMzU6XHRzdHJ1Y3QgZnVzZV9vcGVuX291dCBvcGVuX291dGFyZztcbmZzL2Z1c2UvZnVzZV9pLmgtMzM2LVx0LyogVXNlZCBkdXJpbmcgcmVsZWFzZSgpICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDAwOjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5NjM5CgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gYGZ1c2VfZGlyX29wZW5gKioKCk9rYXksIHRpbWUgdG8gZGlzc2VjdCB0aGUgdXNhZ2Ugb2YgYGZ1c2VfZGlyX29wZW5gIHdpdGhpbiBgZnMvZnVzZS9kaXIuY2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyByb2xlIGFuZCBob3cgaXQmIzM5O3MgYmVpbmcgbGV2ZXJhZ2VkIGluIHRoZSBGVVNFIGZpbGVzeXN0ZW0gbGF5ZXIuIEkmIzM5O20gYXNzdW1pbmcgdGhlcmUmIzM5O3Mgc29tZSBpc3N1ZSB0aGF0IHdhcnJhbnRzIGludmVzdGlnYXRpb24sIG9yIHBlcmhhcHMgSSYjMzk7bSBsb29raW5nIHRvIG9wdGltaXplIGRpcmVjdG9yeSBvcGVyYXRpb25zLiBSZWdhcmRsZXNzLCB0aGUgZmlyc3Qgc3RlcCBpcyBhbHdheXMgdG8gZ28gc3RyYWlnaHQgdG8gdGhlIHNvdXJjZSBhbmQgc2VlICpob3cqIHRoaXMgY3J1Y2lhbCBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgYW5kIHdoYXQgY29udGV4dCBpcyBzaGFwaW5nIGl0cyBleGVjdXRpb24uIEkgd2FudCB0byBzZWUgaG93IHRoZSBmdXNlIGRhZW1vbiBpbnRlcmFjdHMgd2l0aCB0aGUga2VybmVsIHNwYWNlLiBLbm93aW5nIHdoZXJlIGl0IGlzIGJlaW5nIGNhbGxlZCBmcm9tIHdpbGwgaGVscCBpbmZvcm0gbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgaW50ZXJhY3Rpb25zIGJldHdlZW4gdXNlcnNwYWNlIGFuZCB0aGUga2VybmVsLCBhbmQgdGhlIHJlc291cmNlcyB0aGF0IGl0IG1heSBiZSBjb25zdW1pbmcuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIHBvdGVudGlhbCBib3R0bGVuZWNrcywgcmFjZSBjb25kaXRpb25zLCBvciBtYXliZSBldmVuIG9wcG9ydHVuaXRpZXMgdG8gcmVkdWNlIHVubmVjZXNzYXJ5IHN5c3RlbSBjYWxscyBvciBpbXByb3ZlIGNhY2hpbmcgc3RyYXRlZ2llcyByZWxhdGVkIHRvIGRpcmVjdG9yeSBoYW5kbGluZyB3aXRoaW4gdGhlIEZVU0UgZnJhbWV3b3JrLiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3Mgd2hhdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjggMDA6MDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZnVzZV9kaXJfb3BlbiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2Z1c2UmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZnVzZS9kaXIuYz0xODY2PXN0YXRpYyBjb25zdCBjaGFyICpmdXNlX2dldF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9mdXNlL2Rpci5jLTE5MDItXG5mcy9mdXNlL2Rpci5jOjE5MDM6c3RhdGljIGludCBmdXNlX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxuZnMvZnVzZS9kaXIuYy0xOTA0LXtcbi0tXG5mcy9mdXNlL2Rpci5jPTI0NDg9c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnVzZV9kaXJfb3BlcmF0aW9ucyA9IHtcbi0tXG5mcy9mdXNlL2Rpci5jLTI0NTEtXHQuaXRlcmF0ZV9zaGFyZWRcdD0gZnVzZV9yZWFkZGlyLFxuZnMvZnVzZS9kaXIuYzoyNDUyOlx0Lm9wZW5cdFx0PSBmdXNlX2Rpcl9vcGVuLFxuZnMvZnVzZS9kaXIuYy0yNDUzLVx0LnJlbGVhc2VcdD0gZnVzZV9kaXJfcmVsZWFzZSxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjggMDA6MDc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjAxMjUKCQkJCQkJCW91dHB1dDogMTg2CgkJCQkJCQl0aG91Z2h0czogNTE2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBGVVNFIGFuZCBWaXJ0aW8tZnMgQ2hhbmdlcyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBJIHNlZSB0aGF0IGBmdXNlX29wZW5gIGlzIGhvb2tlZCB1cCB0byBgZnVzZV9maWxlX29wZXJhdGlvbnMub3BlbmAsIGFuZCBgZnVzZV9kaXJfb3BlbmAgdG8gYGZ1c2VfZGlyX29wZXJhdGlvbnMub3BlbmAuIGBmdXNlX3N0YXRmc2AgaXMgaGFuZGxpbmcgdGhlIGBzdGF0X2ZzYCBzdXBlciBvcGVyYXRpb24uIGBmdXNlX2RvX3NldGF0dHJgIGlzIG5vdyBleHBvc2VkLCBhbmQgSSBzZWUgaXQmIzM5O3MgZGVjbGFyZWQgaW4gYGZ1c2VfaS5oYCwgYWNjZXNzaWJsZSBmcm9tIG91dHNpZGUsIGFuZCBgZnVzZV9kb19nZXRhdHRyYCBpcyBjYWxsZWQgd2l0aGluIGBkaXIuY2AuIEFsc28sIGB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZWAsIGlzIGJlaW5nIGNhbGxlZCBieSB0aGUgdmlydGlvLWZzIGNvbXBsZXRpb24gcm91dGluZXMgaW4gYHZpcnRpb19mcy5jYC4KCkkmIzM5O3ZlIGdvdCBhIGdvb2QgaGFuZGxlIG9uIHdoZXJlIHRoZXNlIGNoYW5nZXMgdG91Y2ggdGhlIGNvZGViYXNlLiBUaGUgbW9kaWZpZWQgZmlsZXMgaW5jbHVkZSBgZnMvZnVzZS9kaXIuY2AsIGBmcy9mdXNlL2ZpbGUuY2AsIGBmcy9mdXNlL2Z1c2VfaS5oYCwgYGZzL2Z1c2UvaW5vZGUuY2AsIGFuZCBvZiBjb3Vyc2UgYGZzL2Z1c2UvdmlydGlvX2ZzLmNgLCBwbHVzIHRoZSBzZWxmdGVzdHMuCgpBcyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgYEZVU0VfRlNgIGFuZCBgVklSVElPX0ZTYCBhcmUgdGhlIG9uZXMgcmVsZXZhbnQgdG8gdGhpcyBjaGFuZ2UuIE5vIG90aGVyIGZpbGVzIGFyZSBtb2RpZmllZCBpbiBrZXJuZWwgc3BhY2UuCgpOb3csIEkmIzM5O3ZlIGdvdCBhIHNvbGlkIGxpc3Qgb2Yga2V5IHN5bWJvbHMgZm9yIGZ1cnRoZXIgYW5hbHlzaXM6IGBmdXNlX2RvX3NldGF0dHJgLCBgZnVzZV9vcGVuYCwgYGZ1c2VfZGlyX29wZW5gLCBgZnVzZV9kb19nZXRhdHRyYCwgYGZ1c2Vfc3RhdGZzYCwgYGZ1c2VfcmVhZGxpbmtfZm9saW9gLCBhbmQgYHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlYC4KCkFuZCBoZXJlIGFyZSB0aGUgcmVsZXZhbnQgY29uZmlncyBJIG5lZWQgdG8gY29uc2lkZXIgZm9yIHRlc3Rpbmc6IGBGVVNFX0ZTYCwgYW5kIGBWSVJUSU9fRlNgLgoKVGhpcyBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcuIFRoZSBwYXRjaCBpcyBhYm91dCBpbXByb3ZpbmcgZXJyb3IgaGFuZGxpbmcgaW4gRlVTRSBhbmQgdmlydGlvLWZzLCBzcGVjaWZpY2FsbHkgd2hlbiBsaXZlIG5vZGUgSUQgcmVxdWVzdHMgZmFpbCB3aXRoIC1FTk9FTlQuIEl0JiMzOTtzIHRyYW5zbGF0aW5nIHRob3NlIGVycm9ycyB0byAtRVNUQUxFIChmb3IgZ2V0YXR0ciwgc2V0YXR0ciwgcmVhZGxpbmssIHN0YXRmcykgb3IgLUVPUEVOU1RBTEUgKGZvciBvcGVuL29wZW5kaXIpIHNvIHRoZSBWRlMgbGF5ZXIgY2FuIHJldHJ5IHRoZSBwYXRoIHJlc29sdXRpb24gd2l0aCBMT09LVVBfUkVWQUwuIFRoaXMgdG91Y2hlcyBjb3JlIEZVU0UgYmVoYXZpb3IgYWNyb3NzIHNldmVyYWwgb3BlcmF0aW9ucywgYm90aCBzdGFuZGFyZCBGVVNFIG1vdW50cyBhbmQgdmlydGlvLWZzLiBUZXN0aW5nIHRoaXMgdGhvcm91Z2hseSBpcyBpbXBvcnRhbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDAwOjA3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtGVVNFX0ZTJiMzNDssCiAgICAmIzM0O1ZJUlRJT19GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2Z1c2VfZG9fc2V0YXR0ciYjMzQ7LAogICAgJiMzNDtmdXNlX29wZW4mIzM0OywKICAgICYjMzQ7ZnVzZV9kaXJfb3BlbiYjMzQ7LAogICAgJiMzNDtmdXNlX2RvX2dldGF0dHImIzM0OywKICAgICYjMzQ7ZnVzZV9zdGF0ZnMmIzM0OywKICAgICYjMzQ7ZnVzZV9yZWFkbGlua19mb2xpbyYjMzQ7LAogICAgJiMzNDt2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCB1cGRhdGVzIGVycm9yIGhhbmRsaW5nIGZvciBsaXZlIG5vZGUgSURzIGluIEZVU0UgYW5kIHZpcnRpby1mcyB3aGVuIHRoZSB1c2VyL2hvc3Qgc2VydmVyIHJldHVybnMgLUVOT0VOVCwgdHJhbnNsYXRpbmcgaXQgdG8gLUVTVEFMRSBvciAtRU9QRU5TVEFMRSB0byB0cmlnZ2VyIFZGUyBwYXRoIGxvb2t1cCByZXRyaWVzIChMT09LVVBfUkVWQUwpLiBUaGVzZSBmdW5jdGlvbmFsIGNoYW5nZXMgaW1wYWN0IGNvcmUgZmlsZSBvcGVyYXRpb25zIChvcGVuLCBnZXRhdHRyLCBzZXRhdHRyLCByZWFkbGluaywgc3RhdGZzKSBpbiBGVVNFIGFuZCB2aXJ0aW8tZnMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0ZVU0VfRlMmIzM0OywKICAgICYjMzQ7VklSVElPX0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7ZnVzZV9kb19zZXRhdHRyJiMzNDssCiAgICAmIzM0O2Z1c2Vfb3BlbiYjMzQ7LAogICAgJiMzNDtmdXNlX2Rpcl9vcGVuJiMzNDssCiAgICAmIzM0O2Z1c2VfZG9fZ2V0YXR0ciYjMzQ7LAogICAgJiMzNDtmdXNlX3N0YXRmcyYjMzQ7LAogICAgJiMzNDtmdXNlX3JlYWRsaW5rX2ZvbGlvJiMzNDssCiAgICAmIzM0O3ZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHVwZGF0ZXMgZXJyb3IgaGFuZGxpbmcgZm9yIGxpdmUgbm9kZSBJRHMgaW4gRlVTRSBhbmQgdmlydGlvLWZzIHdoZW4gdGhlIHVzZXIvaG9zdCBzZXJ2ZXIgcmV0dXJucyAtRU5PRU5ULCB0cmFuc2xhdGluZyBpdCB0byAtRVNUQUxFIG9yIC1FT1BFTlNUQUxFIHRvIHRyaWdnZXIgVkZTIHBhdGggbG9va3VwIHJldHJpZXMgKExPT0tVUF9SRVZBTCkuIFRoZXNlIGZ1bmN0aW9uYWwgY2hhbmdlcyBpbXBhY3QgY29yZSBmaWxlIG9wZXJhdGlvbnMgKG9wZW4sIGdldGF0dHIsIHNldGF0dHIsIHJlYWRsaW5rLCBzdGF0ZnMpIGluIEZVU0UgYW5kIHZpcnRpby1mcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjggMDA6MDc8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAwMDowNzwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHNlcmllcyBtb2RpZmllcyBlcnJvciBjb2RlIGhhbmRsaW5nIGluIEZVU0UgYW5kIHZpcnRpby1mcyBieSB0cmFuc2xhdGluZyAtRU5PRU5UIHJlc3BvbnNlcyB0byAtRVNUQUxFIG9yIC1FT1BFTlNUQUxFIGZvciBvcGVyYXRpb25zIHJlZmVyZW5jaW5nIGlub2RlcyBieSBub2RlaWQgKGUuZy4sIEZVU0VfT1BFTiwgRlVTRV9PUEVORElSLCBGVVNFX0dFVEFUVFIsIEZVU0VfU0VUQVRUUiwgRlVTRV9SRUFETElOSywgRlVTRV9TVEFURlMpIHRvIGVuYWJsZSBWRlMgcGF0aCBsb29rdXAgcmV0cmllcyAocmV0cnlfZXN0YWxlKS5cblxuVGhpcyBjaGFuZ2UgcHVyZWx5IGFsdGVycyBpbnRlZ2VyIHJldHVybiB2YWx1ZXMvZXJybm8gY29kZXMgaW4gZXJyb3IgcGF0aHMuIEl0IGRvZXMgbm90IGludHJvZHVjZSBvciBtb2RpZnkgYW55IG1lbW9yeSBhbGxvY2F0aW9ucywgc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucywgYnVmZmVyIGNvcGllcyB0byB1c2Vyc3BhY2UsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3Mgb3IgaW5mb3JtYXRpb24gZGlzY2xvc3VyZSB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4gZGV0ZWN0aW9uLiBBbnkgY29udHJvbCBmbG93IG9yIGZ1bmN0aW9uYWwgcmVncmVzc2lvbiBpc3N1ZXMgYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQgdGVzdGluZyBhbmQgS0FTQU4gYnVpbGRzLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBiNGNjYTM0YjZmZWU5NDg2M2IxYmUyMDM5MjA5MzhlMWY0YWY5YmU0CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBBdWcgMjggMDA6MDU6MzAgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9mcy9mdXNlL2Rpci5jIGIvZnMvZnVzZS9kaXIuYwppbmRleCBlNDliNGU4NzRiMTVmLi4yMTdhMDM5OTkwNTA3IDEwMDY0NAotLS0gYS9mcy9mdXNlL2Rpci5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2Z1c2UvZGlyLmMKQEAgLTE1MzIsNiAmIzQzOzE1MzIsOCBAQCBzdGF0aWMgaW50IGZ1c2VfZG9fZ2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCWlmIChzdGF0KQogCQkJCWZ1c2VfZmlsbGF0dHIoaWRtYXAsIGlub2RlLCAmYW1wO291dGFyZy5hdHRyLCBzdGF0KTsKIAkJfQomIzQzOwl9IGVsc2UgewomIzQzOwkJZXJyID0gZnVzZV9zdGFsZV9pbm9kZV9lcnIoZXJyKTsKIAl9CiAJcmV0dXJuIGVycjsKIH0KQEAgLTE4NDgsNiAmIzQzOzE4NTAsNyBAQCBzdGF0aWMgaW50IGZ1c2VfcmVhZGxpbmtfZm9saW8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZvbGlvICpmb2xpbykKIAogCWZ1c2VfaW52YWxpZGF0ZV9hdGltZShpbm9kZSk7CiAKJiM0MzsJcmVzID0gZnVzZV9zdGFsZV9pbm9kZV9lcnIocmVzKTsKIAlpZiAocmVzICZsdDsgMCkKIAkJcmV0dXJuIHJlczsKIApAQCAtMTkxMCw2ICYjNDM7MTkxMywxMiBAQCBzdGF0aWMgaW50IGZ1c2VfZGlyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiAJCXJldHVybiBlcnI7CiAKIAllcnIgPSBmdXNlX2RvX29wZW4oZm0sIGdldF9ub2RlX2lkKGlub2RlKSwgZmlsZSwgdHJ1ZSk7CiYjNDM7CS8qCiYjNDM7CSAqIEFzIGluIGZ1c2Vfb3Blbl9jb21tb24oKTogYSBwYXRoIHdhbGsgc3RhbmRzIGJlaGluZCB0aGlzIG9wZW4sCiYjNDM7CSAqIHNvIHRoZSByZWZ1c2FsIGlzIEVPUEVOU1RBTEUgZm9yIHBhdGhfb3BlbmF0KCkgdG8gYW5zd2VyLgomIzQzOwkgKi8KJiM0MzsJaWYgKGVyciA9PSAtRU5PRU5UKQomIzQzOwkJZXJyID0gLUVPUEVOU1RBTEU7CiAJaWYgKCFlcnIpIHsKIAkJc3RydWN0IGZ1c2VfZmlsZSAqZmYgPSBmaWxlLSZndDtwcml2YXRlX2RhdGE7CiAKQEAgLTIyNDksNiAmIzQzOzIyNTgsNyBAQCBpbnQgZnVzZV9kb19zZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJaWYgKGVycikgewogCQlpZiAoZXJyID09IC1FSU5UUikKIAkJCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGlub2RlKTsKJiM0MzsJCWVyciA9IGZ1c2Vfc3RhbGVfaW5vZGVfZXJyKGVycik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCmRpZmYgLS1naXQgYS9mcy9mdXNlL2ZpbGUuYyBiL2ZzL2Z1c2UvZmlsZS5jCmluZGV4IDhkNjEzNWE2MTA4YTQuLjMwOGIxNWMzMGYzNGQgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZmlsZS5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2Z1c2UvZmlsZS5jCkBAIC0yNzksNiAmIzQzOzI3OSwxNyBAQCBzdGF0aWMgaW50IGZ1c2Vfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIAkJZnVzZV9zZXRfbm93cml0ZShpbm9kZSk7CiAKIAllcnIgPSBmdXNlX2RvX29wZW4oZm0sIGdldF9ub2RlX2lkKGlub2RlKSwgZmlsZSwgZmFsc2UpOwomIzQzOwkvKgomIzQzOwkgKiBUaGlzIG9wZW4gcmVhY2hlZCB0aGUgc2VydmVyIHRocm91Z2ggYSBwYXRoIHdhbGssIHNvIGEgcmVmdXNhbAomIzQzOwkgKiBmb3IgdGhlIGxpdmUgbm9kZWlkIGlzIHJlcG9ydGVkIGFzIEVPUEVOU1RBTEUgcmF0aGVyIHRoYW4gdGhlCiYjNDM7CSAqIEVTVEFMRSB0aGUgbm9kZWlkLW9ubHkgcmVxdWVzdHMgc2F5OiBwYXRoX29wZW5hdCgpIHBpY2tzIHRoZQomIzQzOwkgKiBjaGVhcGVzdCByZXRyeSBmb3IgdGhlIHdhbGsgaW4gcHJvZ3Jlc3MsIEVDSElMRCB1bmRlciBMT09LVVBfUkNVCiYjNDM7CSAqIGFuZCBFU1RBTEUgb3RoZXJ3aXNlLiBmdXNlX2ZpbGVfb3BlbigpIGlzIGxlZnQgYWxvbmUgYmVjYXVzZQomIzQzOwkgKiBmdXNlX3ByaXZfaW9jdGxfcHJlcGFyZSgpIHJlYWNoZXMgaXQgdG8gc2VydmUgRlNfSU9DX0dFVEZMQUdTLAomIzQzOwkgKiB3aXRoIG5vIG9wZW4gYmVoaW5kIGl0IHRvIHRyYW5zbGF0ZSB0aGUgaW50ZXJuYWwgZXJybm8uCiYjNDM7CSAqLwomIzQzOwlpZiAoZXJyID09IC1FTk9FTlQpCiYjNDM7CQllcnIgPSAtRU9QRU5TVEFMRTsKIAlpZiAoIWVycikgewogCQlmZiA9IGZpbGUtJmd0O3ByaXZhdGVfZGF0YTsKIAkJZXJyID0gZnVzZV9maW5pc2hfb3Blbihpbm9kZSwgZmlsZSk7CmRpZmYgLS1naXQgYS9mcy9mdXNlL2Z1c2VfaS5oIGIvZnMvZnVzZS9mdXNlX2kuaAppbmRleCBjOGQ0YzVmM2FmN2U4Li5lNmIyNTk3ZDZkZDZmIDEwMDY0NAotLS0gYS9mcy9mdXNlL2Z1c2VfaS5oCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2Z1c2UvZnVzZV9pLmgKQEAgLTEyNTAsNiAmIzQzOzEyNTAsMjUgQEAgdm9pZCBmdXNlX2lub2RlX3VuY2FjaGVkX2lvX2VuZChzdHJ1Y3QgZnVzZV9pbm9kZSAqZmkpOwogaW50IGZ1c2VfZmlsZV9pb19vcGVuKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIHZvaWQgZnVzZV9maWxlX2lvX3JlbGVhc2Uoc3RydWN0IGZ1c2VfZmlsZSAqZmYsIHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogCiYjNDM7LyoKJiM0MzsgKiBSZXBvcnQgYSByZXF1ZXN0IHJlZnVzZWQgZm9yIGEgbGl2ZSBub2RlaWQgYXMgc3RhbGUuCiYjNDM7ICoKJiM0MzsgKiBBIHJlcXVlc3QgdGhhdCBuYW1lcyBhIG5vZGVpZCBhbmQgbm90aGluZyBlbHNlIGlzIG9ubHkgc2VudCBmb3IgYW4KJiM0MzsgKiBpbm9kZSB0aGUgY2xpZW50IGhhcyBsb29rZWQgdXAgYW5kIGhvbGRzIGEgcmVmZXJlbmNlIHRvLCBhbmQgdGhlCiYjNDM7ICogc2VydmVyIG93ZXMgdGhlIGNsaWVudCB0aGF0IGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuCiYjNDM7ICogRU5PRU5UIGZyb20gdGhlIHNlcnZlciBkZXNjcmliZXMgdGhlIGlub2RlIGl0c2VsZiByYXRoZXIgdGhhbiBhIG5hbWUKJiM0MzsgKiB0aGF0IGhhcyBnb25lIGF3YXkuIFJlcG9ydCB0aGUgaGFuZGxlIGFzIHN0YWxlLCB3aGljaCB0aGUgY2FsbGVyCiYjNDM7ICogYW5zd2VycyBieSByZXNvbHZpbmcgdGhlIG5hbWUgYWdhaW4gdW5kZXIgTE9PS1VQX1JFVkFMIGFuZCBhY3Rpbmcgb24KJiM0MzsgKiB3aGF0ZXZlciBpdCByZWZlcnMgdG8gbm93LiBBIG5hbWUgdGhhdCByZWFsbHkgaGFzIGdvbmUgZmFpbHMgdGhhdAomIzQzOyAqIHNlY29uZCBsb29rdXAgYW5kIHRoZSBjYWxsZXIgc3RpbGwgc2VlcyBFTk9FTlQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgZnVzZV9zdGFsZV9pbm9kZV9lcnIoaW50IGVycikKJiM0Mzt7CiYjNDM7CWlmIChlcnIgPT0gLUVOT0VOVCkKJiM0MzsJCXJldHVybiAtRVNUQUxFOwomIzQzOwlyZXR1cm4gZXJyOwomIzQzO30KJiM0MzsKIC8qIGZpbGUuYyAqLwogc3RydWN0IGZ1c2VfZmlsZSAqZnVzZV9maWxlX29wZW4oc3RydWN0IGZ1c2VfbW91bnQgKmZtLCB1NjQgbm9kZWlkLAogCQkJCSB1bnNpZ25lZCBpbnQgb3Blbl9mbGFncywgYm9vbCBpc2Rpcik7CmRpZmYgLS1naXQgYS9mcy9mdXNlL2lub2RlLmMgYi9mcy9mdXNlL2lub2RlLmMKaW5kZXggZTk1NTJiZTM2MzdiYy4uY2RlMGE1MzM1MDg5NyAxMDA2NDQKLS0tIGEvZnMvZnVzZS9pbm9kZS5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2Z1c2UvaW5vZGUuYwpAQCAtNjY2LDcgJiM0Mzs2NjYsNyBAQCBzdGF0aWMgaW50IGZ1c2Vfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKIAllcnIgPSBmdXNlX3NpbXBsZV9yZXF1ZXN0KGZtLCAmYW1wO2FyZ3MpOwogCWlmICghZXJyKQogCQljb252ZXJ0X2Z1c2Vfc3RhdGZzKGJ1ZiwgJmFtcDtvdXRhcmcuc3QpOwotCXJldHVybiBlcnI7CiYjNDM7CXJldHVybiBmdXNlX3N0YWxlX2lub2RlX2VycihlcnIpOwogfQogCiBzdGF0aWMgc3RydWN0IGZ1c2Vfc3luY19idWNrZXQgKmZ1c2Vfc3luY19idWNrZXRfYWxsb2Modm9pZCkKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvdmlydGlvX2ZzLmMgYi9mcy9mdXNlL3ZpcnRpb19mcy5jCmluZGV4IGYxNWU1MTZlYmNiNWMuLjdiMDNiZjg3YzJhZTggMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvdmlydGlvX2ZzLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZnVzZS92aXJ0aW9fZnMuYwpAQCAtNzgwLDYgJiM0Mzs3ODAsNjYgQEAgc3RhdGljIGJvb2wgdmlydGlvX2ZzX3ZlcmlmeV9yZXNwb25zZShzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwgdW5zaWduZWQgaW50IGxlbikKIAlyZXR1cm4gdHJ1ZTsKIH0KIAomIzQzOy8qCiYjNDM7ICogUmVwb3J0IGEgcmVxdWVzdCByZWZ1c2VkIGZvciBhIGxpdmUgbm9kZWlkIGFzIHN0YWxlLgomIzQzOyAqCiYjNDM7ICogVGhlc2UgcmVxdWVzdHMgY2FycnkgYSBub2RlaWQgYW5kIG5vIG5hbWUsIHNvIHRoZSBjbGllbnQgb25seSBzZW5kcyB0aGVtIGZvcgomIzQzOyAqIGFuIGlub2RlIGl0IGhhcyBhbHJlYWR5IGxvb2tlZCB1cCBhbmQgaG9sZHMgYSByZWZlcmVuY2UgdG8sIGFuZCBhIHNlcnZlciBvd2VzCiYjNDM7ICogdGhlIGNsaWVudCB0aGF0IGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuIEEgc2VydmVyIGFuc3dlcmluZyB3aXRoCiYjNDM7ICogRU5PRU5UIGlzIGRlc2NyaWJpbmcgYSBoYW5kbGUgaXQgd2FzIG9ibGlnZWQgdG8gaG9ub3VyIHJhdGhlciB0aGFuIGEgbmFtZQomIzQzOyAqIHRoYXQgaGFzIGdvbmUgYXdheSwgYW5kIHRoZSBjYWxsZXIgaGFzIG5vIHJlYXNvbiB0byBkb3VidCBpdC4KJiM0MzsgKgomIzQzOyAqIFNheWluZyB0aGUgaGFuZGxlIGlzIHN0YWxlIGlzIHNvbWV0aGluZyB0aGUgY2FsbGVyIGtub3dzIGhvdyB0byBhbnN3ZXI6IGl0CiYjNDM7ICogcmVwZWF0cyB0aGUgbG9va3VwIHVuZGVyIExPT0tVUF9SRVZBTCBhbmQgYWN0cyBvbiB3aGF0ZXZlciB0aGUgbmFtZSByZWZlcnMgdG8KJiM0MzsgKiBub3cuIEEgbmFtZSB0aGF0IGdlbnVpbmVseSBoYXMgZ29uZSBmYWlscyB0aGUgcmV0cmllZCBsb29rdXAsIHNvIGEgY2FsbGVyCiYjNDM7ICogc3RpbGwgbGVhcm5zIGl0IGlzIGdvbmUuIHJldHJ5X2VzdGFsZSgpIGlzIHdoYXQgZG9lcyB0aGlzLCBhbmQgZnMvbmFtZWkuYywKJiM0MzsgKiBmcy9vcGVuLmMsIGZzL3N0YXQuYywgZnMvc3RhdGZzLmMsIGZzL3V0aW1lcy5jIGFuZCBmcy94YXR0ci5jIGFsbCByZWFjaCBpdCwKJiM0MzsgKiB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZSBjb252ZXJzaW9uIHVzZWZ1bCByYXRoZXIgdGhhbiBhIHJlbmFtZSBvZiB0aGUgZXJyb3IuCiYjNDM7ICoKJiM0MzsgKiBBIHJlcXVlc3QgdGhhdCBuYW1lcyBzb21ldGhpbmcgd2hpY2ggY2FuIGl0c2VsZiBiZSBhYnNlbnQgaXMgbGVmdCBhbG9uZSwKJiM0MzsgKiBiZWNhdXNlIEVOT0VOVCBpcyB0aGVuIGFtYmlndW91cyBhbmQgaXMgZnJlcXVlbnRseSB0aGUgYW5zd2VyIHRoZSBjYWxsZXIKJiM0MzsgKiBhc2tlZCBmb3IuIEZVU0VfTE9PS1VQIHJlcG9ydHMgYSBtaXNzaW5nIG5hbWUgaW4gYSBsaXZpbmcgZGlyZWN0b3J5IGFuZCB0aGUKJiM0MzsgKiBkaXJlY3Rvcnkgb3BlcmF0aW9ucyBjYXJyeSBhIHBhcmVudCBub2RlaWQgYmVzaWRlIG9uZSwgc28gbmVpdGhlciBjYW4gYmUKJiM0MzsgKiByZWFkIGFzIGEgc3RhdGVtZW50IGFib3V0IHRoZSBpbm9kZS4gVGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSByZXF1ZXN0cyBiZWxvbmcKJiM0MzsgKiB3aXRoIHRoZW06IHRoZXkgY2FycnkgYW4gYXR0cmlidXRlIG5hbWUsIGFuZCB3aGlsZSBhIHNlcnZlciBzaG91bGQgcmVwb3J0IGEKJiM0MzsgKiBtaXNzaW5nIGF0dHJpYnV0ZSBhcyBFTk9EQVRBLCBvbmUgdGhhdCBhbnN3ZXJzIEVOT0VOVCBpbnN0ZWFkIHdvdWxkIGhhdmUgYQomIzQzOyAqIGNvcnJlY3QgcmVwbHkgdHVybmVkIGludG8gYSByZXRyeSB0aGF0IGNhbm5vdCBzdWNjZWVkLgomIzQzOyAqCiYjNDM7ICogUmVxdWVzdHMgYWdhaW5zdCBhbiBhbHJlYWR5IG9wZW4gZGVzY3JpcHRvciBhcmUgYWxzbyBsZWZ0IGFsb25lLCBzaW5jZSB0aGVyZQomIzQzOyAqIGlzIG5vIGVxdWl2YWxlbnQgcmV0cnkgdG8gcmVhY2ggYW5kIGNvbnZlcnRpbmcgdGhlIGVycm9yIHdvdWxkIHJlbmFtZSBhCiYjNDM7ICogZmFpbHVyZSByYXRoZXIgdGhhbiByZXBhaXIgaXQsIGFuZCBGVVNFX0lPQ1RMIGFuZCBGVVNFX1BPTEwgaGFuZCB0aGUKJiM0MzsgKiBzZXJ2ZXImIzM5O3MgZXJybm8gdG8gdXNlcnNwYWNlIHZlcmJhdGltLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIHZpcnRpb19mc19maXh1cF9zdGFsZV9lcnJvcihzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKJiM0Mzt7CiYjNDM7CWlmIChyZXEtJmd0O291dC5oLmVycm9yICE9IC1FTk9FTlQpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CXN3aXRjaCAocmVxLSZndDtpbi5oLm9wY29kZSkgewomIzQzOwljYXNlIEZVU0VfT1BFTjoKJiM0MzsJY2FzZSBGVVNFX09QRU5ESVI6CiYjNDM7CQkvKgomIzQzOwkJICogQW4gb3BlbiBzYXlzIEVPUEVOU1RBTEUsIGFuZCBwYXRoX29wZW5hdCgpIGRlY2lkZXMgd2hhdCB0aGUKJiM0MzsJCSAqIHdhbGsgaW4gcHJvZ3Jlc3Mgc2hvdWxkIG1ha2Ugb2YgaXQ6IEVDSElMRCB1bmRlciBMT09LVVBfUkNVCiYjNDM7CQkgKiBzbyBpdCBkcm9wcyB0byBSRUYtd2FsaywgRVNUQUxFIG90aGVyd2lzZSBzbyB0aGUgbmFtZSBpcwomIzQzOwkJICogcmVzb2x2ZWQgYWdhaW4gdW5kZXIgTE9PS1VQX1JFVkFMLiBOYW1pbmcgRVNUQUxFIGhlcmUgd291bGQKJiM0MzsJCSAqIHRha2UgdGhlIHNlY29uZCBpbiBib3RoIGNhc2VzIGFuZCBza2lwIGEgY2hlYXBlciByZXRyeS4KJiM0MzsJCSAqLwomIzQzOwkJcmVxLSZndDtvdXQuaC5lcnJvciA9IC1FT1BFTlNUQUxFOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgRlVTRV9HRVRBVFRSOgomIzQzOwljYXNlIEZVU0VfU0VUQVRUUjoKJiM0MzsJY2FzZSBGVVNFX1JFQURMSU5LOgomIzQzOwljYXNlIEZVU0VfU1RBVEZTOgomIzQzOwkJLyoKJiM0MzsJCSAqIE5vdGhpbmcgdHJhbnNsYXRlcyBFT1BFTlNUQUxFIG91dHNpZGUgdGhlIG9wZW4gcGF0aCwgc28KJiM0MzsJCSAqIHRoZXNlIHNheSBFU1RBTEUgZGlyZWN0bHksIHdoaWNoIHJldHJ5X2VzdGFsZSgpIGFuc3dlcnMuCiYjNDM7CQkgKi8KJiM0MzsJCXJlcS0mZ3Q7b3V0LmguZXJyb3IgPSAtRVNUQUxFOwomIzQzOwkJYnJlYWs7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiAvKiBXb3JrIGZ1bmN0aW9uIGZvciByZXF1ZXN0IGNvbXBsZXRpb24gKi8KIHN0YXRpYyB2b2lkIHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlKHN0cnVjdCBmdXNlX3JlcSAqcmVxLAogCQkJCSAgICAgICBzdHJ1Y3QgdmlydGlvX2ZzX3ZxICpmc3ZxKQpAQCAtODEwLDYgJiM0Mzs4NzAsOCBAQCBzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZShzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwKIAogCWNsZWFyX2JpdChGUl9TRU5ULCAmYW1wO3JlcS0mZ3Q7ZmxhZ3MpOwogCiYjNDM7CXZpcnRpb19mc19maXh1cF9zdGFsZV9lcnJvcihyZXEpOwomIzQzOwogCWZ1c2VfcmVxdWVzdF9lbmQocmVxKTsKIAlzcGluX2xvY2soJmFtcDtmc3ZxLSZndDtsb2NrKTsKIAlkZWNfaW5fZmxpZ2h0X3JlcShmc3ZxKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZQppbmRleCBmYjUxNjAzZmU0MTk4Li45Y2IzMDQ4MTI4ZDViIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlLy5naXRpZ25vcmUKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uZ2l0aWdub3JlCkBAIC0xLDQgJiM0MzsxLDYgQEAKICMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQomIzQzO2Z1c2VfYWNsX2NhY2hlX3Rlc3QKIGZ1c2VfbW50CiYjNDM7ZnVzZV9lc3RhbGVfdGVzdAogZnVzZWN0bF90ZXN0CiB3cml0ZV9leHRlbmRfZW9mX3Rlc3QKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL01ha2VmaWxlCmluZGV4IDk1YTFlZTk0N2NhNzYuLmY1NjRjYjM3YjNhNWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9NYWtlZmlsZQpAQCAtNiwxMSAmIzQzOzYsMTIgQEAgVEVTVF9HRU5fUFJPR1MgOj0gZnVzZWN0bF90ZXN0CiBURVNUX0dFTl9QUk9HUyAmIzQzOz0gd3JpdGVfZXh0ZW5kX2VvZl90ZXN0CiBURVNUX0dFTl9GSUxFUyA6PSBmdXNlX21udAogCi0jIGZ1c2VfYWNsX2NhY2hlX3Rlc3QgcmVxdWlyZXMgbGliZnVzZTM7IGFkZCBpdCBvbmx5IHdoZW4gdGhlIGxpYnJhcnkgaXMgcHJlc2VudC4KLUFDTF9DRkxBR1MgOj0gJChzaGVsbCBwa2ctY29uZmlnIGZ1c2UzIC0tY2ZsYWdzIDImZ3Q7L2Rldi9udWxsKQotQUNMX0xETElCUyA6PSAkKHNoZWxsIHBrZy1jb25maWcgZnVzZTMgLS1saWJzIDImZ3Q7L2Rldi9udWxsKQotaWZuZXEgKCQoQUNMX0NGTEFHUyksKQomIzQzOyMgVGhlc2UgdGVzdHMgcmVxdWlyZSBsaWJmdXNlMzsgYWRkIHRoZW0gb25seSB3aGVuIHRoZSBsaWJyYXJ5IGlzIHByZXNlbnQuCiYjNDM7RlVTRTNfQ0ZMQUdTIDo9ICQoc2hlbGwgcGtnLWNvbmZpZyBmdXNlMyAtLWNmbGFncyAyJmd0Oy9kZXYvbnVsbCkKJiM0MztGVVNFM19MRExJQlMgOj0gJChzaGVsbCBwa2ctY29uZmlnIGZ1c2UzIC0tbGlicyAyJmd0Oy9kZXYvbnVsbCkKJiM0MztpZm5lcSAoJChGVVNFM19DRkxBR1MpLCkKIFRFU1RfR0VOX1BST0dTICYjNDM7PSBmdXNlX2FjbF9jYWNoZV90ZXN0CiYjNDM7VEVTVF9HRU5fUFJPR1MgJiM0Mzs9IGZ1c2VfZXN0YWxlX3Rlc3QKIGVuZGlmCiAKIGluY2x1ZGUgLi4vLi4vbGliLm1rCkBAIC0zMCw1ICYjNDM7MzEsOCBAQCBlbmRpZgogJChPVVRQVVQpL2Z1c2VfbW50OiBDRkxBR1MgJiM0Mzs9ICQoVkFSX0NGTEFHUykKICQoT1VUUFVUKS9mdXNlX21udDogTERMSUJTICYjNDM7PSAkKFZBUl9MRExJQlMpCiAKLSQoT1VUUFVUKS9mdXNlX2FjbF9jYWNoZV90ZXN0OiBDRkxBR1MgJiM0Mzs9ICQoQUNMX0NGTEFHUykKLSQoT1VUUFVUKS9mdXNlX2FjbF9jYWNoZV90ZXN0OiBMRExJQlMgJiM0Mzs9ICQoQUNMX0xETElCUykKJiM0MzskKE9VVFBVVCkvZnVzZV9hY2xfY2FjaGVfdGVzdDogQ0ZMQUdTICYjNDM7PSAkKEZVU0UzX0NGTEFHUykKJiM0MzskKE9VVFBVVCkvZnVzZV9hY2xfY2FjaGVfdGVzdDogTERMSUJTICYjNDM7PSAkKEZVU0UzX0xETElCUykKJiM0MzsKJiM0MzskKE9VVFBVVCkvZnVzZV9lc3RhbGVfdGVzdDogQ0ZMQUdTICYjNDM7PSAkKEZVU0UzX0NGTEFHUykKJiM0MzskKE9VVFBVVCkvZnVzZV9lc3RhbGVfdGVzdDogTERMSUJTICYjNDM7PSAkKEZVU0UzX0xETElCUykKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvZnVzZV9lc3RhbGVfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9mdXNlX2VzdGFsZV90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uODJiODQyZDNhNWY3YgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvZnVzZV9lc3RhbGVfdGVzdC5jCkBAIC0wLDAgJiM0MzsxLDQ1MCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBUZXN0OiBhIHJlcXVlc3QgcmVmdXNlZCBmb3IgYW4gaW5vZGUgdGhlIGNsaWVudCBzdGlsbCBob2xkcyBhIHJlZmVyZW5jZSB0bwomIzQzOyAqCiYjNDM7ICogRlVTRV9PUEVOLCBGVVNFX0dFVEFUVFIsIEZVU0VfU0VUQVRUUiwgRlVTRV9SRUFETElOSyBhbmQgRlVTRV9TVEFURlMgY2FycnkgYQomIzQzOyAqIG5vZGVpZCByYXRoZXIgdGhhbiBhIHBhdGguICBUaGUgY2xpZW50IG9ubHkgc2VuZHMgdGhlbSBmb3IgYW4gaW5vZGUgaXQgaGFzCiYjNDM7ICogYWxyZWFkeSBsb29rZWQgdXAgYW5kIGhvbGRzIGEgcmVmZXJlbmNlIHRvLCBhbmQgYSBzZXJ2ZXIgb3dlcyB0aGUgY2xpZW50IHRoYXQKJiM0MzsgKiBpbm9kZSB1bnRpbCBpdCBpcyBzZW50IEZVU0VfRk9SR0VULiAgQSBzZXJ2ZXIgdGhhdCBsZXRzIHRoZSBpbm9kZSBnbyBlYXJseSwKJiM0MzsgKiBhcyBvbmUgYmFja2luZyBhIHNoYXJlZCBkaXJlY3RvcnkgZG9lcyB3aGVuIHRoZSBuYW1lIGlzIHJlbmFtZWQgb3ZlciwgYW5zd2VycwomIzQzOyAqIHdpdGggRU5PRU5ULgomIzQzOyAqCiYjNDM7ICogT24gYW4gdW5maXhlZCBrZXJuZWwgdGhhdCBFTk9FTlQgaXMgcGFzc2VkIG91dCB1bmNoYW5nZWQuICBUaGUgcGF0aCB3YWxrIGhhcwomIzQzOyAqIG5vIHJlYXNvbiB0byBkb3VidCBpdCBhbmQgdGhlIGNhbGxlciBpcyB0b2xkIGEgZmlsZSBpcyBtaXNzaW5nIHdoZW4gaXQgbmV2ZXIKJiM0MzsgKiBzdG9wcGVkIGV4aXN0aW5nLiAgQ2FsbGVycyB0aGF0IHJlYWQgYSBtaXNzaW5nIGZpbGUgYXMgYW4gZW1wdHkgb25lIGFjdCBvbgomIzQzOyAqIHRoZSBlbXB0aW5lc3MuCiYjNDM7ICoKJiM0MzsgKiBGaXhlZCAoZnMvZnVzZS9maWxlLmMgYW5kIGZzL2Z1c2UvZGlyLmMpOiBFTk9FTlQgYmVjb21lcyBFU1RBTEUsIHdoaWNoCiYjNDM7ICogZGVzY3JpYmVzIHRoZSBoYW5kbGUgcmF0aGVyIHRoYW4gdGhlIG5hbWUuICBmaWxlbmFtZV9sb29rdXAoKSBhbmQKJiM0MzsgKiBkb19maWxwX29wZW4oKSBhbHJlYWR5IHJldHJ5IHdpdGggTE9PS1VQX1JFVkFMIG9uIEVTVEFMRSwgc28gdGhlIG5hbWUgaXMKJiM0MzsgKiByZXNvbHZlZCBhZ2FpbiBhbmQgdGhlIGlub2RlIGl0IHJlZmVycyB0byBub3cgaXMgdXNlZC4gIEEgbmFtZSB0aGF0IGhhcwomIzQzOyAqIGdlbnVpbmVseSBnb25lIGF3YXkgZmFpbHMgdGhlIHJldHJpZWQgbG9va3VwLCBzbyBFTk9FTlQgc3RpbGwgcmVhY2hlcyBhCiYjNDM7ICogY2FsbGVyIHRoYXQgZGVzZXJ2ZXMgaXQuCiYjNDM7ICoKJiM0MzsgKiBPbmx5IHJlcXVlc3RzIHJlYWNoYWJsZSB0aHJvdWdoIGEgcGF0aCB3YWxrIGFyZSBjb3ZlcmVkLCBiZWNhdXNlIHRoZSByZXRyeQomIzQzOyAqIGlzIHdoYXQgbWFrZXMgRVNUQUxFIHVzZWZ1bCBhbmQgdGhlIHdhbGsgaXMgd2hhdCBwZXJmb3JtcyBpdC4gIEFuIG9wZXJhdGlvbgomIzQzOyAqIG9uIGEgZGVzY3JpcHRvciBhbHJlYWR5IG9wZW4gaGFzIG5vIGVxdWl2YWxlbnQgcmVjb3ZlcnkuCiYjNDM7ICoKJiM0MzsgKiBUZXN0IG91dGxpbmU6CiYjNDM7ICogIDEuIE1vdW50IGEgbWluaW1hbCBGVVNFIGZzIGhvbGRpbmcgb25lIGZpbGUuCiYjNDM7ICogIDIuIFRoZSBzZXJ2ZXIgcmVmdXNlcyB0aGUgZmlyc3QgcmVxdWVzdCBvZiB0aGUga2luZCB1bmRlciB0ZXN0IGFuZCBhbGxvd3MKJiM0MzsgKiAgICAgZXZlcnkgb25lIGFmdGVyIGl0LCBzdGFuZGluZyBpbiBmb3IgYSBzZXJ2ZXIgdGhhdCByZWxlYXNlZCB0aGUgaW5vZGUgYW5kCiYjNDM7ICogICAgIGhhcyBzaW5jZSByZXNvbHZlZCB0aGUgbmFtZSBhZ2Fpbi4KJiM0MzsgKiAgMy4gb3BlbmF0KCkgdGhlIGZpbGUuCiYjNDM7ICogICAgIEJ1Z2d5OiAgRU5PRU5UIHJlYWNoZXMgdGhlIGNhbGxlciwgb25lIG9wZW4gd2FzIGFza2VkIGZvci4gIEZBSUwuCiYjNDM7ICogICAgIEZpeGVkOiAgdGhlIHdhbGsgcmV0cmllcywgdGhlIHNlY29uZCBvcGVuIGlzIGFsbG93ZWQsIHRoZSBkZXNjcmlwdG9yIGlzCiYjNDM7ICogICAgICAgICAgICAgcmV0dXJuZWQsIHR3byBvcGVucyB3ZXJlIGFza2VkIGZvci4gIFBBU1MuCiYjNDM7ICogIDQuIHN0YXQoKSwgY2htb2QoKSwgcmVhZGxpbmsoKSBhbmQgc3RhdGZzKCkgYnkgbmFtZSwgd2hpY2ggYXJlIHRoZSBzYW1lCiYjNDM7ICogICAgIHJlY292ZXJ5IHRocm91Z2ggRlVTRV9HRVRBVFRSLCBGVVNFX1NFVEFUVFIsIEZVU0VfUkVBRExJTksgYW5kCiYjNDM7ICogICAgIEZVU0VfU1RBVEZTLiAgRWFjaCBpcyByZWFjaGVkIHRocm91Z2ggYSBwYXRoIHdhbGssIHdoaWNoIGlzIHdoYXQgbWFrZXMKJiM0MzsgKiAgICAgdGhlIHJldHJ5IGF2YWlsYWJsZS4KJiM0MzsgKiAgNS4gT3BlbiBhIG5hbWUgdGhlIHNlcnZlciBkb2VzIG5vdCBoYXZlIGF0IGFsbC4KJiM0MzsgKiAgICAgQm90aDogICBFTk9FTlQsIGJlY2F1c2UgdGhlIGxvb2t1cCBmYWlscyByYXRoZXIgdGhhbiB0aGUgb3BlbiwgYW5kIGEKJiM0MzsgKiAgICAgICAgICAgICBmaWxlIHRoYXQgaXMgYWJzZW50IG11c3Qgc3RpbGwgbG9vayBhYnNlbnQuCiYjNDM7ICovCiYjNDM7CiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRQomIzQzOyNkZWZpbmUgRlVTRV9VU0VfVkVSU0lPTiAzNAomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtlcnJuby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmdXNlX2xvd2xldmVsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2xpbWl0cy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtwdGhyZWFkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRib29sLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc3RhdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc3RhdHZmcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdmZzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3VuaXN0ZC5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7Li4vLi4va3NlbGZ0ZXN0X2hhcm5lc3MuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBGSUxFX05BTUUJJiMzNDtoZWxkJiMzNDsKJiM0MzsjZGVmaW5lIExJTktfTkFNRQkmIzM0O2hlbGQtbGluayYjMzQ7CiYjNDM7I2RlZmluZSBBQlNFTlRfTkFNRQkmIzM0O25vLXN1Y2gtZmlsZSYjMzQ7CiYjNDM7I2RlZmluZSBGSUxFX0lOTwkyCiYjNDM7I2RlZmluZSBMSU5LX0lOTwkzCiYjNDM7I2RlZmluZSBDT05URU5UUwkmIzM0O3ByZXNlbnRcbiYjMzQ7CiYjNDM7I2RlZmluZSBMSU5LX1RBUkdFVAlGSUxFX05BTUUKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFdoaWNoIHJlcXVlc3QgdGhlIHNlcnZlciByZWZ1c2VzLCBhbmQgaG93IG1hbnkgdGltZXMuICBTaGFyZWQgd2l0aCB0aGUKJiM0MzsgKiBkYWVtb24gdGhyZWFkOyBvbmUgdGVzdCBydW5zIGF0IGEgdGltZSwgc28gcGxhaW4gaW50cy4KJiM0MzsgKgomIzQzOyAqIEV2ZXJ5IG9uZSBvZiB0aGVzZSBuYW1lcyBhbiBpbm9kZSBieSBub2RlaWQgcmF0aGVyIHRoYW4gYnkgbmFtZSwgc28gYQomIzQzOyAqIHJlZnVzYWwgb2YgYW55IG9mIHRoZW0gaXMgZGVzY3JpYmluZyBhIGhhbmRsZSByYXRoZXIgdGhhbiBhIG1pc3NpbmcgZmlsZS4KJiM0MzsgKiBGVVNFX0xPT0tVUCBpcyBkZWxpYmVyYXRlbHkgYWJzZW50OiBpdCBjYXJyaWVzIGEgbmFtZSwgc28gaXRzIEVOT0VOVCBpcyBhbgomIzQzOyAqIGFuc3dlciByYXRoZXIgdGhhbiBhIGZhdWx0LCBhbmQgYWJzZW50X25hbWVfc3RpbGxfcmVwb3J0c19hYnNlbnQgY292ZXJzIGl0LgomIzQzOyAqLwomIzQzO2VudW0gcmVmdXNlX3doYXQgewomIzQzOwlSRUZVU0VfTk9USElORywKJiM0MzsJUkVGVVNFX09QRU4sCiYjNDM7CVJFRlVTRV9HRVRBVFRSLAomIzQzOwlSRUZVU0VfU0VUQVRUUiwKJiM0MzsJUkVGVVNFX1JFQURMSU5LLAomIzQzOwlSRUZVU0VfU1RBVEZTLAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCB7CiYjNDM7CWVudW0gcmVmdXNlX3doYXQgd2hhdDsKJiM0MzsJaW50IHJlZnVzYWxzX2xlZnQ7CiYjNDM7CWludCBvcGVuc19zZWVuOwomIzQzOwlpbnQgZ2V0YXR0cnNfc2VlbjsKJiM0MzsJaW50IHNldGF0dHJzX3NlZW47CiYjNDM7CWludCByZWFkbGlua3Nfc2VlbjsKJiM0MzsJaW50IHN0YXRmc3Nfc2VlbjsKJiM0Mzt9IGdfZHM7CiYjNDM7CiYjNDM7LyogVHJ1ZSBvbmNlLCBmb3IgdGhlIHJlcXVlc3QgdW5kZXIgdGVzdCwgYW5kIHRoZW4gbmV2ZXIgYWdhaW4uICovCiYjNDM7c3RhdGljIGJvb2wgcmVmdXNlX25vdyhlbnVtIHJlZnVzZV93aGF0IHdoYXQpCiYjNDM7ewomIzQzOwlpZiAoZ19kcy53aGF0ICE9IHdoYXQgfHwgZ19kcy5yZWZ1c2Fsc19sZWZ0ICZsdDs9IDApCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CWdfZHMucmVmdXNhbHNfbGVmdC0tOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgZmlsbF9hdHRyKGZ1c2VfaW5vX3QgaW5vLCBzdHJ1Y3Qgc3RhdCAqc3QpCiYjNDM7ewomIzQzOwltZW1zZXQoc3QsIDAsIHNpemVvZigqc3QpKTsKJiM0MzsJc3QtJmd0O3N0X2lubyA9IGlubzsKJiM0MzsJLyoKJiM0MzsJICogT3duZWQgYnkgd2hvZXZlciBydW5zIHRoZSB0ZXN0LCBzbyB0aGF0IGNobW9kKCkgaXMgYSByZXF1ZXN0IHRoZQomIzQzOwkgKiBrZXJuZWwgd2lsbCBjYXJyeSB0aHJvdWdoIHRvIHRoZSBzZXJ2ZXIgcmF0aGVyIHRoYW4gcmVmdXNlIGl0c2VsZi4KJiM0MzsJICovCiYjNDM7CXN0LSZndDtzdF91aWQgPSBnZXR1aWQoKTsKJiM0MzsJc3QtJmd0O3N0X2dpZCA9IGdldGdpZCgpOwomIzQzOwlpZiAoaW5vID09IEZVU0VfUk9PVF9JRCkgewomIzQzOwkJc3QtJmd0O3N0X21vZGUgPSBTX0lGRElSIHwgMDc1NTsKJiM0MzsJCXN0LSZndDtzdF9ubGluayA9IDI7CiYjNDM7CX0gZWxzZSBpZiAoaW5vID09IExJTktfSU5PKSB7CiYjNDM7CQlzdC0mZ3Q7c3RfbW9kZSA9IFNfSUZMTksgfCAwNzc3OwomIzQzOwkJc3QtJmd0O3N0X25saW5rID0gMTsKJiM0MzsJCXN0LSZndDtzdF9zaXplID0gc2l6ZW9mKExJTktfVEFSR0VUKSAtIDE7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlzdC0mZ3Q7c3RfbW9kZSA9IFNfSUZSRUcgfCAwNjQ0OwomIzQzOwkJc3QtJmd0O3N0X25saW5rID0gMTsKJiM0MzsJCXN0LSZndDtzdF9zaXplID0gc2l6ZW9mKENPTlRFTlRTKSAtIDE7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdF9sb29rdXAoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgcGFyZW50LCBjb25zdCBjaGFyICpuYW1lKQomIzQzO3sKJiM0MzsJc3RydWN0IGZ1c2VfZW50cnlfcGFyYW0gZTsKJiM0MzsJZnVzZV9pbm9fdCBpbm87CiYjNDM7CiYjNDM7CWlmIChwYXJlbnQgIT0gRlVTRV9ST09UX0lEKQomIzQzOwkJaW5vID0gMDsKJiM0MzsJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCBGSUxFX05BTUUpKQomIzQzOwkJaW5vID0gRklMRV9JTk87CiYjNDM7CWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgTElOS19OQU1FKSkKJiM0MzsJCWlubyA9IExJTktfSU5POwomIzQzOwllbHNlCiYjNDM7CQlpbm8gPSAwOwomIzQzOwomIzQzOwlpZiAoIWlubykgewomIzQzOwkJZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CW1lbXNldCgmYW1wO2UsIDAsIHNpemVvZihlKSk7CiYjNDM7CWUuaW5vID0gaW5vOwomIzQzOwllLmF0dHJfdGltZW91dCA9IDA7CiYjNDM7CWUuZW50cnlfdGltZW91dCA9IDA7CiYjNDM7CWZpbGxfYXR0cihpbm8sICZhbXA7ZS5hdHRyKTsKJiM0MzsJZnVzZV9yZXBseV9lbnRyeShyZXEsICZhbXA7ZSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRfZ2V0YXR0cihmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8sCiYjNDM7CQkgICAgICBzdHJ1Y3QgZnVzZV9maWxlX2luZm8gKmZpKQomIzQzO3sKJiM0MzsJc3RydWN0IHN0YXQgc3Q7CiYjNDM7CiYjNDM7CSh2b2lkKWZpOwomIzQzOwkvKiBUaGUgcm9vdCBpcyBsZWZ0IGFsb25lOyByZWZ1c2luZyBpdCB3b3VsZCBicmVhayB0aGUgbW91bnQgaXRzZWxmLiAqLwomIzQzOwlpZiAoaW5vID09IEZJTEVfSU5PKSB7CiYjNDM7CQlnX2RzLmdldGF0dHJzX3NlZW4mIzQzOyYjNDM7OwomIzQzOwkJaWYgKHJlZnVzZV9ub3coUkVGVVNFX0dFVEFUVFIpKSB7CiYjNDM7CQkJZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpOwomIzQzOwkJCXJldHVybjsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlmaWxsX2F0dHIoaW5vLCAmYW1wO3N0KTsKJiM0MzsJZnVzZV9yZXBseV9hdHRyKHJlcSwgJmFtcDtzdCwgMCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRfb3BlbihmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8sIHN0cnVjdCBmdXNlX2ZpbGVfaW5mbyAqZmkpCiYjNDM7ewomIzQzOwlpZiAoaW5vICE9IEZJTEVfSU5PKSB7CiYjNDM7CQlmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJZ19kcy5vcGVuc19zZWVuJiM0MzsmIzQzOzsKJiM0MzsJaWYgKHJlZnVzZV9ub3coUkVGVVNFX09QRU4pKSB7CiYjNDM7CQkvKgomIzQzOwkJICogVGhlIGlub2RlIGlzIGdvbmUgYXMgZmFyIGFzIHRoaXMgc2VydmVyIGlzIGNvbmNlcm5lZCwgZXZlbgomIzQzOwkJICogdGhvdWdoIHRoZSBjbGllbnQgaXMgaG9sZGluZyBhIHJlZmVyZW5jZSB0byBpdCBhbmQgYXNrZWQgYnkKJiM0MzsJCSAqIG5vZGVpZCByYXRoZXIgdGhhbiBieSBuYW1lLgomIzQzOwkJICovCiYjNDM7CQlmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsJZnVzZV9yZXBseV9vcGVuKHJlcSwgZmkpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0X3JlYWQoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgaW5vLCBzaXplX3Qgc2l6ZSwgb2ZmX3Qgb2ZmLAomIzQzOwkJICAgc3RydWN0IGZ1c2VfZmlsZV9pbmZvICpmaSkKJiM0Mzt7CiYjNDM7CXNpemVfdCBsZW4gPSBzaXplb2YoQ09OVEVOVFMpIC0gMTsKJiM0MzsKJiM0MzsJKHZvaWQpZmk7CiYjNDM7CWlmIChpbm8gIT0gRklMRV9JTk8pIHsKJiM0MzsJCWZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwlpZiAoKHNpemVfdClvZmYgJmd0Oz0gbGVuKSB7CiYjNDM7CQlmdXNlX3JlcGx5X2J1ZihyZXEsIE5VTEwsIDApOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CWlmIChvZmYgJiM0Mzsgc2l6ZSAmZ3Q7IGxlbikKJiM0MzsJCXNpemUgPSBsZW4gLSBvZmY7CiYjNDM7CWZ1c2VfcmVwbHlfYnVmKHJlcSwgQ09OVEVOVFMgJiM0Mzsgb2ZmLCBzaXplKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdF9zZXRhdHRyKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubywgc3RydWN0IHN0YXQgKmF0dHIsCiYjNDM7CQkgICAgICBpbnQgdG9fc2V0LCBzdHJ1Y3QgZnVzZV9maWxlX2luZm8gKmZpKQomIzQzO3sKJiM0MzsJc3RydWN0IHN0YXQgc3Q7CiYjNDM7CiYjNDM7CSh2b2lkKWF0dHI7CiYjNDM7CSh2b2lkKXRvX3NldDsKJiM0MzsJKHZvaWQpZmk7CiYjNDM7CWlmIChpbm8gPT0gRklMRV9JTk8pIHsKJiM0MzsJCWdfZHMuc2V0YXR0cnNfc2VlbiYjNDM7JiM0Mzs7CiYjNDM7CQlpZiAocmVmdXNlX25vdyhSRUZVU0VfU0VUQVRUUikpIHsKJiM0MzsJCQlmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7CiYjNDM7CQkJcmV0dXJuOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CWZpbGxfYXR0cihpbm8sICZhbXA7c3QpOwomIzQzOwlmdXNlX3JlcGx5X2F0dHIocmVxLCAmYW1wO3N0LCAwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdF9yZWFkbGluayhmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8pCiYjNDM7ewomIzQzOwlpZiAoaW5vICE9IExJTktfSU5PKSB7CiYjNDM7CQlmdXNlX3JlcGx5X2VycihyZXEsIEVJTlZBTCk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJZ19kcy5yZWFkbGlua3Nfc2VlbiYjNDM7JiM0Mzs7CiYjNDM7CWlmIChyZWZ1c2Vfbm93KFJFRlVTRV9SRUFETElOSykpIHsKJiM0MzsJCWZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwlmdXNlX3JlcGx5X3JlYWRsaW5rKHJlcSwgTElOS19UQVJHRVQpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0X3N0YXRmcyhmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8pCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc3RhdHZmcyBzZnM7CiYjNDM7CiYjNDM7CSh2b2lkKWlubzsKJiM0MzsJZ19kcy5zdGF0ZnNzX3NlZW4mIzQzOyYjNDM7OwomIzQzOwlpZiAocmVmdXNlX25vdyhSRUZVU0VfU1RBVEZTKSkgewomIzQzOwkJZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CW1lbXNldCgmYW1wO3NmcywgMCwgc2l6ZW9mKHNmcykpOwomIzQzOwlzZnMuZl9ic2l6ZSA9IDUxMjsKJiM0MzsJc2ZzLmZfZnJzaXplID0gNTEyOwomIzQzOwlzZnMuZl9uYW1lbWF4ID0gTkFNRV9NQVg7CiYjNDM7CWZ1c2VfcmVwbHlfc3RhdGZzKHJlcSwgJmFtcDtzZnMpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGZ1c2VfbG93bGV2ZWxfb3BzIGZzX29wcyA9IHsKJiM0MzsJLmxvb2t1cAkJPSB0X2xvb2t1cCwKJiM0MzsJLmdldGF0dHIJPSB0X2dldGF0dHIsCiYjNDM7CS5zZXRhdHRyCT0gdF9zZXRhdHRyLAomIzQzOwkucmVhZGxpbmsJPSB0X3JlYWRsaW5rLAomIzQzOwkuc3RhdGZzCQk9IHRfc3RhdGZzLAomIzQzOwkub3BlbgkJPSB0X29wZW4sCiYjNDM7CS5yZWFkCQk9IHRfcmVhZCwKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyB2b2lkICpydW5fZGFlbW9uKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CWZ1c2Vfc2Vzc2lvbl9sb29wKChzdHJ1Y3QgZnVzZV9zZXNzaW9uICopYXJnKTsKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzOy8qIC0tLS0ga3NlbGZ0ZXN0IGhhcm5lc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiYjNDM7CiYjNDM7RklYVFVSRShvcGVuX2VzdGFsZSkgewomIzQzOwlzdHJ1Y3QgZnVzZV9zZXNzaW9uICpzZTsKJiM0MzsJY2hhciAgICAgICAgICAgICAgICAgbW91bnRwb2ludFtQQVRIX01BWF07CiYjNDM7CWNoYXIgICAgICAgICAgICAgICAgIGZpbGVfcGF0aFtQQVRIX01BWF07CiYjNDM7CWNoYXIgICAgICAgICAgICAgICAgIGxpbmtfcGF0aFtQQVRIX01BWF07CiYjNDM7CWNoYXIgICAgICAgICAgICAgICAgIGFic2VudF9wYXRoW1BBVEhfTUFYXTsKJiM0MzsJcHRocmVhZF90ICAgICAgICAgICAgdGhyZWFkOwomIzQzO307CiYjNDM7CiYjNDM7RklYVFVSRV9TRVRVUChvcGVuX2VzdGFsZSkKJiM0Mzt7CiYjNDM7CWNoYXIgKmZ1c2VfYXJndltdID0geyAmIzM0O2Z1c2VfZXN0YWxlX3Rlc3QmIzM0OywgTlVMTCB9OwomIzQzOwlzdHJ1Y3QgZnVzZV9hcmdzIGFyZ3MgPSBGVVNFX0FSR1NfSU5JVCgxLCBmdXNlX2FyZ3YpOwomIzQzOwomIzQzOwltZW1zZXQoJmFtcDtnX2RzLCAwLCBzaXplb2YoZ19kcykpOwomIzQzOwlnX2RzLndoYXQgPSBSRUZVU0VfTk9USElORzsKJiM0MzsJZ19kcy5yZWZ1c2Fsc19sZWZ0ID0gMTsKJiM0MzsKJiM0MzsJc3RyY3B5KHNlbGYtJmd0O21vdW50cG9pbnQsICYjMzQ7L3RtcC9vcGVuX2VzdGFsZV90ZXN0X1hYWFhYWCYjMzQ7KTsKJiM0MzsJaWYgKCFta2R0ZW1wKHNlbGYtJmd0O21vdW50cG9pbnQpKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7bWtkdGVtcDogJXMmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsKJiM0MzsJc25wcmludGYoc2VsZi0mZ3Q7ZmlsZV9wYXRoLCBzaXplb2Yoc2VsZi0mZ3Q7ZmlsZV9wYXRoKSwKJiM0MzsJCSAmIzM0OyVzLyYjMzQ7IEZJTEVfTkFNRSwgc2VsZi0mZ3Q7bW91bnRwb2ludCk7CiYjNDM7CXNucHJpbnRmKHNlbGYtJmd0O2xpbmtfcGF0aCwgc2l6ZW9mKHNlbGYtJmd0O2xpbmtfcGF0aCksCiYjNDM7CQkgJiMzNDslcy8mIzM0OyBMSU5LX05BTUUsIHNlbGYtJmd0O21vdW50cG9pbnQpOwomIzQzOwlzbnByaW50ZihzZWxmLSZndDthYnNlbnRfcGF0aCwgc2l6ZW9mKHNlbGYtJmd0O2Fic2VudF9wYXRoKSwKJiM0MzsJCSAmIzM0OyVzLyYjMzQ7IEFCU0VOVF9OQU1FLCBzZWxmLSZndDttb3VudHBvaW50KTsKJiM0MzsKJiM0MzsJc2VsZi0mZ3Q7c2UgPSBmdXNlX3Nlc3Npb25fbmV3KCZhbXA7YXJncywgJmFtcDtmc19vcHMsIHNpemVvZihmc19vcHMpLCBOVUxMKTsKJiM0MzsJaWYgKCFzZWxmLSZndDtzZSkgewomIzQzOwkJcm1kaXIoc2VsZi0mZ3Q7bW91bnRwb2ludCk7CiYjNDM7CQlTS0lQKHJldHVybiwgJiMzNDtmdXNlX3Nlc3Npb25fbmV3IGZhaWxlZCYjMzQ7KTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZnVzZV9zZXNzaW9uX21vdW50KHNlbGYtJmd0O3NlLCBzZWxmLSZndDttb3VudHBvaW50KSkgewomIzQzOwkJZnVzZV9zZXNzaW9uX2Rlc3Ryb3koc2VsZi0mZ3Q7c2UpOwomIzQzOwkJcm1kaXIoc2VsZi0mZ3Q7bW91bnRwb2ludCk7CiYjNDM7CQlTS0lQKHJldHVybiwgJiMzNDtmdXNlX3Nlc3Npb25fbW91bnQgZmFpbGVkIChubyBmdXNlcm1vdW50MyBvciBubyBwcml2aWxlZ2VzKSYjMzQ7KTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAocHRocmVhZF9jcmVhdGUoJmFtcDtzZWxmLSZndDt0aHJlYWQsIE5VTEwsIHJ1bl9kYWVtb24sIHNlbGYtJmd0O3NlKSkgewomIzQzOwkJZnVzZV9zZXNzaW9uX3VubW91bnQoc2VsZi0mZ3Q7c2UpOwomIzQzOwkJZnVzZV9zZXNzaW9uX2Rlc3Ryb3koc2VsZi0mZ3Q7c2UpOwomIzQzOwkJcm1kaXIoc2VsZi0mZ3Q7bW91bnRwb2ludCk7CiYjNDM7CQlTS0lQKHJldHVybiwgJiMzNDtwdGhyZWFkX2NyZWF0ZTogJXMmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJfQomIzQzOwomIzQzOwlmdXNlX29wdF9mcmVlX2FyZ3MoJmFtcDthcmdzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7RklYVFVSRV9URUFSRE9XTihvcGVuX2VzdGFsZSkKJiM0Mzt7CiYjNDM7CWZ1c2Vfc2Vzc2lvbl9leGl0KHNlbGYtJmd0O3NlKTsKJiM0MzsJZnVzZV9zZXNzaW9uX3VubW91bnQoc2VsZi0mZ3Q7c2UpOwomIzQzOwlwdGhyZWFkX2pvaW4oc2VsZi0mZ3Q7dGhyZWFkLCBOVUxMKTsKJiM0MzsJZnVzZV9zZXNzaW9uX2Rlc3Ryb3koc2VsZi0mZ3Q7c2UpOwomIzQzOwlybWRpcihzZWxmLSZndDttb3VudHBvaW50KTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX29wZW5faXNfcmV0cmllZCkKJiM0Mzt7CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJZ19kcy53aGF0ID0gUkVGVVNFX09QRU47CiYjNDM7CiYjNDM7CWZkID0gb3BlbihzZWxmLSZndDtmaWxlX3BhdGgsIE9fUkRPTkxZKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHJlZnVzYWwgZGVzY3JpYmVzIGEgaGFuZGxlIHRoZSBzZXJ2ZXIgc2hvdWxkIGhhdmUgaG9ub3VyZWQsIHNvCiYjNDM7CSAqIHRoZSB3YWxrIGlzIGVudGl0bGVkIHRvIHJlc29sdmUgdGhlIG5hbWUgYWdhaW4gYW5kIG9wZW4gd2hhdCBpdAomIzQzOwkgKiByZWZlcnMgdG8gbm93LiBSZXBvcnRpbmcgdGhlIGZpbGUgbWlzc2luZyBpbnN0ZWFkIGVuZHMgdGhlIHdhbGsuCiYjNDM7CSAqLwomIzQzOwlBU1NFUlRfR0UoZmQsIDApIHsKJiM0MzsJCVRIX0xPRygmIzM0O29wZW4gZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgb3BlbiByZXF1ZXN0KHMpJiMzNDssCiYjNDM7CQkgICAgICAgc3RyZXJyb3IoZXJybm8pLCBnX2RzLm9wZW5zX3NlZW4pOwomIzQzOwl9CiYjNDM7CUVYUEVDVF9FUSgyLCBnX2RzLm9wZW5zX3NlZW4pOwomIzQzOwljbG9zZShmZCk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihvcGVuX2VzdGFsZSwgcmVmdXNlZF9nZXRhdHRyX29uX3BhdGhfaXNfcmV0cmllZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzdGF0IHN0OwomIzQzOwomIzQzOwlnX2RzLndoYXQgPSBSRUZVU0VfR0VUQVRUUjsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogUmVhY2hlZCBieSBuYW1lLCBzbyB0aGUgd2FsayBjYW4gcmVzb2x2ZSBpdCBhZ2FpbiBhbmQgYXNrIGEgc2Vjb25kCiYjNDM7CSAqIHRpbWUsIHRoZSBzYW1lIHJlY292ZXJ5IHRoZSBvcGVuIGdldHMuCiYjNDM7CSAqLwomIzQzOwlBU1NFUlRfRVEoMCwgc3RhdChzZWxmLSZndDtmaWxlX3BhdGgsICZhbXA7c3QpKSB7CiYjNDM7CQlUSF9MT0coJiMzNDtzdGF0IGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIGdldGF0dHIgcmVxdWVzdChzKSYjMzQ7LAomIzQzOwkJICAgICAgIHN0cmVycm9yKGVycm5vKSwgZ19kcy5nZXRhdHRyc19zZWVuKTsKJiM0MzsJfQomIzQzOwlFWFBFQ1RfR1QoZ19kcy5nZXRhdHRyc19zZWVuLCAxKTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX3NldGF0dHJfb25fcGF0aF9pc19yZXRyaWVkKQomIzQzO3sKJiM0MzsJZ19kcy53aGF0ID0gUkVGVVNFX1NFVEFUVFI7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIGNobW9kKCkgcmVhY2hlcyB0aGUgaW5vZGUgYnkgbmFtZSwgc28gdGhlIHNhbWUgcmV0cnkgYXBwbGllczogdGhlCiYjNDM7CSAqIHJlZnVzYWwgZGVzY3JpYmVzIGEgaGFuZGxlIGFuZCB0aGUgd2FsayBtYXkgcmVzb2x2ZSB0aGUgbmFtZSBhZ2Fpbi4KJiM0MzsJICovCiYjNDM7CUFTU0VSVF9FUSgwLCBjaG1vZChzZWxmLSZndDtmaWxlX3BhdGgsIDA2MDApKSB7CiYjNDM7CQlUSF9MT0coJiMzNDtjaG1vZCBmYWlsZWQgd2l0aCAlcyBhZnRlciAlZCBzZXRhdHRyIHJlcXVlc3QocykmIzM0OywKJiM0MzsJCSAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMuc2V0YXR0cnNfc2Vlbik7CiYjNDM7CX0KJiM0MzsJRVhQRUNUX0dUKGdfZHMuc2V0YXR0cnNfc2VlbiwgMSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihvcGVuX2VzdGFsZSwgcmVmdXNlZF9yZWFkbGlua19vbl9wYXRoX2lzX3JldHJpZWQpCiYjNDM7ewomIzQzOwljaGFyIGJ1ZltQQVRIX01BWF07CiYjNDM7CXNzaXplX3QgbjsKJiM0MzsKJiM0MzsJZ19kcy53aGF0ID0gUkVGVVNFX1JFQURMSU5LOwomIzQzOwomIzQzOwluID0gcmVhZGxpbmsoc2VsZi0mZ3Q7bGlua19wYXRoLCBidWYsIHNpemVvZihidWYpIC0gMSk7CiYjNDM7CUFTU0VSVF9HRShuLCAwKSB7CiYjNDM7CQlUSF9MT0coJiMzNDtyZWFkbGluayBmYWlsZWQgd2l0aCAlcyBhZnRlciAlZCByZWFkbGluayByZXF1ZXN0KHMpJiMzNDssCiYjNDM7CQkgICAgICAgc3RyZXJyb3IoZXJybm8pLCBnX2RzLnJlYWRsaW5rc19zZWVuKTsKJiM0MzsJfQomIzQzOwlidWZbbl0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7CUVYUEVDVF9TVFJFUShMSU5LX1RBUkdFVCwgYnVmKTsKJiM0MzsJRVhQRUNUX0dUKGdfZHMucmVhZGxpbmtzX3NlZW4sIDEpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfc3RhdGZzX29uX3BhdGhfaXNfcmV0cmllZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzdGF0ZnMgc2ZzOwomIzQzOwomIzQzOwlnX2RzLndoYXQgPSBSRUZVU0VfU1RBVEZTOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBzdGF0ZnMoKSBkZXNjcmliZXMgdGhlIG1vdW50IHJhdGhlciB0aGFuIHRoZSBmaWxlLCBidXQgaXQgaXMgc3RpbGwKJiM0MzsJICogcmVhY2hlZCB0aHJvdWdoIGEgcGF0aCB3YWxrLCBzbyBhIHJlZnVzYWwgdGhhdCBuYW1lcyBhIGhhbmRsZSBpcwomIzQzOwkgKiByZXRyaWVkIHRoZSBzYW1lIHdheS4KJiM0MzsJICovCiYjNDM7CUFTU0VSVF9FUSgwLCBzdGF0ZnMoc2VsZi0mZ3Q7ZmlsZV9wYXRoLCAmYW1wO3NmcykpIHsKJiM0MzsJCVRIX0xPRygmIzM0O3N0YXRmcyBmYWlsZWQgd2l0aCAlcyBhZnRlciAlZCBzdGF0ZnMgcmVxdWVzdChzKSYjMzQ7LAomIzQzOwkJICAgICAgIHN0cmVycm9yKGVycm5vKSwgZ19kcy5zdGF0ZnNzX3NlZW4pOwomIzQzOwl9CiYjNDM7CUVYUEVDVF9HVChnX2RzLnN0YXRmc3Nfc2VlbiwgMSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihvcGVuX2VzdGFsZSwgYWJzZW50X25hbWVfc3RpbGxfcmVwb3J0c19hYnNlbnQpCiYjNDM7ewomIzQzOwlpbnQgZmQ7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEhlcmUgaXQgaXMgdGhlIGxvb2t1cCB0aGF0IGZhaWxzIHJhdGhlciB0aGFuIHRoZSBvcGVuLCBzbyBub3RoaW5nIGlzCiYjNDM7CSAqIGJlaW5nIGRlc2NyaWJlZCBhcyBzdGFsZSBhbmQgdGhlIGNhbGxlciBtdXN0IHN0aWxsIGJlIHRvbGQgdGhlIG5hbWUKJiM0MzsJICogaXMgbm90IHRoZXJlLgomIzQzOwkgKi8KJiM0MzsJZmQgPSBvcGVuKHNlbGYtJmd0O2Fic2VudF9wYXRoLCBPX1JET05MWSk7CiYjNDM7CUFTU0VSVF9MVChmZCwgMCk7CiYjNDM7CUVYUEVDVF9FUShFTk9FTlQsIGVycm5vKTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9IQVJORVNTX01BSU4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDAwOjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwMTI5CgkJCQkJCQlvdXRwdXQ6IDE5NQoJCQkJCQkJdGhvdWdodHM6IDEyNDAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHlzaXMgb2YgdGhlIEZVU0UgUGF0Y2ggU2VyaWVzIGFuZCBLTVNBTiBGdXp6aW5nIE5lZWRzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIFRoZSBvYmplY3RpdmUgaXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgRlVTRSBwYXRjaCBzZXJpZXMgd2FycmFudHMgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCBpdCBwcm9iYWJseSBkb2VzbiYjMzk7dCwgYnV0IGxldCYjMzk7cyBjb25maXJtLgoKVGhlIHBhdGNoIGZvY3VzZXMgb24gZXJyb3IgY29kZSB0cmFuc2xhdGlvbiB3aXRoaW4gdGhlIEZVU0Ugc3Vic3lzdGVtLiBTcGVjaWZpY2FsbHksIGl0IGNoYW5nZXMgaG93IGAtRU5PRU5UYCBpcyBoYW5kbGVkLCByZW1hcHBpbmcgaXQgdG8gYC1FU1RBTEVgIG9yIGAtRU9QRU5TVEFMRWAgaW4gdmFyaW91cyBmdW5jdGlvbnMgKGBmdXNlX2RvX2dldGF0dHJgLCBgZnVzZV9yZWFkbGlua19mb2xpb2AsIGBmdXNlX2Rpcl9vcGVuYCwgYGZ1c2VfZG9fc2V0YXR0cmAsIGBmdXNlX29wZW5gLCBgZnVzZV9zdGF0ZnNgLCBhbmQgYHZpcnRpb19mc19maXh1cF9zdGFsZV9lcnJvcmApLiBUaGlzIG1vZGlmaWNhdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRoZSBWRlMgcmV0cnkgbWVjaGFuaXNtIChgcmV0cnlfZXN0YWxlKClgIGFuZCBgcGF0aF9vcGVuYXQoKWApIG1vcmUgZWZmZWN0aXZlIHdoZW4gZGVhbGluZyB3aXRoIHN0YWxlIG5vZGUgSURzLgoKTXkgY29uY2VybnMgd2l0aCBLTVNBTiB0eXBpY2FsbHkgcmV2b2x2ZSBhcm91bmQgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGluZm9ybWF0aW9uIGxlYWtzLCBhbmQgc2ltaWxhciB2dWxuZXJhYmlsaXRpZXMuIEkgbmVlZCB0byBhc2NlcnRhaW4gaWYgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGFueSBvZiB0aG9zZSByaXNrcy4KCkZpcnN0LCBJIGV4YW1pbmVkIHdoZXRoZXIgdGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IG1lbW9yeSBhbGxvY2F0aW9ucy4gTm8sIGl0IGRvZXNuJiMzOTt0LiBTZWNvbmQsIEkgY2hlY2tlZCBpZiB0aGUgcGF0Y2ggaXMgaW52b2x2ZWQgaW4gYW55IGNvcHkgdG8gdXNlciBzcGFjZSwgY29weSBmcm9tIHVuaW5pdGlhbGl6ZWQgZGF0YSB0byB0aGUga2VybmVsIG9yIHVzZXIgYnVmZmVycy4gVGhlcmUmIzM5O3Mgbm8gaW52b2x2ZW1lbnQuIFRoaXJkLCBJIGluc3BlY3RlZCBpZiB0aGVyZSBpcyBhbnkgc3RydWN0dXJlIHBhZGRpbmcgbW9kaWZpY2F0aW9uIG9yIGNvbnRyb2wgZmxvdyBtb2RpZmljYXRpb25zIHdoaWNoIGNvdWxkIGFsbG93IHJlYWRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZXJlJiMzOTtzIG5vIHN1Y2ggbW9kaWZpY2F0aW9uLiBUaGUgY29yZSBjaGFuZ2UgaXMgc2ltcGx5IHJlbWFwcGluZyBpbnRlZ2VyIGVycm9yIHJldHVybiBjb2Rlcy4KClRvIGJlIGFic29sdXRlbHkgc3VyZSwgSSYjMzk7bGwgZ28gdGhyb3VnaCB0aGUgc3RhbmRhcmQgS01TQU4gcmlzayBhcmVhcyBhZ2FpbjoKCjEuICAqKktlcm5lbCBzdHJ1Y3R1cmVzIHRvIHVzZXJzcGFjZSoqOiBObyBuZXcga2VybmVsIHN0cnVjdHVyZXMgYXJlIGJlaW5nIHNlbnQgdG8gdXNlciBzcGFjZSB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcyBvciBwYWRkaW5nIG1pZ2h0IGJlIGFuIGlzc3VlLgoyLiAgKipDb25kaXRpb25hbCBsb2dpYyBiYXNlZCBvbiB1bmluaXRpYWxpemVkIGRhdGEqKjogVGhlcmUmIzM5O3Mgbm8gYnJhbmNoaW5nIG9yIGNvbmRpdGlvbmFsIGxvZ2ljIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy4KMy4gICoqQ29tcGxleCBkYXRhIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbioqOiBObyBuZXcgYWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgcmVhZCBsYXRlci4KNC4gICoqQm91bmRzIGNoZWNrcyBhbmQgYnVmZmVyIG1hbmlwdWxhdGlvbnMqKjogVGhlcmUgYXJlIG5vIG1vZGlmaWNhdGlvbnMgdG8gYm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgdGhhdCB3b3VsZCBhbGxvdyByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgZnJvbSBleGlzdGluZyBidWZmZXJzLgoKSW4gc2hvcnQsIHRoaXMgaXMgcHJpbWFyaWx5IGEgcmVtYXBwaW5nIG9mIGVycm9yIGNvZGVzIHRvIGVuc3VyZSB0aGUgVkZTIHByb3Blcmx5IHJldHJpZXMgc3RhbGUgaW5vZGVzLiBLTVNBTiBkZXRlY3RzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLiBUaGlzIHBhdGNoIGRvZXNuJiMzOTt0IGludHJvZHVjZSBhbnkgbmV3IG1lbW9yeSBhbGxvY2F0aW9ucywgY29weSBvcGVyYXRpb25zLCBidWZmZXIgbWFuaXB1bGF0aW9ucywgb3IgaW5mb3JtYXRpb24gbGVha3MuIFN0YW5kYXJkIEtBU0FOL3N5emthbGxlciBmdXp6aW5nIHNob3VsZCBiZSBzdWZmaWNpZW50IHRvIGV4ZXJjaXNlIHRoZSBGVVNFIGZpbGVzeXN0ZW0gYmVoYXZpb3IgYW5kIGVycm9yLWhhbmRsaW5nIHBhdGhzIGNvdmVyZWQgYnkgdGhpcyBwYXRjaC4gQSBkZWRpY2F0ZWQgS01TQU4gcnVuIGlzbiYjMzk7dCBuZWNlc3NhcnkgaGVyZS4KCk9rYXksIEkmIzM5O20gY29uZmlkZW50IGluIHRoYXQgY29uY2x1c2lvbi4gTGV0JiMzOTtzIGNhbGwgdGhlIGBzZXQtcmVzdWx0c2AgdG9vbCBhbmQgbWFyayB0aGlzIGFzIG5vdCByZXF1aXJpbmcgS01TQU4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDAwOjA3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHNlcmllcyBtb2RpZmllcyBlcnJvciBjb2RlIGhhbmRsaW5nIGluIEZVU0UgYW5kIHZpcnRpby1mcyBieSB0cmFuc2xhdGluZyAtRU5PRU5UIHJlc3BvbnNlcyB0byAtRVNUQUxFIG9yIC1FT1BFTlNUQUxFIGZvciBvcGVyYXRpb25zIHJlZmVyZW5jaW5nIGlub2RlcyBieSBub2RlaWQgKGUuZy4sIEZVU0VfT1BFTiwgRlVTRV9PUEVORElSLCBGVVNFX0dFVEFUVFIsIEZVU0VfU0VUQVRUUiwgRlVTRV9SRUFETElOSywgRlVTRV9TVEFURlMpIHRvIGVuYWJsZSBWRlMgcGF0aCBsb29rdXAgcmV0cmllcyAocmV0cnlfZXN0YWxlKS5cblxuVGhpcyBjaGFuZ2UgcHVyZWx5IGFsdGVycyBpbnRlZ2VyIHJldHVybiB2YWx1ZXMvZXJybm8gY29kZXMgaW4gZXJyb3IgcGF0aHMuIEl0IGRvZXMgbm90IGludHJvZHVjZSBvciBtb2RpZnkgYW55IG1lbW9yeSBhbGxvY2F0aW9ucywgc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucywgYnVmZmVyIGNvcGllcyB0byB1c2Vyc3BhY2UsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3Mgb3IgaW5mb3JtYXRpb24gZGlzY2xvc3VyZSB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4gZGV0ZWN0aW9uLiBBbnkgY29udHJvbCBmbG93IG9yIGZ1bmN0aW9uYWwgcmVncmVzc2lvbiBpc3N1ZXMgYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQgdGVzdGluZyBhbmQgS0FTQU4gYnVpbGRzLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIG1vZGlmaWVzIGVycm9yIGNvZGUgaGFuZGxpbmcgaW4gRlVTRSBhbmQgdmlydGlvLWZzIGJ5IHRyYW5zbGF0aW5nIC1FTk9FTlQgcmVzcG9uc2VzIHRvIC1FU1RBTEUgb3IgLUVPUEVOU1RBTEUgZm9yIG9wZXJhdGlvbnMgcmVmZXJlbmNpbmcgaW5vZGVzIGJ5IG5vZGVpZCAoZS5nLiwgRlVTRV9PUEVOLCBGVVNFX09QRU5ESVIsIEZVU0VfR0VUQVRUUiwgRlVTRV9TRVRBVFRSLCBGVVNFX1JFQURMSU5LLCBGVVNFX1NUQVRGUykgdG8gZW5hYmxlIFZGUyBwYXRoIGxvb2t1cCByZXRyaWVzIChyZXRyeV9lc3RhbGUpLlxuXG5UaGlzIGNoYW5nZSBwdXJlbHkgYWx0ZXJzIGludGVnZXIgcmV0dXJuIHZhbHVlcy9lcnJubyBjb2RlcyBpbiBlcnJvciBwYXRocy4gSXQgZG9lcyBub3QgaW50cm9kdWNlIG9yIG1vZGlmeSBhbnkgbWVtb3J5IGFsbG9jYXRpb25zLCBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLCBidWZmZXIgY29waWVzIHRvIHVzZXJzcGFjZSwgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2VzcyBvciBpbmZvcm1hdGlvbiBkaXNjbG9zdXJlIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBkZXRlY3Rpb24uIEFueSBjb250cm9sIGZsb3cgb3IgZnVuY3Rpb25hbCByZWdyZXNzaW9uIGlzc3VlcyBhcmUgY292ZXJlZCBieSBzdGFuZGFyZCB0ZXN0aW5nIGFuZCBLQVNBTiBidWlsZHMuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDAwOjA1OjMxLjc5MjkwMjI5OFoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzNDY3Mjc0NzU5NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJGVVNFX0ZTXCIsXG4gICAgXCJWSVJUSU9fRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJmdXNlX2RvX3NldGF0dHJcIixcbiAgICBcImZ1c2Vfb3BlblwiLFxuICAgIFwiZnVzZV9kaXJfb3BlblwiLFxuICAgIFwiZnVzZV9kb19nZXRhdHRyXCIsXG4gICAgXCJmdXNlX3N0YXRmc1wiLFxuICAgIFwiZnVzZV9yZWFkbGlua19mb2xpb1wiLFxuICAgIFwidmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGVcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNlcmllcyBtb2RpZmllcyBlcnJvciBjb2RlIGhhbmRsaW5nIGluIEZVU0UgYW5kIHZpcnRpby1mcyBieSB0cmFuc2xhdGluZyAtRU5PRU5UIHJlc3BvbnNlcyB0byAtRVNUQUxFIG9yIC1FT1BFTlNUQUxFIGZvciBvcGVyYXRpb25zIHJlZmVyZW5jaW5nIGlub2RlcyBieSBub2RlaWQgKGUuZy4sIEZVU0VfT1BFTiwgRlVTRV9PUEVORElSLCBGVVNFX0dFVEFUVFIsIEZVU0VfU0VUQVRUUiwgRlVTRV9SRUFETElOSywgRlVTRV9TVEFURlMpIHRvIGVuYWJsZSBWRlMgcGF0aCBsb29rdXAgcmV0cmllcyAocmV0cnlfZXN0YWxlKS5cXG5cXG5UaGlzIGNoYW5nZSBwdXJlbHkgYWx0ZXJzIGludGVnZXIgcmV0dXJuIHZhbHVlcy9lcnJubyBjb2RlcyBpbiBlcnJvciBwYXRocy4gSXQgZG9lcyBub3QgaW50cm9kdWNlIG9yIG1vZGlmeSBhbnkgbWVtb3J5IGFsbG9jYXRpb25zLCBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLCBidWZmZXIgY29waWVzIHRvIHVzZXJzcGFjZSwgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2VzcyBvciBpbmZvcm1hdGlvbiBkaXNjbG9zdXJlIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBkZXRlY3Rpb24uIEFueSBjb250cm9sIGZsb3cgb3IgZnVuY3Rpb25hbCByZWdyZXNzaW9uIGlzc3VlcyBhcmUgY292ZXJlZCBieSBzdGFuZGFyZCB0ZXN0aW5nIGFuZCBLQVNBTiBidWlsZHMuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggdXBkYXRlcyBlcnJvciBoYW5kbGluZyBmb3IgbGl2ZSBub2RlIElEcyBpbiBGVVNFIGFuZCB2aXJ0aW8tZnMgd2hlbiB0aGUgdXNlci9ob3N0IHNlcnZlciByZXR1cm5zIC1FTk9FTlQsIHRyYW5zbGF0aW5nIGl0IHRvIC1FU1RBTEUgb3IgLUVPUEVOU1RBTEUgdG8gdHJpZ2dlciBWRlMgcGF0aCBsb29rdXAgcmV0cmllcyAoTE9PS1VQX1JFVkFMKS4gVGhlc2UgZnVuY3Rpb25hbCBjaGFuZ2VzIGltcGFjdCBjb3JlIGZpbGUgb3BlcmF0aW9ucyAob3BlbiwgZ2V0YXR0ciwgc2V0YXR0ciwgcmVhZGxpbmssIHN0YXRmcykgaW4gRlVTRSBhbmQgdmlydGlvLWZzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQwMDowNTozMS43OTI5MTAzODhaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUzNTc3MjQwMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGI0Y2NhMzRiNmZlZTk0ODYzYjFiZTIwMzkyMDkzOGUxZjRhZjliZTRcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIEZyaSBBdWcgMjggMDA6MDU6MzAgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvZnMvZnVzZS9kaXIuYyBiL2ZzL2Z1c2UvZGlyLmNcXG5pbmRleCBlNDliNGU4NzRiMTVmLi4yMTdhMDM5OTkwNTA3IDEwMDY0NFxcbi0tLSBhL2ZzL2Z1c2UvZGlyLmNcXG4rKysgYi9mcy9mdXNlL2Rpci5jXFxuQEAgLTE1MzIsNiArMTUzMiw4IEBAIHN0YXRpYyBpbnQgZnVzZV9kb19nZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiBcXHRcXHRcXHRpZiAoc3RhdClcXG4gXFx0XFx0XFx0XFx0ZnVzZV9maWxsYXR0cihpZG1hcCwgaW5vZGUsIFxcdTAwMjZvdXRhcmcuYXR0ciwgc3RhdCk7XFxuIFxcdFxcdH1cXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0ZXJyID0gZnVzZV9zdGFsZV9pbm9kZV9lcnIoZXJyKTtcXG4gXFx0fVxcbiBcXHRyZXR1cm4gZXJyO1xcbiB9XFxuQEAgLTE4NDgsNiArMTg1MCw3IEBAIHN0YXRpYyBpbnQgZnVzZV9yZWFkbGlua19mb2xpbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiBcXG4gXFx0ZnVzZV9pbnZhbGlkYXRlX2F0aW1lKGlub2RlKTtcXG4gXFxuK1xcdHJlcyA9IGZ1c2Vfc3RhbGVfaW5vZGVfZXJyKHJlcyk7XFxuIFxcdGlmIChyZXMgXFx1MDAzYyAwKVxcbiBcXHRcXHRyZXR1cm4gcmVzO1xcbiBcXG5AQCAtMTkxMCw2ICsxOTEzLDEyIEBAIHN0YXRpYyBpbnQgZnVzZV9kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcXG4gXFx0XFx0cmV0dXJuIGVycjtcXG4gXFxuIFxcdGVyciA9IGZ1c2VfZG9fb3BlbihmbSwgZ2V0X25vZGVfaWQoaW5vZGUpLCBmaWxlLCB0cnVlKTtcXG4rXFx0LypcXG4rXFx0ICogQXMgaW4gZnVzZV9vcGVuX2NvbW1vbigpOiBhIHBhdGggd2FsayBzdGFuZHMgYmVoaW5kIHRoaXMgb3BlbixcXG4rXFx0ICogc28gdGhlIHJlZnVzYWwgaXMgRU9QRU5TVEFMRSBmb3IgcGF0aF9vcGVuYXQoKSB0byBhbnN3ZXIuXFxuK1xcdCAqL1xcbitcXHRpZiAoZXJyID09IC1FTk9FTlQpXFxuK1xcdFxcdGVyciA9IC1FT1BFTlNUQUxFO1xcbiBcXHRpZiAoIWVycikge1xcbiBcXHRcXHRzdHJ1Y3QgZnVzZV9maWxlICpmZiA9IGZpbGUtXFx1MDAzZXByaXZhdGVfZGF0YTtcXG4gXFxuQEAgLTIyNDksNiArMjI1OCw3IEBAIGludCBmdXNlX2RvX3NldGF0dHIoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSxcXG4gXFx0aWYgKGVycikge1xcbiBcXHRcXHRpZiAoZXJyID09IC1FSU5UUilcXG4gXFx0XFx0XFx0ZnVzZV9pbnZhbGlkYXRlX2F0dHIoaW5vZGUpO1xcbitcXHRcXHRlcnIgPSBmdXNlX3N0YWxlX2lub2RlX2VycihlcnIpO1xcbiBcXHRcXHRnb3RvIGVycm9yO1xcbiBcXHR9XFxuIFxcbmRpZmYgLS1naXQgYS9mcy9mdXNlL2ZpbGUuYyBiL2ZzL2Z1c2UvZmlsZS5jXFxuaW5kZXggOGQ2MTM1YTYxMDhhNC4uMzA4YjE1YzMwZjM0ZCAxMDA2NDRcXG4tLS0gYS9mcy9mdXNlL2ZpbGUuY1xcbisrKyBiL2ZzL2Z1c2UvZmlsZS5jXFxuQEAgLTI3OSw2ICsyNzksMTcgQEAgc3RhdGljIGludCBmdXNlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXFxuIFxcdFxcdGZ1c2Vfc2V0X25vd3JpdGUoaW5vZGUpO1xcbiBcXG4gXFx0ZXJyID0gZnVzZV9kb19vcGVuKGZtLCBnZXRfbm9kZV9pZChpbm9kZSksIGZpbGUsIGZhbHNlKTtcXG4rXFx0LypcXG4rXFx0ICogVGhpcyBvcGVuIHJlYWNoZWQgdGhlIHNlcnZlciB0aHJvdWdoIGEgcGF0aCB3YWxrLCBzbyBhIHJlZnVzYWxcXG4rXFx0ICogZm9yIHRoZSBsaXZlIG5vZGVpZCBpcyByZXBvcnRlZCBhcyBFT1BFTlNUQUxFIHJhdGhlciB0aGFuIHRoZVxcbitcXHQgKiBFU1RBTEUgdGhlIG5vZGVpZC1vbmx5IHJlcXVlc3RzIHNheTogcGF0aF9vcGVuYXQoKSBwaWNrcyB0aGVcXG4rXFx0ICogY2hlYXBlc3QgcmV0cnkgZm9yIHRoZSB3YWxrIGluIHByb2dyZXNzLCBFQ0hJTEQgdW5kZXIgTE9PS1VQX1JDVVxcbitcXHQgKiBhbmQgRVNUQUxFIG90aGVyd2lzZS4gZnVzZV9maWxlX29wZW4oKSBpcyBsZWZ0IGFsb25lIGJlY2F1c2VcXG4rXFx0ICogZnVzZV9wcml2X2lvY3RsX3ByZXBhcmUoKSByZWFjaGVzIGl0IHRvIHNlcnZlIEZTX0lPQ19HRVRGTEFHUyxcXG4rXFx0ICogd2l0aCBubyBvcGVuIGJlaGluZCBpdCB0byB0cmFuc2xhdGUgdGhlIGludGVybmFsIGVycm5vLlxcbitcXHQgKi9cXG4rXFx0aWYgKGVyciA9PSAtRU5PRU5UKVxcbitcXHRcXHRlcnIgPSAtRU9QRU5TVEFMRTtcXG4gXFx0aWYgKCFlcnIpIHtcXG4gXFx0XFx0ZmYgPSBmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxuIFxcdFxcdGVyciA9IGZ1c2VfZmluaXNoX29wZW4oaW5vZGUsIGZpbGUpO1xcbmRpZmYgLS1naXQgYS9mcy9mdXNlL2Z1c2VfaS5oIGIvZnMvZnVzZS9mdXNlX2kuaFxcbmluZGV4IGM4ZDRjNWYzYWY3ZTguLmU2YjI1OTdkNmRkNmYgMTAwNjQ0XFxuLS0tIGEvZnMvZnVzZS9mdXNlX2kuaFxcbisrKyBiL2ZzL2Z1c2UvZnVzZV9pLmhcXG5AQCAtMTI1MCw2ICsxMjUwLDI1IEBAIHZvaWQgZnVzZV9pbm9kZV91bmNhY2hlZF9pb19lbmQoc3RydWN0IGZ1c2VfaW5vZGUgKmZpKTtcXG4gaW50IGZ1c2VfZmlsZV9pb19vcGVuKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTtcXG4gdm9pZCBmdXNlX2ZpbGVfaW9fcmVsZWFzZShzdHJ1Y3QgZnVzZV9maWxlICpmZiwgc3RydWN0IGlub2RlICppbm9kZSk7XFxuIFxcbisvKlxcbisgKiBSZXBvcnQgYSByZXF1ZXN0IHJlZnVzZWQgZm9yIGEgbGl2ZSBub2RlaWQgYXMgc3RhbGUuXFxuKyAqXFxuKyAqIEEgcmVxdWVzdCB0aGF0IG5hbWVzIGEgbm9kZWlkIGFuZCBub3RoaW5nIGVsc2UgaXMgb25seSBzZW50IGZvciBhblxcbisgKiBpbm9kZSB0aGUgY2xpZW50IGhhcyBsb29rZWQgdXAgYW5kIGhvbGRzIGEgcmVmZXJlbmNlIHRvLCBhbmQgdGhlXFxuKyAqIHNlcnZlciBvd2VzIHRoZSBjbGllbnQgdGhhdCBpbm9kZSB1bnRpbCBpdCBpcyBzZW50IEZVU0VfRk9SR0VULlxcbisgKiBFTk9FTlQgZnJvbSB0aGUgc2VydmVyIGRlc2NyaWJlcyB0aGUgaW5vZGUgaXRzZWxmIHJhdGhlciB0aGFuIGEgbmFtZVxcbisgKiB0aGF0IGhhcyBnb25lIGF3YXkuIFJlcG9ydCB0aGUgaGFuZGxlIGFzIHN0YWxlLCB3aGljaCB0aGUgY2FsbGVyXFxuKyAqIGFuc3dlcnMgYnkgcmVzb2x2aW5nIHRoZSBuYW1lIGFnYWluIHVuZGVyIExPT0tVUF9SRVZBTCBhbmQgYWN0aW5nIG9uXFxuKyAqIHdoYXRldmVyIGl0IHJlZmVycyB0byBub3cuIEEgbmFtZSB0aGF0IHJlYWxseSBoYXMgZ29uZSBmYWlscyB0aGF0XFxuKyAqIHNlY29uZCBsb29rdXAgYW5kIHRoZSBjYWxsZXIgc3RpbGwgc2VlcyBFTk9FTlQuXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBmdXNlX3N0YWxlX2lub2RlX2VycihpbnQgZXJyKVxcbit7XFxuK1xcdGlmIChlcnIgPT0gLUVOT0VOVClcXG4rXFx0XFx0cmV0dXJuIC1FU1RBTEU7XFxuK1xcdHJldHVybiBlcnI7XFxuK31cXG4rXFxuIC8qIGZpbGUuYyAqL1xcbiBzdHJ1Y3QgZnVzZV9maWxlICpmdXNlX2ZpbGVfb3BlbihzdHJ1Y3QgZnVzZV9tb3VudCAqZm0sIHU2NCBub2RlaWQsXFxuIFxcdFxcdFxcdFxcdCB1bnNpZ25lZCBpbnQgb3Blbl9mbGFncywgYm9vbCBpc2Rpcik7XFxuZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvaW5vZGUuYyBiL2ZzL2Z1c2UvaW5vZGUuY1xcbmluZGV4IGU5NTUyYmUzNjM3YmMuLmNkZTBhNTMzNTA4OTcgMTAwNjQ0XFxuLS0tIGEvZnMvZnVzZS9pbm9kZS5jXFxuKysrIGIvZnMvZnVzZS9pbm9kZS5jXFxuQEAgLTY2Niw3ICs2NjYsNyBAQCBzdGF0aWMgaW50IGZ1c2Vfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZilcXG4gXFx0ZXJyID0gZnVzZV9zaW1wbGVfcmVxdWVzdChmbSwgXFx1MDAyNmFyZ3MpO1xcbiBcXHRpZiAoIWVycilcXG4gXFx0XFx0Y29udmVydF9mdXNlX3N0YXRmcyhidWYsIFxcdTAwMjZvdXRhcmcuc3QpO1xcbi1cXHRyZXR1cm4gZXJyO1xcbitcXHRyZXR1cm4gZnVzZV9zdGFsZV9pbm9kZV9lcnIoZXJyKTtcXG4gfVxcbiBcXG4gc3RhdGljIHN0cnVjdCBmdXNlX3N5bmNfYnVja2V0ICpmdXNlX3N5bmNfYnVja2V0X2FsbG9jKHZvaWQpXFxuZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvdmlydGlvX2ZzLmMgYi9mcy9mdXNlL3ZpcnRpb19mcy5jXFxuaW5kZXggZjE1ZTUxNmViY2I1Yy4uN2IwM2JmODdjMmFlOCAxMDA2NDRcXG4tLS0gYS9mcy9mdXNlL3ZpcnRpb19mcy5jXFxuKysrIGIvZnMvZnVzZS92aXJ0aW9fZnMuY1xcbkBAIC03ODAsNiArNzgwLDY2IEBAIHN0YXRpYyBib29sIHZpcnRpb19mc192ZXJpZnlfcmVzcG9uc2Uoc3RydWN0IGZ1c2VfcmVxICpyZXEsIHVuc2lnbmVkIGludCBsZW4pXFxuIFxcdHJldHVybiB0cnVlO1xcbiB9XFxuIFxcbisvKlxcbisgKiBSZXBvcnQgYSByZXF1ZXN0IHJlZnVzZWQgZm9yIGEgbGl2ZSBub2RlaWQgYXMgc3RhbGUuXFxuKyAqXFxuKyAqIFRoZXNlIHJlcXVlc3RzIGNhcnJ5IGEgbm9kZWlkIGFuZCBubyBuYW1lLCBzbyB0aGUgY2xpZW50IG9ubHkgc2VuZHMgdGhlbSBmb3JcXG4rICogYW4gaW5vZGUgaXQgaGFzIGFscmVhZHkgbG9va2VkIHVwIGFuZCBob2xkcyBhIHJlZmVyZW5jZSB0bywgYW5kIGEgc2VydmVyIG93ZXNcXG4rICogdGhlIGNsaWVudCB0aGF0IGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuIEEgc2VydmVyIGFuc3dlcmluZyB3aXRoXFxuKyAqIEVOT0VOVCBpcyBkZXNjcmliaW5nIGEgaGFuZGxlIGl0IHdhcyBvYmxpZ2VkIHRvIGhvbm91ciByYXRoZXIgdGhhbiBhIG5hbWVcXG4rICogdGhhdCBoYXMgZ29uZSBhd2F5LCBhbmQgdGhlIGNhbGxlciBoYXMgbm8gcmVhc29uIHRvIGRvdWJ0IGl0LlxcbisgKlxcbisgKiBTYXlpbmcgdGhlIGhhbmRsZSBpcyBzdGFsZSBpcyBzb21ldGhpbmcgdGhlIGNhbGxlciBrbm93cyBob3cgdG8gYW5zd2VyOiBpdFxcbisgKiByZXBlYXRzIHRoZSBsb29rdXAgdW5kZXIgTE9PS1VQX1JFVkFMIGFuZCBhY3RzIG9uIHdoYXRldmVyIHRoZSBuYW1lIHJlZmVycyB0b1xcbisgKiBub3cuIEEgbmFtZSB0aGF0IGdlbnVpbmVseSBoYXMgZ29uZSBmYWlscyB0aGUgcmV0cmllZCBsb29rdXAsIHNvIGEgY2FsbGVyXFxuKyAqIHN0aWxsIGxlYXJucyBpdCBpcyBnb25lLiByZXRyeV9lc3RhbGUoKSBpcyB3aGF0IGRvZXMgdGhpcywgYW5kIGZzL25hbWVpLmMsXFxuKyAqIGZzL29wZW4uYywgZnMvc3RhdC5jLCBmcy9zdGF0ZnMuYywgZnMvdXRpbWVzLmMgYW5kIGZzL3hhdHRyLmMgYWxsIHJlYWNoIGl0LFxcbisgKiB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZSBjb252ZXJzaW9uIHVzZWZ1bCByYXRoZXIgdGhhbiBhIHJlbmFtZSBvZiB0aGUgZXJyb3IuXFxuKyAqXFxuKyAqIEEgcmVxdWVzdCB0aGF0IG5hbWVzIHNvbWV0aGluZyB3aGljaCBjYW4gaXRzZWxmIGJlIGFic2VudCBpcyBsZWZ0IGFsb25lLFxcbisgKiBiZWNhdXNlIEVOT0VOVCBpcyB0aGVuIGFtYmlndW91cyBhbmQgaXMgZnJlcXVlbnRseSB0aGUgYW5zd2VyIHRoZSBjYWxsZXJcXG4rICogYXNrZWQgZm9yLiBGVVNFX0xPT0tVUCByZXBvcnRzIGEgbWlzc2luZyBuYW1lIGluIGEgbGl2aW5nIGRpcmVjdG9yeSBhbmQgdGhlXFxuKyAqIGRpcmVjdG9yeSBvcGVyYXRpb25zIGNhcnJ5IGEgcGFyZW50IG5vZGVpZCBiZXNpZGUgb25lLCBzbyBuZWl0aGVyIGNhbiBiZVxcbisgKiByZWFkIGFzIGEgc3RhdGVtZW50IGFib3V0IHRoZSBpbm9kZS4gVGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSByZXF1ZXN0cyBiZWxvbmdcXG4rICogd2l0aCB0aGVtOiB0aGV5IGNhcnJ5IGFuIGF0dHJpYnV0ZSBuYW1lLCBhbmQgd2hpbGUgYSBzZXJ2ZXIgc2hvdWxkIHJlcG9ydCBhXFxuKyAqIG1pc3NpbmcgYXR0cmlidXRlIGFzIEVOT0RBVEEsIG9uZSB0aGF0IGFuc3dlcnMgRU5PRU5UIGluc3RlYWQgd291bGQgaGF2ZSBhXFxuKyAqIGNvcnJlY3QgcmVwbHkgdHVybmVkIGludG8gYSByZXRyeSB0aGF0IGNhbm5vdCBzdWNjZWVkLlxcbisgKlxcbisgKiBSZXF1ZXN0cyBhZ2FpbnN0IGFuIGFscmVhZHkgb3BlbiBkZXNjcmlwdG9yIGFyZSBhbHNvIGxlZnQgYWxvbmUsIHNpbmNlIHRoZXJlXFxuKyAqIGlzIG5vIGVxdWl2YWxlbnQgcmV0cnkgdG8gcmVhY2ggYW5kIGNvbnZlcnRpbmcgdGhlIGVycm9yIHdvdWxkIHJlbmFtZSBhXFxuKyAqIGZhaWx1cmUgcmF0aGVyIHRoYW4gcmVwYWlyIGl0LCBhbmQgRlVTRV9JT0NUTCBhbmQgRlVTRV9QT0xMIGhhbmQgdGhlXFxuKyAqIHNlcnZlcidzIGVycm5vIHRvIHVzZXJzcGFjZSB2ZXJiYXRpbS5cXG4rICovXFxuK3N0YXRpYyB2b2lkIHZpcnRpb19mc19maXh1cF9zdGFsZV9lcnJvcihzdHJ1Y3QgZnVzZV9yZXEgKnJlcSlcXG4re1xcbitcXHRpZiAocmVxLVxcdTAwM2VvdXQuaC5lcnJvciAhPSAtRU5PRU5UKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRzd2l0Y2ggKHJlcS1cXHUwMDNlaW4uaC5vcGNvZGUpIHtcXG4rXFx0Y2FzZSBGVVNFX09QRU46XFxuK1xcdGNhc2UgRlVTRV9PUEVORElSOlxcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBBbiBvcGVuIHNheXMgRU9QRU5TVEFMRSwgYW5kIHBhdGhfb3BlbmF0KCkgZGVjaWRlcyB3aGF0IHRoZVxcbitcXHRcXHQgKiB3YWxrIGluIHByb2dyZXNzIHNob3VsZCBtYWtlIG9mIGl0OiBFQ0hJTEQgdW5kZXIgTE9PS1VQX1JDVVxcbitcXHRcXHQgKiBzbyBpdCBkcm9wcyB0byBSRUYtd2FsaywgRVNUQUxFIG90aGVyd2lzZSBzbyB0aGUgbmFtZSBpc1xcbitcXHRcXHQgKiByZXNvbHZlZCBhZ2FpbiB1bmRlciBMT09LVVBfUkVWQUwuIE5hbWluZyBFU1RBTEUgaGVyZSB3b3VsZFxcbitcXHRcXHQgKiB0YWtlIHRoZSBzZWNvbmQgaW4gYm90aCBjYXNlcyBhbmQgc2tpcCBhIGNoZWFwZXIgcmV0cnkuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRyZXEtXFx1MDAzZW91dC5oLmVycm9yID0gLUVPUEVOU1RBTEU7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRjYXNlIEZVU0VfR0VUQVRUUjpcXG4rXFx0Y2FzZSBGVVNFX1NFVEFUVFI6XFxuK1xcdGNhc2UgRlVTRV9SRUFETElOSzpcXG4rXFx0Y2FzZSBGVVNFX1NUQVRGUzpcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogTm90aGluZyB0cmFuc2xhdGVzIEVPUEVOU1RBTEUgb3V0c2lkZSB0aGUgb3BlbiBwYXRoLCBzb1xcbitcXHRcXHQgKiB0aGVzZSBzYXkgRVNUQUxFIGRpcmVjdGx5LCB3aGljaCByZXRyeV9lc3RhbGUoKSBhbnN3ZXJzLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0cmVxLVxcdTAwM2VvdXQuaC5lcnJvciA9IC1FU1RBTEU7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHR9XFxuK31cXG4rXFxuIC8qIFdvcmsgZnVuY3Rpb24gZm9yIHJlcXVlc3QgY29tcGxldGlvbiAqL1xcbiBzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZShzdHJ1Y3QgZnVzZV9yZXEgKnJlcSxcXG4gXFx0XFx0XFx0XFx0ICAgICAgIHN0cnVjdCB2aXJ0aW9fZnNfdnEgKmZzdnEpXFxuQEAgLTgxMCw2ICs4NzAsOCBAQCBzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZShzdHJ1Y3QgZnVzZV9yZXEgKnJlcSxcXG4gXFxuIFxcdGNsZWFyX2JpdChGUl9TRU5ULCBcXHUwMDI2cmVxLVxcdTAwM2VmbGFncyk7XFxuIFxcbitcXHR2aXJ0aW9fZnNfZml4dXBfc3RhbGVfZXJyb3IocmVxKTtcXG4rXFxuIFxcdGZ1c2VfcmVxdWVzdF9lbmQocmVxKTtcXG4gXFx0c3Bpbl9sb2NrKFxcdTAwMjZmc3ZxLVxcdTAwM2Vsb2NrKTtcXG4gXFx0ZGVjX2luX2ZsaWdodF9yZXEoZnN2cSk7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZVxcbmluZGV4IGZiNTE2MDNmZTQxOTguLjljYjMwNDgxMjhkNWIgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uZ2l0aWdub3JlXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uZ2l0aWdub3JlXFxuQEAgLTEsNCArMSw2IEBAXFxuICMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbitmdXNlX2FjbF9jYWNoZV90ZXN0XFxuIGZ1c2VfbW50XFxuK2Z1c2VfZXN0YWxlX3Rlc3RcXG4gZnVzZWN0bF90ZXN0XFxuIHdyaXRlX2V4dGVuZF9lb2ZfdGVzdFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9NYWtlZmlsZVxcbmluZGV4IDk1YTFlZTk0N2NhNzYuLmY1NjRjYjM3YjNhNWIgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9NYWtlZmlsZVxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvTWFrZWZpbGVcXG5AQCAtNiwxMSArNiwxMiBAQCBURVNUX0dFTl9QUk9HUyA6PSBmdXNlY3RsX3Rlc3RcXG4gVEVTVF9HRU5fUFJPR1MgKz0gd3JpdGVfZXh0ZW5kX2VvZl90ZXN0XFxuIFRFU1RfR0VOX0ZJTEVTIDo9IGZ1c2VfbW50XFxuIFxcbi0jIGZ1c2VfYWNsX2NhY2hlX3Rlc3QgcmVxdWlyZXMgbGliZnVzZTM7IGFkZCBpdCBvbmx5IHdoZW4gdGhlIGxpYnJhcnkgaXMgcHJlc2VudC5cXG4tQUNMX0NGTEFHUyA6PSAkKHNoZWxsIHBrZy1jb25maWcgZnVzZTMgLS1jZmxhZ3MgMlxcdTAwM2UvZGV2L251bGwpXFxuLUFDTF9MRExJQlMgOj0gJChzaGVsbCBwa2ctY29uZmlnIGZ1c2UzIC0tbGlicyAyXFx1MDAzZS9kZXYvbnVsbClcXG4taWZuZXEgKCQoQUNMX0NGTEFHUyksKVxcbisjIFRoZXNlIHRlc3RzIHJlcXVpcmUgbGliZnVzZTM7IGFkZCB0aGVtIG9ubHkgd2hlbiB0aGUgbGlicmFyeSBpcyBwcmVzZW50LlxcbitGVVNFM19DRkxBR1MgOj0gJChzaGVsbCBwa2ctY29uZmlnIGZ1c2UzIC0tY2ZsYWdzIDJcXHUwMDNlL2Rldi9udWxsKVxcbitGVVNFM19MRExJQlMgOj0gJChzaGVsbCBwa2ctY29uZmlnIGZ1c2UzIC0tbGlicyAyXFx1MDAzZS9kZXYvbnVsbClcXG4raWZuZXEgKCQoRlVTRTNfQ0ZMQUdTKSwpXFxuIFRFU1RfR0VOX1BST0dTICs9IGZ1c2VfYWNsX2NhY2hlX3Rlc3RcXG4rVEVTVF9HRU5fUFJPR1MgKz0gZnVzZV9lc3RhbGVfdGVzdFxcbiBlbmRpZlxcbiBcXG4gaW5jbHVkZSAuLi8uLi9saWIubWtcXG5AQCAtMzAsNSArMzEsOCBAQCBlbmRpZlxcbiAkKE9VVFBVVCkvZnVzZV9tbnQ6IENGTEFHUyArPSAkKFZBUl9DRkxBR1MpXFxuICQoT1VUUFVUKS9mdXNlX21udDogTERMSUJTICs9ICQoVkFSX0xETElCUylcXG4gXFxuLSQoT1VUUFVUKS9mdXNlX2FjbF9jYWNoZV90ZXN0OiBDRkxBR1MgKz0gJChBQ0xfQ0ZMQUdTKVxcbi0kKE9VVFBVVCkvZnVzZV9hY2xfY2FjaGVfdGVzdDogTERMSUJTICs9ICQoQUNMX0xETElCUylcXG4rJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IENGTEFHUyArPSAkKEZVU0UzX0NGTEFHUylcXG4rJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IExETElCUyArPSAkKEZVU0UzX0xETElCUylcXG4rXFxuKyQoT1VUUFVUKS9mdXNlX2VzdGFsZV90ZXN0OiBDRkxBR1MgKz0gJChGVVNFM19DRkxBR1MpXFxuKyQoT1VUUFVUKS9mdXNlX2VzdGFsZV90ZXN0OiBMRExJQlMgKz0gJChGVVNFM19MRExJQlMpXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvZnVzZV9lc3RhbGVfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9mdXNlX2VzdGFsZV90ZXN0LmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjgyYjg0MmQzYTVmN2JcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9mdXNlX2VzdGFsZV90ZXN0LmNcXG5AQCAtMCwwICsxLDQ1MCBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBUZXN0OiBhIHJlcXVlc3QgcmVmdXNlZCBmb3IgYW4gaW5vZGUgdGhlIGNsaWVudCBzdGlsbCBob2xkcyBhIHJlZmVyZW5jZSB0b1xcbisgKlxcbisgKiBGVVNFX09QRU4sIEZVU0VfR0VUQVRUUiwgRlVTRV9TRVRBVFRSLCBGVVNFX1JFQURMSU5LIGFuZCBGVVNFX1NUQVRGUyBjYXJyeSBhXFxuKyAqIG5vZGVpZCByYXRoZXIgdGhhbiBhIHBhdGguICBUaGUgY2xpZW50IG9ubHkgc2VuZHMgdGhlbSBmb3IgYW4gaW5vZGUgaXQgaGFzXFxuKyAqIGFscmVhZHkgbG9va2VkIHVwIGFuZCBob2xkcyBhIHJlZmVyZW5jZSB0bywgYW5kIGEgc2VydmVyIG93ZXMgdGhlIGNsaWVudCB0aGF0XFxuKyAqIGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuICBBIHNlcnZlciB0aGF0IGxldHMgdGhlIGlub2RlIGdvIGVhcmx5LFxcbisgKiBhcyBvbmUgYmFja2luZyBhIHNoYXJlZCBkaXJlY3RvcnkgZG9lcyB3aGVuIHRoZSBuYW1lIGlzIHJlbmFtZWQgb3ZlciwgYW5zd2Vyc1xcbisgKiB3aXRoIEVOT0VOVC5cXG4rICpcXG4rICogT24gYW4gdW5maXhlZCBrZXJuZWwgdGhhdCBFTk9FTlQgaXMgcGFzc2VkIG91dCB1bmNoYW5nZWQuICBUaGUgcGF0aCB3YWxrIGhhc1xcbisgKiBubyByZWFzb24gdG8gZG91YnQgaXQgYW5kIHRoZSBjYWxsZXIgaXMgdG9sZCBhIGZpbGUgaXMgbWlzc2luZyB3aGVuIGl0IG5ldmVyXFxuKyAqIHN0b3BwZWQgZXhpc3RpbmcuICBDYWxsZXJzIHRoYXQgcmVhZCBhIG1pc3NpbmcgZmlsZSBhcyBhbiBlbXB0eSBvbmUgYWN0IG9uXFxuKyAqIHRoZSBlbXB0aW5lc3MuXFxuKyAqXFxuKyAqIEZpeGVkIChmcy9mdXNlL2ZpbGUuYyBhbmQgZnMvZnVzZS9kaXIuYyk6IEVOT0VOVCBiZWNvbWVzIEVTVEFMRSwgd2hpY2hcXG4rICogZGVzY3JpYmVzIHRoZSBoYW5kbGUgcmF0aGVyIHRoYW4gdGhlIG5hbWUuICBmaWxlbmFtZV9sb29rdXAoKSBhbmRcXG4rICogZG9fZmlscF9vcGVuKCkgYWxyZWFkeSByZXRyeSB3aXRoIExPT0tVUF9SRVZBTCBvbiBFU1RBTEUsIHNvIHRoZSBuYW1lIGlzXFxuKyAqIHJlc29sdmVkIGFnYWluIGFuZCB0aGUgaW5vZGUgaXQgcmVmZXJzIHRvIG5vdyBpcyB1c2VkLiAgQSBuYW1lIHRoYXQgaGFzXFxuKyAqIGdlbnVpbmVseSBnb25lIGF3YXkgZmFpbHMgdGhlIHJldHJpZWQgbG9va3VwLCBzbyBFTk9FTlQgc3RpbGwgcmVhY2hlcyBhXFxuKyAqIGNhbGxlciB0aGF0IGRlc2VydmVzIGl0LlxcbisgKlxcbisgKiBPbmx5IHJlcXVlc3RzIHJlYWNoYWJsZSB0aHJvdWdoIGEgcGF0aCB3YWxrIGFyZSBjb3ZlcmVkLCBiZWNhdXNlIHRoZSByZXRyeVxcbisgKiBpcyB3aGF0IG1ha2VzIEVTVEFMRSB1c2VmdWwgYW5kIHRoZSB3YWxrIGlzIHdoYXQgcGVyZm9ybXMgaXQuICBBbiBvcGVyYXRpb25cXG4rICogb24gYSBkZXNjcmlwdG9yIGFscmVhZHkgb3BlbiBoYXMgbm8gZXF1aXZhbGVudCByZWNvdmVyeS5cXG4rICpcXG4rICogVGVzdCBvdXRsaW5lOlxcbisgKiAgMS4gTW91bnQgYSBtaW5pbWFsIEZVU0UgZnMgaG9sZGluZyBvbmUgZmlsZS5cXG4rICogIDIuIFRoZSBzZXJ2ZXIgcmVmdXNlcyB0aGUgZmlyc3QgcmVxdWVzdCBvZiB0aGUga2luZCB1bmRlciB0ZXN0IGFuZCBhbGxvd3NcXG4rICogICAgIGV2ZXJ5IG9uZSBhZnRlciBpdCwgc3RhbmRpbmcgaW4gZm9yIGEgc2VydmVyIHRoYXQgcmVsZWFzZWQgdGhlIGlub2RlIGFuZFxcbisgKiAgICAgaGFzIHNpbmNlIHJlc29sdmVkIHRoZSBuYW1lIGFnYWluLlxcbisgKiAgMy4gb3BlbmF0KCkgdGhlIGZpbGUuXFxuKyAqICAgICBCdWdneTogIEVOT0VOVCByZWFjaGVzIHRoZSBjYWxsZXIsIG9uZSBvcGVuIHdhcyBhc2tlZCBmb3IuICBGQUlMLlxcbisgKiAgICAgRml4ZWQ6ICB0aGUgd2FsayByZXRyaWVzLCB0aGUgc2Vjb25kIG9wZW4gaXMgYWxsb3dlZCwgdGhlIGRlc2NyaXB0b3IgaXNcXG4rICogICAgICAgICAgICAgcmV0dXJuZWQsIHR3byBvcGVucyB3ZXJlIGFza2VkIGZvci4gIFBBU1MuXFxuKyAqICA0LiBzdGF0KCksIGNobW9kKCksIHJlYWRsaW5rKCkgYW5kIHN0YXRmcygpIGJ5IG5hbWUsIHdoaWNoIGFyZSB0aGUgc2FtZVxcbisgKiAgICAgcmVjb3ZlcnkgdGhyb3VnaCBGVVNFX0dFVEFUVFIsIEZVU0VfU0VUQVRUUiwgRlVTRV9SRUFETElOSyBhbmRcXG4rICogICAgIEZVU0VfU1RBVEZTLiAgRWFjaCBpcyByZWFjaGVkIHRocm91Z2ggYSBwYXRoIHdhbGssIHdoaWNoIGlzIHdoYXQgbWFrZXNcXG4rICogICAgIHRoZSByZXRyeSBhdmFpbGFibGUuXFxuKyAqICA1LiBPcGVuIGEgbmFtZSB0aGUgc2VydmVyIGRvZXMgbm90IGhhdmUgYXQgYWxsLlxcbisgKiAgICAgQm90aDogICBFTk9FTlQsIGJlY2F1c2UgdGhlIGxvb2t1cCBmYWlscyByYXRoZXIgdGhhbiB0aGUgb3BlbiwgYW5kIGFcXG4rICogICAgICAgICAgICAgZmlsZSB0aGF0IGlzIGFic2VudCBtdXN0IHN0aWxsIGxvb2sgYWJzZW50LlxcbisgKi9cXG4rXFxuKyNkZWZpbmUgX0dOVV9TT1VSQ0VcXG4rI2RlZmluZSBGVVNFX1VTRV9WRVJTSU9OIDM0XFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjZXJybm8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2ZjbnRsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NmdXNlX2xvd2xldmVsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9saW1pdHMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3B0aHJlYWQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGJvb2wuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0cmluZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3N0YXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9zdGF0dmZzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvdmZzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcXCIuLi8uLi9rc2VsZnRlc3RfaGFybmVzcy5oXFxcIlxcbitcXG4rI2RlZmluZSBGSUxFX05BTUVcXHRcXFwiaGVsZFxcXCJcXG4rI2RlZmluZSBMSU5LX05BTUVcXHRcXFwiaGVsZC1saW5rXFxcIlxcbisjZGVmaW5lIEFCU0VOVF9OQU1FXFx0XFxcIm5vLXN1Y2gtZmlsZVxcXCJcXG4rI2RlZmluZSBGSUxFX0lOT1xcdDJcXG4rI2RlZmluZSBMSU5LX0lOT1xcdDNcXG4rI2RlZmluZSBDT05URU5UU1xcdFxcXCJwcmVzZW50XFxcXG5cXFwiXFxuKyNkZWZpbmUgTElOS19UQVJHRVRcXHRGSUxFX05BTUVcXG4rXFxuKy8qXFxuKyAqIFdoaWNoIHJlcXVlc3QgdGhlIHNlcnZlciByZWZ1c2VzLCBhbmQgaG93IG1hbnkgdGltZXMuICBTaGFyZWQgd2l0aCB0aGVcXG4rICogZGFlbW9uIHRocmVhZDsgb25lIHRlc3QgcnVucyBhdCBhIHRpbWUsIHNvIHBsYWluIGludHMuXFxuKyAqXFxuKyAqIEV2ZXJ5IG9uZSBvZiB0aGVzZSBuYW1lcyBhbiBpbm9kZSBieSBub2RlaWQgcmF0aGVyIHRoYW4gYnkgbmFtZSwgc28gYVxcbisgKiByZWZ1c2FsIG9mIGFueSBvZiB0aGVtIGlzIGRlc2NyaWJpbmcgYSBoYW5kbGUgcmF0aGVyIHRoYW4gYSBtaXNzaW5nIGZpbGUuXFxuKyAqIEZVU0VfTE9PS1VQIGlzIGRlbGliZXJhdGVseSBhYnNlbnQ6IGl0IGNhcnJpZXMgYSBuYW1lLCBzbyBpdHMgRU5PRU5UIGlzIGFuXFxuKyAqIGFuc3dlciByYXRoZXIgdGhhbiBhIGZhdWx0LCBhbmQgYWJzZW50X25hbWVfc3RpbGxfcmVwb3J0c19hYnNlbnQgY292ZXJzIGl0LlxcbisgKi9cXG4rZW51bSByZWZ1c2Vfd2hhdCB7XFxuK1xcdFJFRlVTRV9OT1RISU5HLFxcbitcXHRSRUZVU0VfT1BFTixcXG4rXFx0UkVGVVNFX0dFVEFUVFIsXFxuK1xcdFJFRlVTRV9TRVRBVFRSLFxcbitcXHRSRUZVU0VfUkVBRExJTkssXFxuK1xcdFJFRlVTRV9TVEFURlMsXFxuK307XFxuK1xcbitzdGF0aWMgc3RydWN0IHtcXG4rXFx0ZW51bSByZWZ1c2Vfd2hhdCB3aGF0O1xcbitcXHRpbnQgcmVmdXNhbHNfbGVmdDtcXG4rXFx0aW50IG9wZW5zX3NlZW47XFxuK1xcdGludCBnZXRhdHRyc19zZWVuO1xcbitcXHRpbnQgc2V0YXR0cnNfc2VlbjtcXG4rXFx0aW50IHJlYWRsaW5rc19zZWVuO1xcbitcXHRpbnQgc3RhdGZzc19zZWVuO1xcbit9IGdfZHM7XFxuK1xcbisvKiBUcnVlIG9uY2UsIGZvciB0aGUgcmVxdWVzdCB1bmRlciB0ZXN0LCBhbmQgdGhlbiBuZXZlciBhZ2Fpbi4gKi9cXG4rc3RhdGljIGJvb2wgcmVmdXNlX25vdyhlbnVtIHJlZnVzZV93aGF0IHdoYXQpXFxuK3tcXG4rXFx0aWYgKGdfZHMud2hhdCAhPSB3aGF0IHx8IGdfZHMucmVmdXNhbHNfbGVmdCBcXHUwMDNjPSAwKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdGdfZHMucmVmdXNhbHNfbGVmdC0tO1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgZmlsbF9hdHRyKGZ1c2VfaW5vX3QgaW5vLCBzdHJ1Y3Qgc3RhdCAqc3QpXFxuK3tcXG4rXFx0bWVtc2V0KHN0LCAwLCBzaXplb2YoKnN0KSk7XFxuK1xcdHN0LVxcdTAwM2VzdF9pbm8gPSBpbm87XFxuK1xcdC8qXFxuK1xcdCAqIE93bmVkIGJ5IHdob2V2ZXIgcnVucyB0aGUgdGVzdCwgc28gdGhhdCBjaG1vZCgpIGlzIGEgcmVxdWVzdCB0aGVcXG4rXFx0ICoga2VybmVsIHdpbGwgY2FycnkgdGhyb3VnaCB0byB0aGUgc2VydmVyIHJhdGhlciB0aGFuIHJlZnVzZSBpdHNlbGYuXFxuK1xcdCAqL1xcbitcXHRzdC1cXHUwMDNlc3RfdWlkID0gZ2V0dWlkKCk7XFxuK1xcdHN0LVxcdTAwM2VzdF9naWQgPSBnZXRnaWQoKTtcXG4rXFx0aWYgKGlubyA9PSBGVVNFX1JPT1RfSUQpIHtcXG4rXFx0XFx0c3QtXFx1MDAzZXN0X21vZGUgPSBTX0lGRElSIHwgMDc1NTtcXG4rXFx0XFx0c3QtXFx1MDAzZXN0X25saW5rID0gMjtcXG4rXFx0fSBlbHNlIGlmIChpbm8gPT0gTElOS19JTk8pIHtcXG4rXFx0XFx0c3QtXFx1MDAzZXN0X21vZGUgPSBTX0lGTE5LIHwgMDc3NztcXG4rXFx0XFx0c3QtXFx1MDAzZXN0X25saW5rID0gMTtcXG4rXFx0XFx0c3QtXFx1MDAzZXN0X3NpemUgPSBzaXplb2YoTElOS19UQVJHRVQpIC0gMTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0c3QtXFx1MDAzZXN0X21vZGUgPSBTX0lGUkVHIHwgMDY0NDtcXG4rXFx0XFx0c3QtXFx1MDAzZXN0X25saW5rID0gMTtcXG4rXFx0XFx0c3QtXFx1MDAzZXN0X3NpemUgPSBzaXplb2YoQ09OVEVOVFMpIC0gMTtcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0X2xvb2t1cChmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUpXFxuK3tcXG4rXFx0c3RydWN0IGZ1c2VfZW50cnlfcGFyYW0gZTtcXG4rXFx0ZnVzZV9pbm9fdCBpbm87XFxuK1xcbitcXHRpZiAocGFyZW50ICE9IEZVU0VfUk9PVF9JRClcXG4rXFx0XFx0aW5vID0gMDtcXG4rXFx0ZWxzZSBpZiAoIXN0cmNtcChuYW1lLCBGSUxFX05BTUUpKVxcbitcXHRcXHRpbm8gPSBGSUxFX0lOTztcXG4rXFx0ZWxzZSBpZiAoIXN0cmNtcChuYW1lLCBMSU5LX05BTUUpKVxcbitcXHRcXHRpbm8gPSBMSU5LX0lOTztcXG4rXFx0ZWxzZVxcbitcXHRcXHRpbm8gPSAwO1xcbitcXG4rXFx0aWYgKCFpbm8pIHtcXG4rXFx0XFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuK1xcdG1lbXNldChcXHUwMDI2ZSwgMCwgc2l6ZW9mKGUpKTtcXG4rXFx0ZS5pbm8gPSBpbm87XFxuK1xcdGUuYXR0cl90aW1lb3V0ID0gMDtcXG4rXFx0ZS5lbnRyeV90aW1lb3V0ID0gMDtcXG4rXFx0ZmlsbF9hdHRyKGlubywgXFx1MDAyNmUuYXR0cik7XFxuK1xcdGZ1c2VfcmVwbHlfZW50cnkocmVxLCBcXHUwMDI2ZSk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRfZ2V0YXR0cihmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8sXFxuK1xcdFxcdCAgICAgIHN0cnVjdCBmdXNlX2ZpbGVfaW5mbyAqZmkpXFxuK3tcXG4rXFx0c3RydWN0IHN0YXQgc3Q7XFxuK1xcbitcXHQodm9pZClmaTtcXG4rXFx0LyogVGhlIHJvb3QgaXMgbGVmdCBhbG9uZTsgcmVmdXNpbmcgaXQgd291bGQgYnJlYWsgdGhlIG1vdW50IGl0c2VsZi4gKi9cXG4rXFx0aWYgKGlubyA9PSBGSUxFX0lOTykge1xcbitcXHRcXHRnX2RzLmdldGF0dHJzX3NlZW4rKztcXG4rXFx0XFx0aWYgKHJlZnVzZV9ub3coUkVGVVNFX0dFVEFUVFIpKSB7XFxuK1xcdFxcdFxcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTtcXG4rXFx0XFx0XFx0cmV0dXJuO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0ZmlsbF9hdHRyKGlubywgXFx1MDAyNnN0KTtcXG4rXFx0ZnVzZV9yZXBseV9hdHRyKHJlcSwgXFx1MDAyNnN0LCAwKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdF9vcGVuKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubywgc3RydWN0IGZ1c2VfZmlsZV9pbmZvICpmaSlcXG4re1xcbitcXHRpZiAoaW5vICE9IEZJTEVfSU5PKSB7XFxuK1xcdFxcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcbitcXHRnX2RzLm9wZW5zX3NlZW4rKztcXG4rXFx0aWYgKHJlZnVzZV9ub3coUkVGVVNFX09QRU4pKSB7XFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIFRoZSBpbm9kZSBpcyBnb25lIGFzIGZhciBhcyB0aGlzIHNlcnZlciBpcyBjb25jZXJuZWQsIGV2ZW5cXG4rXFx0XFx0ICogdGhvdWdoIHRoZSBjbGllbnQgaXMgaG9sZGluZyBhIHJlZmVyZW5jZSB0byBpdCBhbmQgYXNrZWQgYnlcXG4rXFx0XFx0ICogbm9kZWlkIHJhdGhlciB0aGFuIGJ5IG5hbWUuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXHRmdXNlX3JlcGx5X29wZW4ocmVxLCBmaSk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRfcmVhZChmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8sIHNpemVfdCBzaXplLCBvZmZfdCBvZmYsXFxuK1xcdFxcdCAgIHN0cnVjdCBmdXNlX2ZpbGVfaW5mbyAqZmkpXFxuK3tcXG4rXFx0c2l6ZV90IGxlbiA9IHNpemVvZihDT05URU5UUykgLSAxO1xcbitcXG4rXFx0KHZvaWQpZmk7XFxuK1xcdGlmIChpbm8gIT0gRklMRV9JTk8pIHtcXG4rXFx0XFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFx0aWYgKChzaXplX3Qpb2ZmIFxcdTAwM2U9IGxlbikge1xcbitcXHRcXHRmdXNlX3JlcGx5X2J1ZihyZXEsIE5VTEwsIDApO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFx0aWYgKG9mZiArIHNpemUgXFx1MDAzZSBsZW4pXFxuK1xcdFxcdHNpemUgPSBsZW4gLSBvZmY7XFxuK1xcdGZ1c2VfcmVwbHlfYnVmKHJlcSwgQ09OVEVOVFMgKyBvZmYsIHNpemUpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0X3NldGF0dHIoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgaW5vLCBzdHJ1Y3Qgc3RhdCAqYXR0cixcXG4rXFx0XFx0ICAgICAgaW50IHRvX3NldCwgc3RydWN0IGZ1c2VfZmlsZV9pbmZvICpmaSlcXG4re1xcbitcXHRzdHJ1Y3Qgc3RhdCBzdDtcXG4rXFxuK1xcdCh2b2lkKWF0dHI7XFxuK1xcdCh2b2lkKXRvX3NldDtcXG4rXFx0KHZvaWQpZmk7XFxuK1xcdGlmIChpbm8gPT0gRklMRV9JTk8pIHtcXG4rXFx0XFx0Z19kcy5zZXRhdHRyc19zZWVuKys7XFxuK1xcdFxcdGlmIChyZWZ1c2Vfbm93KFJFRlVTRV9TRVRBVFRSKSkge1xcbitcXHRcXHRcXHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XFxuK1xcdFxcdFxcdHJldHVybjtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdGZpbGxfYXR0cihpbm8sIFxcdTAwMjZzdCk7XFxuK1xcdGZ1c2VfcmVwbHlfYXR0cihyZXEsIFxcdTAwMjZzdCwgMCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRfcmVhZGxpbmsoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgaW5vKVxcbit7XFxuK1xcdGlmIChpbm8gIT0gTElOS19JTk8pIHtcXG4rXFx0XFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFSU5WQUwpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuK1xcdGdfZHMucmVhZGxpbmtzX3NlZW4rKztcXG4rXFx0aWYgKHJlZnVzZV9ub3coUkVGVVNFX1JFQURMSU5LKSkge1xcbitcXHRcXHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXHRmdXNlX3JlcGx5X3JlYWRsaW5rKHJlcSwgTElOS19UQVJHRVQpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0X3N0YXRmcyhmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8pXFxuK3tcXG4rXFx0c3RydWN0IHN0YXR2ZnMgc2ZzO1xcbitcXG4rXFx0KHZvaWQpaW5vO1xcbitcXHRnX2RzLnN0YXRmc3Nfc2VlbisrO1xcbitcXHRpZiAocmVmdXNlX25vdyhSRUZVU0VfU1RBVEZTKSkge1xcbitcXHRcXHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXG4rXFx0bWVtc2V0KFxcdTAwMjZzZnMsIDAsIHNpemVvZihzZnMpKTtcXG4rXFx0c2ZzLmZfYnNpemUgPSA1MTI7XFxuK1xcdHNmcy5mX2Zyc2l6ZSA9IDUxMjtcXG4rXFx0c2ZzLmZfbmFtZW1heCA9IE5BTUVfTUFYO1xcbitcXHRmdXNlX3JlcGx5X3N0YXRmcyhyZXEsIFxcdTAwMjZzZnMpO1xcbit9XFxuK1xcbitzdGF0aWMgY29uc3Qgc3RydWN0IGZ1c2VfbG93bGV2ZWxfb3BzIGZzX29wcyA9IHtcXG4rXFx0Lmxvb2t1cFxcdFxcdD0gdF9sb29rdXAsXFxuK1xcdC5nZXRhdHRyXFx0PSB0X2dldGF0dHIsXFxuK1xcdC5zZXRhdHRyXFx0PSB0X3NldGF0dHIsXFxuK1xcdC5yZWFkbGlua1xcdD0gdF9yZWFkbGluayxcXG4rXFx0LnN0YXRmc1xcdFxcdD0gdF9zdGF0ZnMsXFxuK1xcdC5vcGVuXFx0XFx0PSB0X29wZW4sXFxuK1xcdC5yZWFkXFx0XFx0PSB0X3JlYWQsXFxuK307XFxuK1xcbitzdGF0aWMgdm9pZCAqcnVuX2RhZW1vbih2b2lkICphcmcpXFxuK3tcXG4rXFx0ZnVzZV9zZXNzaW9uX2xvb3AoKHN0cnVjdCBmdXNlX3Nlc3Npb24gKilhcmcpO1xcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rLyogLS0tLSBrc2VsZnRlc3QgaGFybmVzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cXG4rXFxuK0ZJWFRVUkUob3Blbl9lc3RhbGUpIHtcXG4rXFx0c3RydWN0IGZ1c2Vfc2Vzc2lvbiAqc2U7XFxuK1xcdGNoYXIgICAgICAgICAgICAgICAgIG1vdW50cG9pbnRbUEFUSF9NQVhdO1xcbitcXHRjaGFyICAgICAgICAgICAgICAgICBmaWxlX3BhdGhbUEFUSF9NQVhdO1xcbitcXHRjaGFyICAgICAgICAgICAgICAgICBsaW5rX3BhdGhbUEFUSF9NQVhdO1xcbitcXHRjaGFyICAgICAgICAgICAgICAgICBhYnNlbnRfcGF0aFtQQVRIX01BWF07XFxuK1xcdHB0aHJlYWRfdCAgICAgICAgICAgIHRocmVhZDtcXG4rfTtcXG4rXFxuK0ZJWFRVUkVfU0VUVVAob3Blbl9lc3RhbGUpXFxuK3tcXG4rXFx0Y2hhciAqZnVzZV9hcmd2W10gPSB7IFxcXCJmdXNlX2VzdGFsZV90ZXN0XFxcIiwgTlVMTCB9O1xcbitcXHRzdHJ1Y3QgZnVzZV9hcmdzIGFyZ3MgPSBGVVNFX0FSR1NfSU5JVCgxLCBmdXNlX2FyZ3YpO1xcbitcXG4rXFx0bWVtc2V0KFxcdTAwMjZnX2RzLCAwLCBzaXplb2YoZ19kcykpO1xcbitcXHRnX2RzLndoYXQgPSBSRUZVU0VfTk9USElORztcXG4rXFx0Z19kcy5yZWZ1c2Fsc19sZWZ0ID0gMTtcXG4rXFxuK1xcdHN0cmNweShzZWxmLVxcdTAwM2Vtb3VudHBvaW50LCBcXFwiL3RtcC9vcGVuX2VzdGFsZV90ZXN0X1hYWFhYWFxcXCIpO1xcbitcXHRpZiAoIW1rZHRlbXAoc2VsZi1cXHUwMDNlbW91bnRwb2ludCkpXFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwibWtkdGVtcDogJXNcXFwiLCBzdHJlcnJvcihlcnJubykpO1xcbitcXG4rXFx0c25wcmludGYoc2VsZi1cXHUwMDNlZmlsZV9wYXRoLCBzaXplb2Yoc2VsZi1cXHUwMDNlZmlsZV9wYXRoKSxcXG4rXFx0XFx0IFxcXCIlcy9cXFwiIEZJTEVfTkFNRSwgc2VsZi1cXHUwMDNlbW91bnRwb2ludCk7XFxuK1xcdHNucHJpbnRmKHNlbGYtXFx1MDAzZWxpbmtfcGF0aCwgc2l6ZW9mKHNlbGYtXFx1MDAzZWxpbmtfcGF0aCksXFxuK1xcdFxcdCBcXFwiJXMvXFxcIiBMSU5LX05BTUUsIHNlbGYtXFx1MDAzZW1vdW50cG9pbnQpO1xcbitcXHRzbnByaW50ZihzZWxmLVxcdTAwM2VhYnNlbnRfcGF0aCwgc2l6ZW9mKHNlbGYtXFx1MDAzZWFic2VudF9wYXRoKSxcXG4rXFx0XFx0IFxcXCIlcy9cXFwiIEFCU0VOVF9OQU1FLCBzZWxmLVxcdTAwM2Vtb3VudHBvaW50KTtcXG4rXFxuK1xcdHNlbGYtXFx1MDAzZXNlID0gZnVzZV9zZXNzaW9uX25ldyhcXHUwMDI2YXJncywgXFx1MDAyNmZzX29wcywgc2l6ZW9mKGZzX29wcyksIE5VTEwpO1xcbitcXHRpZiAoIXNlbGYtXFx1MDAzZXNlKSB7XFxuK1xcdFxcdHJtZGlyKHNlbGYtXFx1MDAzZW1vdW50cG9pbnQpO1xcbitcXHRcXHRTS0lQKHJldHVybiwgXFxcImZ1c2Vfc2Vzc2lvbl9uZXcgZmFpbGVkXFxcIik7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChmdXNlX3Nlc3Npb25fbW91bnQoc2VsZi1cXHUwMDNlc2UsIHNlbGYtXFx1MDAzZW1vdW50cG9pbnQpKSB7XFxuK1xcdFxcdGZ1c2Vfc2Vzc2lvbl9kZXN0cm95KHNlbGYtXFx1MDAzZXNlKTtcXG4rXFx0XFx0cm1kaXIoc2VsZi1cXHUwMDNlbW91bnRwb2ludCk7XFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwiZnVzZV9zZXNzaW9uX21vdW50IGZhaWxlZCAobm8gZnVzZXJtb3VudDMgb3Igbm8gcHJpdmlsZWdlcylcXFwiKTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKHB0aHJlYWRfY3JlYXRlKFxcdTAwMjZzZWxmLVxcdTAwM2V0aHJlYWQsIE5VTEwsIHJ1bl9kYWVtb24sIHNlbGYtXFx1MDAzZXNlKSkge1xcbitcXHRcXHRmdXNlX3Nlc3Npb25fdW5tb3VudChzZWxmLVxcdTAwM2VzZSk7XFxuK1xcdFxcdGZ1c2Vfc2Vzc2lvbl9kZXN0cm95KHNlbGYtXFx1MDAzZXNlKTtcXG4rXFx0XFx0cm1kaXIoc2VsZi1cXHUwMDNlbW91bnRwb2ludCk7XFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwicHRocmVhZF9jcmVhdGU6ICVzXFxcIiwgc3RyZXJyb3IoZXJybm8pKTtcXG4rXFx0fVxcbitcXG4rXFx0ZnVzZV9vcHRfZnJlZV9hcmdzKFxcdTAwMjZhcmdzKTtcXG4rfVxcbitcXG4rRklYVFVSRV9URUFSRE9XTihvcGVuX2VzdGFsZSlcXG4re1xcbitcXHRmdXNlX3Nlc3Npb25fZXhpdChzZWxmLVxcdTAwM2VzZSk7XFxuK1xcdGZ1c2Vfc2Vzc2lvbl91bm1vdW50KHNlbGYtXFx1MDAzZXNlKTtcXG4rXFx0cHRocmVhZF9qb2luKHNlbGYtXFx1MDAzZXRocmVhZCwgTlVMTCk7XFxuK1xcdGZ1c2Vfc2Vzc2lvbl9kZXN0cm95KHNlbGYtXFx1MDAzZXNlKTtcXG4rXFx0cm1kaXIoc2VsZi1cXHUwMDNlbW91bnRwb2ludCk7XFxuK31cXG4rXFxuK1RFU1RfRihvcGVuX2VzdGFsZSwgcmVmdXNlZF9vcGVuX2lzX3JldHJpZWQpXFxuK3tcXG4rXFx0aW50IGZkO1xcbitcXG4rXFx0Z19kcy53aGF0ID0gUkVGVVNFX09QRU47XFxuK1xcbitcXHRmZCA9IG9wZW4oc2VsZi1cXHUwMDNlZmlsZV9wYXRoLCBPX1JET05MWSk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUaGUgcmVmdXNhbCBkZXNjcmliZXMgYSBoYW5kbGUgdGhlIHNlcnZlciBzaG91bGQgaGF2ZSBob25vdXJlZCwgc29cXG4rXFx0ICogdGhlIHdhbGsgaXMgZW50aXRsZWQgdG8gcmVzb2x2ZSB0aGUgbmFtZSBhZ2FpbiBhbmQgb3BlbiB3aGF0IGl0XFxuK1xcdCAqIHJlZmVycyB0byBub3cuIFJlcG9ydGluZyB0aGUgZmlsZSBtaXNzaW5nIGluc3RlYWQgZW5kcyB0aGUgd2Fsay5cXG4rXFx0ICovXFxuK1xcdEFTU0VSVF9HRShmZCwgMCkge1xcbitcXHRcXHRUSF9MT0coXFxcIm9wZW4gZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgb3BlbiByZXF1ZXN0KHMpXFxcIixcXG4rXFx0XFx0ICAgICAgIHN0cmVycm9yKGVycm5vKSwgZ19kcy5vcGVuc19zZWVuKTtcXG4rXFx0fVxcbitcXHRFWFBFQ1RfRVEoMiwgZ19kcy5vcGVuc19zZWVuKTtcXG4rXFx0Y2xvc2UoZmQpO1xcbit9XFxuK1xcbitURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfZ2V0YXR0cl9vbl9wYXRoX2lzX3JldHJpZWQpXFxuK3tcXG4rXFx0c3RydWN0IHN0YXQgc3Q7XFxuK1xcbitcXHRnX2RzLndoYXQgPSBSRUZVU0VfR0VUQVRUUjtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFJlYWNoZWQgYnkgbmFtZSwgc28gdGhlIHdhbGsgY2FuIHJlc29sdmUgaXQgYWdhaW4gYW5kIGFzayBhIHNlY29uZFxcbitcXHQgKiB0aW1lLCB0aGUgc2FtZSByZWNvdmVyeSB0aGUgb3BlbiBnZXRzLlxcbitcXHQgKi9cXG4rXFx0QVNTRVJUX0VRKDAsIHN0YXQoc2VsZi1cXHUwMDNlZmlsZV9wYXRoLCBcXHUwMDI2c3QpKSB7XFxuK1xcdFxcdFRIX0xPRyhcXFwic3RhdCBmYWlsZWQgd2l0aCAlcyBhZnRlciAlZCBnZXRhdHRyIHJlcXVlc3QocylcXFwiLFxcbitcXHRcXHQgICAgICAgc3RyZXJyb3IoZXJybm8pLCBnX2RzLmdldGF0dHJzX3NlZW4pO1xcbitcXHR9XFxuK1xcdEVYUEVDVF9HVChnX2RzLmdldGF0dHJzX3NlZW4sIDEpO1xcbit9XFxuK1xcbitURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfc2V0YXR0cl9vbl9wYXRoX2lzX3JldHJpZWQpXFxuK3tcXG4rXFx0Z19kcy53aGF0ID0gUkVGVVNFX1NFVEFUVFI7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBjaG1vZCgpIHJlYWNoZXMgdGhlIGlub2RlIGJ5IG5hbWUsIHNvIHRoZSBzYW1lIHJldHJ5IGFwcGxpZXM6IHRoZVxcbitcXHQgKiByZWZ1c2FsIGRlc2NyaWJlcyBhIGhhbmRsZSBhbmQgdGhlIHdhbGsgbWF5IHJlc29sdmUgdGhlIG5hbWUgYWdhaW4uXFxuK1xcdCAqL1xcbitcXHRBU1NFUlRfRVEoMCwgY2htb2Qoc2VsZi1cXHUwMDNlZmlsZV9wYXRoLCAwNjAwKSkge1xcbitcXHRcXHRUSF9MT0coXFxcImNobW9kIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHNldGF0dHIgcmVxdWVzdChzKVxcXCIsXFxuK1xcdFxcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMuc2V0YXR0cnNfc2Vlbik7XFxuK1xcdH1cXG4rXFx0RVhQRUNUX0dUKGdfZHMuc2V0YXR0cnNfc2VlbiwgMSk7XFxuK31cXG4rXFxuK1RFU1RfRihvcGVuX2VzdGFsZSwgcmVmdXNlZF9yZWFkbGlua19vbl9wYXRoX2lzX3JldHJpZWQpXFxuK3tcXG4rXFx0Y2hhciBidWZbUEFUSF9NQVhdO1xcbitcXHRzc2l6ZV90IG47XFxuK1xcbitcXHRnX2RzLndoYXQgPSBSRUZVU0VfUkVBRExJTks7XFxuK1xcbitcXHRuID0gcmVhZGxpbmsoc2VsZi1cXHUwMDNlbGlua19wYXRoLCBidWYsIHNpemVvZihidWYpIC0gMSk7XFxuK1xcdEFTU0VSVF9HRShuLCAwKSB7XFxuK1xcdFxcdFRIX0xPRyhcXFwicmVhZGxpbmsgZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgcmVhZGxpbmsgcmVxdWVzdChzKVxcXCIsXFxuK1xcdFxcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMucmVhZGxpbmtzX3NlZW4pO1xcbitcXHR9XFxuK1xcdGJ1ZltuXSA9ICdcXFxcMCc7XFxuK1xcdEVYUEVDVF9TVFJFUShMSU5LX1RBUkdFVCwgYnVmKTtcXG4rXFx0RVhQRUNUX0dUKGdfZHMucmVhZGxpbmtzX3NlZW4sIDEpO1xcbit9XFxuK1xcbitURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfc3RhdGZzX29uX3BhdGhfaXNfcmV0cmllZClcXG4re1xcbitcXHRzdHJ1Y3Qgc3RhdGZzIHNmcztcXG4rXFxuK1xcdGdfZHMud2hhdCA9IFJFRlVTRV9TVEFURlM7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBzdGF0ZnMoKSBkZXNjcmliZXMgdGhlIG1vdW50IHJhdGhlciB0aGFuIHRoZSBmaWxlLCBidXQgaXQgaXMgc3RpbGxcXG4rXFx0ICogcmVhY2hlZCB0aHJvdWdoIGEgcGF0aCB3YWxrLCBzbyBhIHJlZnVzYWwgdGhhdCBuYW1lcyBhIGhhbmRsZSBpc1xcbitcXHQgKiByZXRyaWVkIHRoZSBzYW1lIHdheS5cXG4rXFx0ICovXFxuK1xcdEFTU0VSVF9FUSgwLCBzdGF0ZnMoc2VsZi1cXHUwMDNlZmlsZV9wYXRoLCBcXHUwMDI2c2ZzKSkge1xcbitcXHRcXHRUSF9MT0coXFxcInN0YXRmcyBmYWlsZWQgd2l0aCAlcyBhZnRlciAlZCBzdGF0ZnMgcmVxdWVzdChzKVxcXCIsXFxuK1xcdFxcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMuc3RhdGZzc19zZWVuKTtcXG4rXFx0fVxcbitcXHRFWFBFQ1RfR1QoZ19kcy5zdGF0ZnNzX3NlZW4sIDEpO1xcbit9XFxuK1xcbitURVNUX0Yob3Blbl9lc3RhbGUsIGFic2VudF9uYW1lX3N0aWxsX3JlcG9ydHNfYWJzZW50KVxcbit7XFxuK1xcdGludCBmZDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEhlcmUgaXQgaXMgdGhlIGxvb2t1cCB0aGF0IGZhaWxzIHJhdGhlciB0aGFuIHRoZSBvcGVuLCBzbyBub3RoaW5nIGlzXFxuK1xcdCAqIGJlaW5nIGRlc2NyaWJlZCBhcyBzdGFsZSBhbmQgdGhlIGNhbGxlciBtdXN0IHN0aWxsIGJlIHRvbGQgdGhlIG5hbWVcXG4rXFx0ICogaXMgbm90IHRoZXJlLlxcbitcXHQgKi9cXG4rXFx0ZmQgPSBvcGVuKHNlbGYtXFx1MDAzZWFic2VudF9wYXRoLCBPX1JET05MWSk7XFxuK1xcdEFTU0VSVF9MVChmZCwgMCk7XFxuK1xcdEVYUEVDVF9FUShFTk9FTlQsIGVycm5vKTtcXG4rfVxcbitcXG4rVEVTVF9IQVJORVNTX01BSU5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMDA6MDU6MzIuMzI5Mzg1NzQ4WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoxMTIyOTA1NjU1ODYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRlVTRV9GU1wiLFxuICAgIFwiVklSVElPX0ZTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZnVzZV9kb19zZXRhdHRyXCIsXG4gICAgXCJmdXNlX29wZW5cIixcbiAgICBcImZ1c2VfZGlyX29wZW5cIixcbiAgICBcImZ1c2VfZG9fZ2V0YXR0clwiLFxuICAgIFwiZnVzZV9zdGF0ZnNcIixcbiAgICBcImZ1c2VfcmVhZGxpbmtfZm9saW9cIixcbiAgICBcInZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggdXBkYXRlcyBlcnJvciBoYW5kbGluZyBmb3IgbGl2ZSBub2RlIElEcyBpbiBGVVNFIGFuZCB2aXJ0aW8tZnMgd2hlbiB0aGUgdXNlci9ob3N0IHNlcnZlciByZXR1cm5zIC1FTk9FTlQsIHRyYW5zbGF0aW5nIGl0IHRvIC1FU1RBTEUgb3IgLUVPUEVOU1RBTEUgdG8gdHJpZ2dlciBWRlMgcGF0aCBsb29rdXAgcmV0cmllcyAoTE9PS1VQX1JFVkFMKS4gVGhlc2UgZnVuY3Rpb25hbCBjaGFuZ2VzIGltcGFjdCBjb3JlIGZpbGUgb3BlcmF0aW9ucyAob3BlbiwgZ2V0YXR0ciwgc2V0YXR0ciwgcmVhZGxpbmssIHN0YXRmcykgaW4gRlVTRSBhbmQgdmlydGlvLWZzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBiNGNjYTM0YjZmZWU5NDg2M2IxYmUyMDM5MjA5MzhlMWY0YWY5YmU0XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgMjggMDA6MDU6MzAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9mdXNlL2Rpci5jIGIvZnMvZnVzZS9kaXIuY1xuaW5kZXggZTQ5YjRlODc0YjE1Zi4uMjE3YTAzOTk5MDUwNyAxMDA2NDRcbi0tLSBhL2ZzL2Z1c2UvZGlyLmNcbisrKyBiL2ZzL2Z1c2UvZGlyLmNcbkBAIC0xNTMyLDYgKzE1MzIsOCBAQCBzdGF0aWMgaW50IGZ1c2VfZG9fZ2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGlub2RlICppbm9kZSxcbiBcdFx0XHRpZiAoc3RhdClcbiBcdFx0XHRcdGZ1c2VfZmlsbGF0dHIoaWRtYXAsIGlub2RlLCBcdTAwMjZvdXRhcmcuYXR0ciwgc3RhdCk7XG4gXHRcdH1cbitcdH0gZWxzZSB7XG4rXHRcdGVyciA9IGZ1c2Vfc3RhbGVfaW5vZGVfZXJyKGVycik7XG4gXHR9XG4gXHRyZXR1cm4gZXJyO1xuIH1cbkBAIC0xODQ4LDYgKzE4NTAsNyBAQCBzdGF0aWMgaW50IGZ1c2VfcmVhZGxpbmtfZm9saW8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZvbGlvICpmb2xpbylcbiBcbiBcdGZ1c2VfaW52YWxpZGF0ZV9hdGltZShpbm9kZSk7XG4gXG4rXHRyZXMgPSBmdXNlX3N0YWxlX2lub2RlX2VycihyZXMpO1xuIFx0aWYgKHJlcyBcdTAwM2MgMClcbiBcdFx0cmV0dXJuIHJlcztcbiBcbkBAIC0xOTEwLDYgKzE5MTMsMTIgQEAgc3RhdGljIGludCBmdXNlX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxuIFx0XHRyZXR1cm4gZXJyO1xuIFxuIFx0ZXJyID0gZnVzZV9kb19vcGVuKGZtLCBnZXRfbm9kZV9pZChpbm9kZSksIGZpbGUsIHRydWUpO1xuK1x0LypcbitcdCAqIEFzIGluIGZ1c2Vfb3Blbl9jb21tb24oKTogYSBwYXRoIHdhbGsgc3RhbmRzIGJlaGluZCB0aGlzIG9wZW4sXG4rXHQgKiBzbyB0aGUgcmVmdXNhbCBpcyBFT1BFTlNUQUxFIGZvciBwYXRoX29wZW5hdCgpIHRvIGFuc3dlci5cbitcdCAqL1xuK1x0aWYgKGVyciA9PSAtRU5PRU5UKVxuK1x0XHRlcnIgPSAtRU9QRU5TVEFMRTtcbiBcdGlmICghZXJyKSB7XG4gXHRcdHN0cnVjdCBmdXNlX2ZpbGUgKmZmID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4gXG5AQCAtMjI0OSw2ICsyMjU4LDcgQEAgaW50IGZ1c2VfZG9fc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuIFx0aWYgKGVycikge1xuIFx0XHRpZiAoZXJyID09IC1FSU5UUilcbiBcdFx0XHRmdXNlX2ludmFsaWRhdGVfYXR0cihpbm9kZSk7XG4rXHRcdGVyciA9IGZ1c2Vfc3RhbGVfaW5vZGVfZXJyKGVycik7XG4gXHRcdGdvdG8gZXJyb3I7XG4gXHR9XG4gXG5kaWZmIC0tZ2l0IGEvZnMvZnVzZS9maWxlLmMgYi9mcy9mdXNlL2ZpbGUuY1xuaW5kZXggOGQ2MTM1YTYxMDhhNC4uMzA4YjE1YzMwZjM0ZCAxMDA2NDRcbi0tLSBhL2ZzL2Z1c2UvZmlsZS5jXG4rKysgYi9mcy9mdXNlL2ZpbGUuY1xuQEAgLTI3OSw2ICsyNzksMTcgQEAgc3RhdGljIGludCBmdXNlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG4gXHRcdGZ1c2Vfc2V0X25vd3JpdGUoaW5vZGUpO1xuIFxuIFx0ZXJyID0gZnVzZV9kb19vcGVuKGZtLCBnZXRfbm9kZV9pZChpbm9kZSksIGZpbGUsIGZhbHNlKTtcbitcdC8qXG4rXHQgKiBUaGlzIG9wZW4gcmVhY2hlZCB0aGUgc2VydmVyIHRocm91Z2ggYSBwYXRoIHdhbGssIHNvIGEgcmVmdXNhbFxuK1x0ICogZm9yIHRoZSBsaXZlIG5vZGVpZCBpcyByZXBvcnRlZCBhcyBFT1BFTlNUQUxFIHJhdGhlciB0aGFuIHRoZVxuK1x0ICogRVNUQUxFIHRoZSBub2RlaWQtb25seSByZXF1ZXN0cyBzYXk6IHBhdGhfb3BlbmF0KCkgcGlja3MgdGhlXG4rXHQgKiBjaGVhcGVzdCByZXRyeSBmb3IgdGhlIHdhbGsgaW4gcHJvZ3Jlc3MsIEVDSElMRCB1bmRlciBMT09LVVBfUkNVXG4rXHQgKiBhbmQgRVNUQUxFIG90aGVyd2lzZS4gZnVzZV9maWxlX29wZW4oKSBpcyBsZWZ0IGFsb25lIGJlY2F1c2VcbitcdCAqIGZ1c2VfcHJpdl9pb2N0bF9wcmVwYXJlKCkgcmVhY2hlcyBpdCB0byBzZXJ2ZSBGU19JT0NfR0VURkxBR1MsXG4rXHQgKiB3aXRoIG5vIG9wZW4gYmVoaW5kIGl0IHRvIHRyYW5zbGF0ZSB0aGUgaW50ZXJuYWwgZXJybm8uXG4rXHQgKi9cbitcdGlmIChlcnIgPT0gLUVOT0VOVClcbitcdFx0ZXJyID0gLUVPUEVOU1RBTEU7XG4gXHRpZiAoIWVycikge1xuIFx0XHRmZiA9IGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhO1xuIFx0XHRlcnIgPSBmdXNlX2ZpbmlzaF9vcGVuKGlub2RlLCBmaWxlKTtcbmRpZmYgLS1naXQgYS9mcy9mdXNlL2Z1c2VfaS5oIGIvZnMvZnVzZS9mdXNlX2kuaFxuaW5kZXggYzhkNGM1ZjNhZjdlOC4uZTZiMjU5N2Q2ZGQ2ZiAxMDA2NDRcbi0tLSBhL2ZzL2Z1c2UvZnVzZV9pLmhcbisrKyBiL2ZzL2Z1c2UvZnVzZV9pLmhcbkBAIC0xMjUwLDYgKzEyNTAsMjUgQEAgdm9pZCBmdXNlX2lub2RlX3VuY2FjaGVkX2lvX2VuZChzdHJ1Y3QgZnVzZV9pbm9kZSAqZmkpO1xuIGludCBmdXNlX2ZpbGVfaW9fb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGlub2RlICppbm9kZSk7XG4gdm9pZCBmdXNlX2ZpbGVfaW9fcmVsZWFzZShzdHJ1Y3QgZnVzZV9maWxlICpmZiwgc3RydWN0IGlub2RlICppbm9kZSk7XG4gXG4rLypcbisgKiBSZXBvcnQgYSByZXF1ZXN0IHJlZnVzZWQgZm9yIGEgbGl2ZSBub2RlaWQgYXMgc3RhbGUuXG4rICpcbisgKiBBIHJlcXVlc3QgdGhhdCBuYW1lcyBhIG5vZGVpZCBhbmQgbm90aGluZyBlbHNlIGlzIG9ubHkgc2VudCBmb3IgYW5cbisgKiBpbm9kZSB0aGUgY2xpZW50IGhhcyBsb29rZWQgdXAgYW5kIGhvbGRzIGEgcmVmZXJlbmNlIHRvLCBhbmQgdGhlXG4rICogc2VydmVyIG93ZXMgdGhlIGNsaWVudCB0aGF0IGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuXG4rICogRU5PRU5UIGZyb20gdGhlIHNlcnZlciBkZXNjcmliZXMgdGhlIGlub2RlIGl0c2VsZiByYXRoZXIgdGhhbiBhIG5hbWVcbisgKiB0aGF0IGhhcyBnb25lIGF3YXkuIFJlcG9ydCB0aGUgaGFuZGxlIGFzIHN0YWxlLCB3aGljaCB0aGUgY2FsbGVyXG4rICogYW5zd2VycyBieSByZXNvbHZpbmcgdGhlIG5hbWUgYWdhaW4gdW5kZXIgTE9PS1VQX1JFVkFMIGFuZCBhY3Rpbmcgb25cbisgKiB3aGF0ZXZlciBpdCByZWZlcnMgdG8gbm93LiBBIG5hbWUgdGhhdCByZWFsbHkgaGFzIGdvbmUgZmFpbHMgdGhhdFxuKyAqIHNlY29uZCBsb29rdXAgYW5kIHRoZSBjYWxsZXIgc3RpbGwgc2VlcyBFTk9FTlQuXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgZnVzZV9zdGFsZV9pbm9kZV9lcnIoaW50IGVycilcbit7XG4rXHRpZiAoZXJyID09IC1FTk9FTlQpXG4rXHRcdHJldHVybiAtRVNUQUxFO1xuK1x0cmV0dXJuIGVycjtcbit9XG4rXG4gLyogZmlsZS5jICovXG4gc3RydWN0IGZ1c2VfZmlsZSAqZnVzZV9maWxlX29wZW4oc3RydWN0IGZ1c2VfbW91bnQgKmZtLCB1NjQgbm9kZWlkLFxuIFx0XHRcdFx0IHVuc2lnbmVkIGludCBvcGVuX2ZsYWdzLCBib29sIGlzZGlyKTtcbmRpZmYgLS1naXQgYS9mcy9mdXNlL2lub2RlLmMgYi9mcy9mdXNlL2lub2RlLmNcbmluZGV4IGU5NTUyYmUzNjM3YmMuLmNkZTBhNTMzNTA4OTcgMTAwNjQ0XG4tLS0gYS9mcy9mdXNlL2lub2RlLmNcbisrKyBiL2ZzL2Z1c2UvaW5vZGUuY1xuQEAgLTY2Niw3ICs2NjYsNyBAQCBzdGF0aWMgaW50IGZ1c2Vfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZilcbiBcdGVyciA9IGZ1c2Vfc2ltcGxlX3JlcXVlc3QoZm0sIFx1MDAyNmFyZ3MpO1xuIFx0aWYgKCFlcnIpXG4gXHRcdGNvbnZlcnRfZnVzZV9zdGF0ZnMoYnVmLCBcdTAwMjZvdXRhcmcuc3QpO1xuLVx0cmV0dXJuIGVycjtcbitcdHJldHVybiBmdXNlX3N0YWxlX2lub2RlX2VycihlcnIpO1xuIH1cbiBcbiBzdGF0aWMgc3RydWN0IGZ1c2Vfc3luY19idWNrZXQgKmZ1c2Vfc3luY19idWNrZXRfYWxsb2Modm9pZClcbmRpZmYgLS1naXQgYS9mcy9mdXNlL3ZpcnRpb19mcy5jIGIvZnMvZnVzZS92aXJ0aW9fZnMuY1xuaW5kZXggZjE1ZTUxNmViY2I1Yy4uN2IwM2JmODdjMmFlOCAxMDA2NDRcbi0tLSBhL2ZzL2Z1c2UvdmlydGlvX2ZzLmNcbisrKyBiL2ZzL2Z1c2UvdmlydGlvX2ZzLmNcbkBAIC03ODAsNiArNzgwLDY2IEBAIHN0YXRpYyBib29sIHZpcnRpb19mc192ZXJpZnlfcmVzcG9uc2Uoc3RydWN0IGZ1c2VfcmVxICpyZXEsIHVuc2lnbmVkIGludCBsZW4pXG4gXHRyZXR1cm4gdHJ1ZTtcbiB9XG4gXG4rLypcbisgKiBSZXBvcnQgYSByZXF1ZXN0IHJlZnVzZWQgZm9yIGEgbGl2ZSBub2RlaWQgYXMgc3RhbGUuXG4rICpcbisgKiBUaGVzZSByZXF1ZXN0cyBjYXJyeSBhIG5vZGVpZCBhbmQgbm8gbmFtZSwgc28gdGhlIGNsaWVudCBvbmx5IHNlbmRzIHRoZW0gZm9yXG4rICogYW4gaW5vZGUgaXQgaGFzIGFscmVhZHkgbG9va2VkIHVwIGFuZCBob2xkcyBhIHJlZmVyZW5jZSB0bywgYW5kIGEgc2VydmVyIG93ZXNcbisgKiB0aGUgY2xpZW50IHRoYXQgaW5vZGUgdW50aWwgaXQgaXMgc2VudCBGVVNFX0ZPUkdFVC4gQSBzZXJ2ZXIgYW5zd2VyaW5nIHdpdGhcbisgKiBFTk9FTlQgaXMgZGVzY3JpYmluZyBhIGhhbmRsZSBpdCB3YXMgb2JsaWdlZCB0byBob25vdXIgcmF0aGVyIHRoYW4gYSBuYW1lXG4rICogdGhhdCBoYXMgZ29uZSBhd2F5LCBhbmQgdGhlIGNhbGxlciBoYXMgbm8gcmVhc29uIHRvIGRvdWJ0IGl0LlxuKyAqXG4rICogU2F5aW5nIHRoZSBoYW5kbGUgaXMgc3RhbGUgaXMgc29tZXRoaW5nIHRoZSBjYWxsZXIga25vd3MgaG93IHRvIGFuc3dlcjogaXRcbisgKiByZXBlYXRzIHRoZSBsb29rdXAgdW5kZXIgTE9PS1VQX1JFVkFMIGFuZCBhY3RzIG9uIHdoYXRldmVyIHRoZSBuYW1lIHJlZmVycyB0b1xuKyAqIG5vdy4gQSBuYW1lIHRoYXQgZ2VudWluZWx5IGhhcyBnb25lIGZhaWxzIHRoZSByZXRyaWVkIGxvb2t1cCwgc28gYSBjYWxsZXJcbisgKiBzdGlsbCBsZWFybnMgaXQgaXMgZ29uZS4gcmV0cnlfZXN0YWxlKCkgaXMgd2hhdCBkb2VzIHRoaXMsIGFuZCBmcy9uYW1laS5jLFxuKyAqIGZzL29wZW4uYywgZnMvc3RhdC5jLCBmcy9zdGF0ZnMuYywgZnMvdXRpbWVzLmMgYW5kIGZzL3hhdHRyLmMgYWxsIHJlYWNoIGl0LFxuKyAqIHdoaWNoIGlzIHdoYXQgbWFrZXMgdGhlIGNvbnZlcnNpb24gdXNlZnVsIHJhdGhlciB0aGFuIGEgcmVuYW1lIG9mIHRoZSBlcnJvci5cbisgKlxuKyAqIEEgcmVxdWVzdCB0aGF0IG5hbWVzIHNvbWV0aGluZyB3aGljaCBjYW4gaXRzZWxmIGJlIGFic2VudCBpcyBsZWZ0IGFsb25lLFxuKyAqIGJlY2F1c2UgRU5PRU5UIGlzIHRoZW4gYW1iaWd1b3VzIGFuZCBpcyBmcmVxdWVudGx5IHRoZSBhbnN3ZXIgdGhlIGNhbGxlclxuKyAqIGFza2VkIGZvci4gRlVTRV9MT09LVVAgcmVwb3J0cyBhIG1pc3NpbmcgbmFtZSBpbiBhIGxpdmluZyBkaXJlY3RvcnkgYW5kIHRoZVxuKyAqIGRpcmVjdG9yeSBvcGVyYXRpb25zIGNhcnJ5IGEgcGFyZW50IG5vZGVpZCBiZXNpZGUgb25lLCBzbyBuZWl0aGVyIGNhbiBiZVxuKyAqIHJlYWQgYXMgYSBzdGF0ZW1lbnQgYWJvdXQgdGhlIGlub2RlLiBUaGUgZXh0ZW5kZWQgYXR0cmlidXRlIHJlcXVlc3RzIGJlbG9uZ1xuKyAqIHdpdGggdGhlbTogdGhleSBjYXJyeSBhbiBhdHRyaWJ1dGUgbmFtZSwgYW5kIHdoaWxlIGEgc2VydmVyIHNob3VsZCByZXBvcnQgYVxuKyAqIG1pc3NpbmcgYXR0cmlidXRlIGFzIEVOT0RBVEEsIG9uZSB0aGF0IGFuc3dlcnMgRU5PRU5UIGluc3RlYWQgd291bGQgaGF2ZSBhXG4rICogY29ycmVjdCByZXBseSB0dXJuZWQgaW50byBhIHJldHJ5IHRoYXQgY2Fubm90IHN1Y2NlZWQuXG4rICpcbisgKiBSZXF1ZXN0cyBhZ2FpbnN0IGFuIGFscmVhZHkgb3BlbiBkZXNjcmlwdG9yIGFyZSBhbHNvIGxlZnQgYWxvbmUsIHNpbmNlIHRoZXJlXG4rICogaXMgbm8gZXF1aXZhbGVudCByZXRyeSB0byByZWFjaCBhbmQgY29udmVydGluZyB0aGUgZXJyb3Igd291bGQgcmVuYW1lIGFcbisgKiBmYWlsdXJlIHJhdGhlciB0aGFuIHJlcGFpciBpdCwgYW5kIEZVU0VfSU9DVEwgYW5kIEZVU0VfUE9MTCBoYW5kIHRoZVxuKyAqIHNlcnZlcidzIGVycm5vIHRvIHVzZXJzcGFjZSB2ZXJiYXRpbS5cbisgKi9cbitzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfZml4dXBfc3RhbGVfZXJyb3Ioc3RydWN0IGZ1c2VfcmVxICpyZXEpXG4re1xuK1x0aWYgKHJlcS1cdTAwM2VvdXQuaC5lcnJvciAhPSAtRU5PRU5UKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRzd2l0Y2ggKHJlcS1cdTAwM2Vpbi5oLm9wY29kZSkge1xuK1x0Y2FzZSBGVVNFX09QRU46XG4rXHRjYXNlIEZVU0VfT1BFTkRJUjpcbitcdFx0LypcbitcdFx0ICogQW4gb3BlbiBzYXlzIEVPUEVOU1RBTEUsIGFuZCBwYXRoX29wZW5hdCgpIGRlY2lkZXMgd2hhdCB0aGVcbitcdFx0ICogd2FsayBpbiBwcm9ncmVzcyBzaG91bGQgbWFrZSBvZiBpdDogRUNISUxEIHVuZGVyIExPT0tVUF9SQ1VcbitcdFx0ICogc28gaXQgZHJvcHMgdG8gUkVGLXdhbGssIEVTVEFMRSBvdGhlcndpc2Ugc28gdGhlIG5hbWUgaXNcbitcdFx0ICogcmVzb2x2ZWQgYWdhaW4gdW5kZXIgTE9PS1VQX1JFVkFMLiBOYW1pbmcgRVNUQUxFIGhlcmUgd291bGRcbitcdFx0ICogdGFrZSB0aGUgc2Vjb25kIGluIGJvdGggY2FzZXMgYW5kIHNraXAgYSBjaGVhcGVyIHJldHJ5LlxuK1x0XHQgKi9cbitcdFx0cmVxLVx1MDAzZW91dC5oLmVycm9yID0gLUVPUEVOU1RBTEU7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBGVVNFX0dFVEFUVFI6XG4rXHRjYXNlIEZVU0VfU0VUQVRUUjpcbitcdGNhc2UgRlVTRV9SRUFETElOSzpcbitcdGNhc2UgRlVTRV9TVEFURlM6XG4rXHRcdC8qXG4rXHRcdCAqIE5vdGhpbmcgdHJhbnNsYXRlcyBFT1BFTlNUQUxFIG91dHNpZGUgdGhlIG9wZW4gcGF0aCwgc29cbitcdFx0ICogdGhlc2Ugc2F5IEVTVEFMRSBkaXJlY3RseSwgd2hpY2ggcmV0cnlfZXN0YWxlKCkgYW5zd2Vycy5cbitcdFx0ICovXG4rXHRcdHJlcS1cdTAwM2VvdXQuaC5lcnJvciA9IC1FU1RBTEU7XG4rXHRcdGJyZWFrO1xuK1x0fVxuK31cbitcbiAvKiBXb3JrIGZ1bmN0aW9uIGZvciByZXF1ZXN0IGNvbXBsZXRpb24gKi9cbiBzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZShzdHJ1Y3QgZnVzZV9yZXEgKnJlcSxcbiBcdFx0XHRcdCAgICAgICBzdHJ1Y3QgdmlydGlvX2ZzX3ZxICpmc3ZxKVxuQEAgLTgxMCw2ICs4NzAsOCBAQCBzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZShzdHJ1Y3QgZnVzZV9yZXEgKnJlcSxcbiBcbiBcdGNsZWFyX2JpdChGUl9TRU5ULCBcdTAwMjZyZXEtXHUwMDNlZmxhZ3MpO1xuIFxuK1x0dmlydGlvX2ZzX2ZpeHVwX3N0YWxlX2Vycm9yKHJlcSk7XG4rXG4gXHRmdXNlX3JlcXVlc3RfZW5kKHJlcSk7XG4gXHRzcGluX2xvY2soXHUwMDI2ZnN2cS1cdTAwM2Vsb2NrKTtcbiBcdGRlY19pbl9mbGlnaHRfcmVxKGZzdnEpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZVxuaW5kZXggZmI1MTYwM2ZlNDE5OC4uOWNiMzA0ODEyOGQ1YiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZVxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uZ2l0aWdub3JlXG5AQCAtMSw0ICsxLDYgQEBcbiAjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbitmdXNlX2FjbF9jYWNoZV90ZXN0XG4gZnVzZV9tbnRcbitmdXNlX2VzdGFsZV90ZXN0XG4gZnVzZWN0bF90ZXN0XG4gd3JpdGVfZXh0ZW5kX2VvZl90ZXN0XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvTWFrZWZpbGVcbmluZGV4IDk1YTFlZTk0N2NhNzYuLmY1NjRjYjM3YjNhNWIgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL01ha2VmaWxlXG5AQCAtNiwxMSArNiwxMiBAQCBURVNUX0dFTl9QUk9HUyA6PSBmdXNlY3RsX3Rlc3RcbiBURVNUX0dFTl9QUk9HUyArPSB3cml0ZV9leHRlbmRfZW9mX3Rlc3RcbiBURVNUX0dFTl9GSUxFUyA6PSBmdXNlX21udFxuIFxuLSMgZnVzZV9hY2xfY2FjaGVfdGVzdCByZXF1aXJlcyBsaWJmdXNlMzsgYWRkIGl0IG9ubHkgd2hlbiB0aGUgbGlicmFyeSBpcyBwcmVzZW50LlxuLUFDTF9DRkxBR1MgOj0gJChzaGVsbCBwa2ctY29uZmlnIGZ1c2UzIC0tY2ZsYWdzIDJcdTAwM2UvZGV2L251bGwpXG4tQUNMX0xETElCUyA6PSAkKHNoZWxsIHBrZy1jb25maWcgZnVzZTMgLS1saWJzIDJcdTAwM2UvZGV2L251bGwpXG4taWZuZXEgKCQoQUNMX0NGTEFHUyksKVxuKyMgVGhlc2UgdGVzdHMgcmVxdWlyZSBsaWJmdXNlMzsgYWRkIHRoZW0gb25seSB3aGVuIHRoZSBsaWJyYXJ5IGlzIHByZXNlbnQuXG4rRlVTRTNfQ0ZMQUdTIDo9ICQoc2hlbGwgcGtnLWNvbmZpZyBmdXNlMyAtLWNmbGFncyAyXHUwMDNlL2Rldi9udWxsKVxuK0ZVU0UzX0xETElCUyA6PSAkKHNoZWxsIHBrZy1jb25maWcgZnVzZTMgLS1saWJzIDJcdTAwM2UvZGV2L251bGwpXG4raWZuZXEgKCQoRlVTRTNfQ0ZMQUdTKSwpXG4gVEVTVF9HRU5fUFJPR1MgKz0gZnVzZV9hY2xfY2FjaGVfdGVzdFxuK1RFU1RfR0VOX1BST0dTICs9IGZ1c2VfZXN0YWxlX3Rlc3RcbiBlbmRpZlxuIFxuIGluY2x1ZGUgLi4vLi4vbGliLm1rXG5AQCAtMzAsNSArMzEsOCBAQCBlbmRpZlxuICQoT1VUUFVUKS9mdXNlX21udDogQ0ZMQUdTICs9ICQoVkFSX0NGTEFHUylcbiAkKE9VVFBVVCkvZnVzZV9tbnQ6IExETElCUyArPSAkKFZBUl9MRExJQlMpXG4gXG4tJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IENGTEFHUyArPSAkKEFDTF9DRkxBR1MpXG4tJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IExETElCUyArPSAkKEFDTF9MRExJQlMpXG4rJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IENGTEFHUyArPSAkKEZVU0UzX0NGTEFHUylcbiskKE9VVFBVVCkvZnVzZV9hY2xfY2FjaGVfdGVzdDogTERMSUJTICs9ICQoRlVTRTNfTERMSUJTKVxuK1xuKyQoT1VUUFVUKS9mdXNlX2VzdGFsZV90ZXN0OiBDRkxBR1MgKz0gJChGVVNFM19DRkxBR1MpXG4rJChPVVRQVVQpL2Z1c2VfZXN0YWxlX3Rlc3Q6IExETElCUyArPSAkKEZVU0UzX0xETElCUylcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL2Z1c2VfZXN0YWxlX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvZnVzZV9lc3RhbGVfdGVzdC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uODJiODQyZDNhNWY3YlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9mdXNlX2VzdGFsZV90ZXN0LmNcbkBAIC0wLDAgKzEsNDUwIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIFRlc3Q6IGEgcmVxdWVzdCByZWZ1c2VkIGZvciBhbiBpbm9kZSB0aGUgY2xpZW50IHN0aWxsIGhvbGRzIGEgcmVmZXJlbmNlIHRvXG4rICpcbisgKiBGVVNFX09QRU4sIEZVU0VfR0VUQVRUUiwgRlVTRV9TRVRBVFRSLCBGVVNFX1JFQURMSU5LIGFuZCBGVVNFX1NUQVRGUyBjYXJyeSBhXG4rICogbm9kZWlkIHJhdGhlciB0aGFuIGEgcGF0aC4gIFRoZSBjbGllbnQgb25seSBzZW5kcyB0aGVtIGZvciBhbiBpbm9kZSBpdCBoYXNcbisgKiBhbHJlYWR5IGxvb2tlZCB1cCBhbmQgaG9sZHMgYSByZWZlcmVuY2UgdG8sIGFuZCBhIHNlcnZlciBvd2VzIHRoZSBjbGllbnQgdGhhdFxuKyAqIGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuICBBIHNlcnZlciB0aGF0IGxldHMgdGhlIGlub2RlIGdvIGVhcmx5LFxuKyAqIGFzIG9uZSBiYWNraW5nIGEgc2hhcmVkIGRpcmVjdG9yeSBkb2VzIHdoZW4gdGhlIG5hbWUgaXMgcmVuYW1lZCBvdmVyLCBhbnN3ZXJzXG4rICogd2l0aCBFTk9FTlQuXG4rICpcbisgKiBPbiBhbiB1bmZpeGVkIGtlcm5lbCB0aGF0IEVOT0VOVCBpcyBwYXNzZWQgb3V0IHVuY2hhbmdlZC4gIFRoZSBwYXRoIHdhbGsgaGFzXG4rICogbm8gcmVhc29uIHRvIGRvdWJ0IGl0IGFuZCB0aGUgY2FsbGVyIGlzIHRvbGQgYSBmaWxlIGlzIG1pc3Npbmcgd2hlbiBpdCBuZXZlclxuKyAqIHN0b3BwZWQgZXhpc3RpbmcuICBDYWxsZXJzIHRoYXQgcmVhZCBhIG1pc3NpbmcgZmlsZSBhcyBhbiBlbXB0eSBvbmUgYWN0IG9uXG4rICogdGhlIGVtcHRpbmVzcy5cbisgKlxuKyAqIEZpeGVkIChmcy9mdXNlL2ZpbGUuYyBhbmQgZnMvZnVzZS9kaXIuYyk6IEVOT0VOVCBiZWNvbWVzIEVTVEFMRSwgd2hpY2hcbisgKiBkZXNjcmliZXMgdGhlIGhhbmRsZSByYXRoZXIgdGhhbiB0aGUgbmFtZS4gIGZpbGVuYW1lX2xvb2t1cCgpIGFuZFxuKyAqIGRvX2ZpbHBfb3BlbigpIGFscmVhZHkgcmV0cnkgd2l0aCBMT09LVVBfUkVWQUwgb24gRVNUQUxFLCBzbyB0aGUgbmFtZSBpc1xuKyAqIHJlc29sdmVkIGFnYWluIGFuZCB0aGUgaW5vZGUgaXQgcmVmZXJzIHRvIG5vdyBpcyB1c2VkLiAgQSBuYW1lIHRoYXQgaGFzXG4rICogZ2VudWluZWx5IGdvbmUgYXdheSBmYWlscyB0aGUgcmV0cmllZCBsb29rdXAsIHNvIEVOT0VOVCBzdGlsbCByZWFjaGVzIGFcbisgKiBjYWxsZXIgdGhhdCBkZXNlcnZlcyBpdC5cbisgKlxuKyAqIE9ubHkgcmVxdWVzdHMgcmVhY2hhYmxlIHRocm91Z2ggYSBwYXRoIHdhbGsgYXJlIGNvdmVyZWQsIGJlY2F1c2UgdGhlIHJldHJ5XG4rICogaXMgd2hhdCBtYWtlcyBFU1RBTEUgdXNlZnVsIGFuZCB0aGUgd2FsayBpcyB3aGF0IHBlcmZvcm1zIGl0LiAgQW4gb3BlcmF0aW9uXG4rICogb24gYSBkZXNjcmlwdG9yIGFscmVhZHkgb3BlbiBoYXMgbm8gZXF1aXZhbGVudCByZWNvdmVyeS5cbisgKlxuKyAqIFRlc3Qgb3V0bGluZTpcbisgKiAgMS4gTW91bnQgYSBtaW5pbWFsIEZVU0UgZnMgaG9sZGluZyBvbmUgZmlsZS5cbisgKiAgMi4gVGhlIHNlcnZlciByZWZ1c2VzIHRoZSBmaXJzdCByZXF1ZXN0IG9mIHRoZSBraW5kIHVuZGVyIHRlc3QgYW5kIGFsbG93c1xuKyAqICAgICBldmVyeSBvbmUgYWZ0ZXIgaXQsIHN0YW5kaW5nIGluIGZvciBhIHNlcnZlciB0aGF0IHJlbGVhc2VkIHRoZSBpbm9kZSBhbmRcbisgKiAgICAgaGFzIHNpbmNlIHJlc29sdmVkIHRoZSBuYW1lIGFnYWluLlxuKyAqICAzLiBvcGVuYXQoKSB0aGUgZmlsZS5cbisgKiAgICAgQnVnZ3k6ICBFTk9FTlQgcmVhY2hlcyB0aGUgY2FsbGVyLCBvbmUgb3BlbiB3YXMgYXNrZWQgZm9yLiAgRkFJTC5cbisgKiAgICAgRml4ZWQ6ICB0aGUgd2FsayByZXRyaWVzLCB0aGUgc2Vjb25kIG9wZW4gaXMgYWxsb3dlZCwgdGhlIGRlc2NyaXB0b3IgaXNcbisgKiAgICAgICAgICAgICByZXR1cm5lZCwgdHdvIG9wZW5zIHdlcmUgYXNrZWQgZm9yLiAgUEFTUy5cbisgKiAgNC4gc3RhdCgpLCBjaG1vZCgpLCByZWFkbGluaygpIGFuZCBzdGF0ZnMoKSBieSBuYW1lLCB3aGljaCBhcmUgdGhlIHNhbWVcbisgKiAgICAgcmVjb3ZlcnkgdGhyb3VnaCBGVVNFX0dFVEFUVFIsIEZVU0VfU0VUQVRUUiwgRlVTRV9SRUFETElOSyBhbmRcbisgKiAgICAgRlVTRV9TVEFURlMuICBFYWNoIGlzIHJlYWNoZWQgdGhyb3VnaCBhIHBhdGggd2Fsaywgd2hpY2ggaXMgd2hhdCBtYWtlc1xuKyAqICAgICB0aGUgcmV0cnkgYXZhaWxhYmxlLlxuKyAqICA1LiBPcGVuIGEgbmFtZSB0aGUgc2VydmVyIGRvZXMgbm90IGhhdmUgYXQgYWxsLlxuKyAqICAgICBCb3RoOiAgIEVOT0VOVCwgYmVjYXVzZSB0aGUgbG9va3VwIGZhaWxzIHJhdGhlciB0aGFuIHRoZSBvcGVuLCBhbmQgYVxuKyAqICAgICAgICAgICAgIGZpbGUgdGhhdCBpcyBhYnNlbnQgbXVzdCBzdGlsbCBsb29rIGFic2VudC5cbisgKi9cbitcbisjZGVmaW5lIF9HTlVfU09VUkNFXG4rI2RlZmluZSBGVVNFX1VTRV9WRVJTSU9OIDM0XG4rXG4rI2luY2x1ZGUgXHUwMDNjZXJybm8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NmdXNlX2xvd2xldmVsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9saW1pdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGJvb2wuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3N0YXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0dmZzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvdmZzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwiLi4vLi4va3NlbGZ0ZXN0X2hhcm5lc3MuaFwiXG4rXG4rI2RlZmluZSBGSUxFX05BTUVcdFwiaGVsZFwiXG4rI2RlZmluZSBMSU5LX05BTUVcdFwiaGVsZC1saW5rXCJcbisjZGVmaW5lIEFCU0VOVF9OQU1FXHRcIm5vLXN1Y2gtZmlsZVwiXG4rI2RlZmluZSBGSUxFX0lOT1x0MlxuKyNkZWZpbmUgTElOS19JTk9cdDNcbisjZGVmaW5lIENPTlRFTlRTXHRcInByZXNlbnRcXG5cIlxuKyNkZWZpbmUgTElOS19UQVJHRVRcdEZJTEVfTkFNRVxuK1xuKy8qXG4rICogV2hpY2ggcmVxdWVzdCB0aGUgc2VydmVyIHJlZnVzZXMsIGFuZCBob3cgbWFueSB0aW1lcy4gIFNoYXJlZCB3aXRoIHRoZVxuKyAqIGRhZW1vbiB0aHJlYWQ7IG9uZSB0ZXN0IHJ1bnMgYXQgYSB0aW1lLCBzbyBwbGFpbiBpbnRzLlxuKyAqXG4rICogRXZlcnkgb25lIG9mIHRoZXNlIG5hbWVzIGFuIGlub2RlIGJ5IG5vZGVpZCByYXRoZXIgdGhhbiBieSBuYW1lLCBzbyBhXG4rICogcmVmdXNhbCBvZiBhbnkgb2YgdGhlbSBpcyBkZXNjcmliaW5nIGEgaGFuZGxlIHJhdGhlciB0aGFuIGEgbWlzc2luZyBmaWxlLlxuKyAqIEZVU0VfTE9PS1VQIGlzIGRlbGliZXJhdGVseSBhYnNlbnQ6IGl0IGNhcnJpZXMgYSBuYW1lLCBzbyBpdHMgRU5PRU5UIGlzIGFuXG4rICogYW5zd2VyIHJhdGhlciB0aGFuIGEgZmF1bHQsIGFuZCBhYnNlbnRfbmFtZV9zdGlsbF9yZXBvcnRzX2Fic2VudCBjb3ZlcnMgaXQuXG4rICovXG4rZW51bSByZWZ1c2Vfd2hhdCB7XG4rXHRSRUZVU0VfTk9USElORyxcbitcdFJFRlVTRV9PUEVOLFxuK1x0UkVGVVNFX0dFVEFUVFIsXG4rXHRSRUZVU0VfU0VUQVRUUixcbitcdFJFRlVTRV9SRUFETElOSyxcbitcdFJFRlVTRV9TVEFURlMsXG4rfTtcbitcbitzdGF0aWMgc3RydWN0IHtcbitcdGVudW0gcmVmdXNlX3doYXQgd2hhdDtcbitcdGludCByZWZ1c2Fsc19sZWZ0O1xuK1x0aW50IG9wZW5zX3NlZW47XG4rXHRpbnQgZ2V0YXR0cnNfc2VlbjtcbitcdGludCBzZXRhdHRyc19zZWVuO1xuK1x0aW50IHJlYWRsaW5rc19zZWVuO1xuK1x0aW50IHN0YXRmc3Nfc2Vlbjtcbit9IGdfZHM7XG4rXG4rLyogVHJ1ZSBvbmNlLCBmb3IgdGhlIHJlcXVlc3QgdW5kZXIgdGVzdCwgYW5kIHRoZW4gbmV2ZXIgYWdhaW4uICovXG4rc3RhdGljIGJvb2wgcmVmdXNlX25vdyhlbnVtIHJlZnVzZV93aGF0IHdoYXQpXG4re1xuK1x0aWYgKGdfZHMud2hhdCAhPSB3aGF0IHx8IGdfZHMucmVmdXNhbHNfbGVmdCBcdTAwM2M9IDApXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdGdfZHMucmVmdXNhbHNfbGVmdC0tO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGZpbGxfYXR0cihmdXNlX2lub190IGlubywgc3RydWN0IHN0YXQgKnN0KVxuK3tcbitcdG1lbXNldChzdCwgMCwgc2l6ZW9mKCpzdCkpO1xuK1x0c3QtXHUwMDNlc3RfaW5vID0gaW5vO1xuK1x0LypcbitcdCAqIE93bmVkIGJ5IHdob2V2ZXIgcnVucyB0aGUgdGVzdCwgc28gdGhhdCBjaG1vZCgpIGlzIGEgcmVxdWVzdCB0aGVcbitcdCAqIGtlcm5lbCB3aWxsIGNhcnJ5IHRocm91Z2ggdG8gdGhlIHNlcnZlciByYXRoZXIgdGhhbiByZWZ1c2UgaXRzZWxmLlxuK1x0ICovXG4rXHRzdC1cdTAwM2VzdF91aWQgPSBnZXR1aWQoKTtcbitcdHN0LVx1MDAzZXN0X2dpZCA9IGdldGdpZCgpO1xuK1x0aWYgKGlubyA9PSBGVVNFX1JPT1RfSUQpIHtcbitcdFx0c3QtXHUwMDNlc3RfbW9kZSA9IFNfSUZESVIgfCAwNzU1O1xuK1x0XHRzdC1cdTAwM2VzdF9ubGluayA9IDI7XG4rXHR9IGVsc2UgaWYgKGlubyA9PSBMSU5LX0lOTykge1xuK1x0XHRzdC1cdTAwM2VzdF9tb2RlID0gU19JRkxOSyB8IDA3Nzc7XG4rXHRcdHN0LVx1MDAzZXN0X25saW5rID0gMTtcbitcdFx0c3QtXHUwMDNlc3Rfc2l6ZSA9IHNpemVvZihMSU5LX1RBUkdFVCkgLSAxO1xuK1x0fSBlbHNlIHtcbitcdFx0c3QtXHUwMDNlc3RfbW9kZSA9IFNfSUZSRUcgfCAwNjQ0O1xuK1x0XHRzdC1cdTAwM2VzdF9ubGluayA9IDE7XG4rXHRcdHN0LVx1MDAzZXN0X3NpemUgPSBzaXplb2YoQ09OVEVOVFMpIC0gMTtcbitcdH1cbit9XG4rXG4rc3RhdGljIHZvaWQgdF9sb29rdXAoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgcGFyZW50LCBjb25zdCBjaGFyICpuYW1lKVxuK3tcbitcdHN0cnVjdCBmdXNlX2VudHJ5X3BhcmFtIGU7XG4rXHRmdXNlX2lub190IGlubztcbitcbitcdGlmIChwYXJlbnQgIT0gRlVTRV9ST09UX0lEKVxuK1x0XHRpbm8gPSAwO1xuK1x0ZWxzZSBpZiAoIXN0cmNtcChuYW1lLCBGSUxFX05BTUUpKVxuK1x0XHRpbm8gPSBGSUxFX0lOTztcbitcdGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgTElOS19OQU1FKSlcbitcdFx0aW5vID0gTElOS19JTk87XG4rXHRlbHNlXG4rXHRcdGlubyA9IDA7XG4rXG4rXHRpZiAoIWlubykge1xuK1x0XHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbitcdG1lbXNldChcdTAwMjZlLCAwLCBzaXplb2YoZSkpO1xuK1x0ZS5pbm8gPSBpbm87XG4rXHRlLmF0dHJfdGltZW91dCA9IDA7XG4rXHRlLmVudHJ5X3RpbWVvdXQgPSAwO1xuK1x0ZmlsbF9hdHRyKGlubywgXHUwMDI2ZS5hdHRyKTtcbitcdGZ1c2VfcmVwbHlfZW50cnkocmVxLCBcdTAwMjZlKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdF9nZXRhdHRyKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubyxcbitcdFx0ICAgICAgc3RydWN0IGZ1c2VfZmlsZV9pbmZvICpmaSlcbit7XG4rXHRzdHJ1Y3Qgc3RhdCBzdDtcbitcbitcdCh2b2lkKWZpO1xuK1x0LyogVGhlIHJvb3QgaXMgbGVmdCBhbG9uZTsgcmVmdXNpbmcgaXQgd291bGQgYnJlYWsgdGhlIG1vdW50IGl0c2VsZi4gKi9cbitcdGlmIChpbm8gPT0gRklMRV9JTk8pIHtcbitcdFx0Z19kcy5nZXRhdHRyc19zZWVuKys7XG4rXHRcdGlmIChyZWZ1c2Vfbm93KFJFRlVTRV9HRVRBVFRSKSkge1xuK1x0XHRcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTtcbitcdFx0XHRyZXR1cm47XG4rXHRcdH1cbitcdH1cbitcdGZpbGxfYXR0cihpbm8sIFx1MDAyNnN0KTtcbitcdGZ1c2VfcmVwbHlfYXR0cihyZXEsIFx1MDAyNnN0LCAwKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdF9vcGVuKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubywgc3RydWN0IGZ1c2VfZmlsZV9pbmZvICpmaSlcbit7XG4rXHRpZiAoaW5vICE9IEZJTEVfSU5PKSB7XG4rXHRcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuK1x0Z19kcy5vcGVuc19zZWVuKys7XG4rXHRpZiAocmVmdXNlX25vdyhSRUZVU0VfT1BFTikpIHtcbitcdFx0LypcbitcdFx0ICogVGhlIGlub2RlIGlzIGdvbmUgYXMgZmFyIGFzIHRoaXMgc2VydmVyIGlzIGNvbmNlcm5lZCwgZXZlblxuK1x0XHQgKiB0aG91Z2ggdGhlIGNsaWVudCBpcyBob2xkaW5nIGEgcmVmZXJlbmNlIHRvIGl0IGFuZCBhc2tlZCBieVxuK1x0XHQgKiBub2RlaWQgcmF0aGVyIHRoYW4gYnkgbmFtZS5cbitcdFx0ICovXG4rXHRcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1x0ZnVzZV9yZXBseV9vcGVuKHJlcSwgZmkpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0X3JlYWQoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgaW5vLCBzaXplX3Qgc2l6ZSwgb2ZmX3Qgb2ZmLFxuK1x0XHQgICBzdHJ1Y3QgZnVzZV9maWxlX2luZm8gKmZpKVxuK3tcbitcdHNpemVfdCBsZW4gPSBzaXplb2YoQ09OVEVOVFMpIC0gMTtcbitcbitcdCh2b2lkKWZpO1xuK1x0aWYgKGlubyAhPSBGSUxFX0lOTykge1xuK1x0XHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdGlmICgoc2l6ZV90KW9mZiBcdTAwM2U9IGxlbikge1xuK1x0XHRmdXNlX3JlcGx5X2J1ZihyZXEsIE5VTEwsIDApO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXHRpZiAob2ZmICsgc2l6ZSBcdTAwM2UgbGVuKVxuK1x0XHRzaXplID0gbGVuIC0gb2ZmO1xuK1x0ZnVzZV9yZXBseV9idWYocmVxLCBDT05URU5UUyArIG9mZiwgc2l6ZSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRfc2V0YXR0cihmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8sIHN0cnVjdCBzdGF0ICphdHRyLFxuK1x0XHQgICAgICBpbnQgdG9fc2V0LCBzdHJ1Y3QgZnVzZV9maWxlX2luZm8gKmZpKVxuK3tcbitcdHN0cnVjdCBzdGF0IHN0O1xuK1xuK1x0KHZvaWQpYXR0cjtcbitcdCh2b2lkKXRvX3NldDtcbitcdCh2b2lkKWZpO1xuK1x0aWYgKGlubyA9PSBGSUxFX0lOTykge1xuK1x0XHRnX2RzLnNldGF0dHJzX3NlZW4rKztcbitcdFx0aWYgKHJlZnVzZV9ub3coUkVGVVNFX1NFVEFUVFIpKSB7XG4rXHRcdFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpO1xuK1x0XHRcdHJldHVybjtcbitcdFx0fVxuK1x0fVxuK1x0ZmlsbF9hdHRyKGlubywgXHUwMDI2c3QpO1xuK1x0ZnVzZV9yZXBseV9hdHRyKHJlcSwgXHUwMDI2c3QsIDApO1xuK31cbitcbitzdGF0aWMgdm9pZCB0X3JlYWRsaW5rKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubylcbit7XG4rXHRpZiAoaW5vICE9IExJTktfSU5PKSB7XG4rXHRcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRUlOVkFMKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuK1x0Z19kcy5yZWFkbGlua3Nfc2VlbisrO1xuK1x0aWYgKHJlZnVzZV9ub3coUkVGVVNFX1JFQURMSU5LKSkge1xuK1x0XHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdGZ1c2VfcmVwbHlfcmVhZGxpbmsocmVxLCBMSU5LX1RBUkdFVCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRfc3RhdGZzKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubylcbit7XG4rXHRzdHJ1Y3Qgc3RhdHZmcyBzZnM7XG4rXG4rXHQodm9pZClpbm87XG4rXHRnX2RzLnN0YXRmc3Nfc2VlbisrO1xuK1x0aWYgKHJlZnVzZV9ub3coUkVGVVNFX1NUQVRGUykpIHtcbitcdFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRtZW1zZXQoXHUwMDI2c2ZzLCAwLCBzaXplb2Yoc2ZzKSk7XG4rXHRzZnMuZl9ic2l6ZSA9IDUxMjtcbitcdHNmcy5mX2Zyc2l6ZSA9IDUxMjtcbitcdHNmcy5mX25hbWVtYXggPSBOQU1FX01BWDtcbitcdGZ1c2VfcmVwbHlfc3RhdGZzKHJlcSwgXHUwMDI2c2ZzKTtcbit9XG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBmdXNlX2xvd2xldmVsX29wcyBmc19vcHMgPSB7XG4rXHQubG9va3VwXHRcdD0gdF9sb29rdXAsXG4rXHQuZ2V0YXR0clx0PSB0X2dldGF0dHIsXG4rXHQuc2V0YXR0clx0PSB0X3NldGF0dHIsXG4rXHQucmVhZGxpbmtcdD0gdF9yZWFkbGluayxcbitcdC5zdGF0ZnNcdFx0PSB0X3N0YXRmcyxcbitcdC5vcGVuXHRcdD0gdF9vcGVuLFxuK1x0LnJlYWRcdFx0PSB0X3JlYWQsXG4rfTtcbitcbitzdGF0aWMgdm9pZCAqcnVuX2RhZW1vbih2b2lkICphcmcpXG4re1xuK1x0ZnVzZV9zZXNzaW9uX2xvb3AoKHN0cnVjdCBmdXNlX3Nlc3Npb24gKilhcmcpO1xuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuKy8qIC0tLS0ga3NlbGZ0ZXN0IGhhcm5lc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4rXG4rRklYVFVSRShvcGVuX2VzdGFsZSkge1xuK1x0c3RydWN0IGZ1c2Vfc2Vzc2lvbiAqc2U7XG4rXHRjaGFyICAgICAgICAgICAgICAgICBtb3VudHBvaW50W1BBVEhfTUFYXTtcbitcdGNoYXIgICAgICAgICAgICAgICAgIGZpbGVfcGF0aFtQQVRIX01BWF07XG4rXHRjaGFyICAgICAgICAgICAgICAgICBsaW5rX3BhdGhbUEFUSF9NQVhdO1xuK1x0Y2hhciAgICAgICAgICAgICAgICAgYWJzZW50X3BhdGhbUEFUSF9NQVhdO1xuK1x0cHRocmVhZF90ICAgICAgICAgICAgdGhyZWFkO1xuK307XG4rXG4rRklYVFVSRV9TRVRVUChvcGVuX2VzdGFsZSlcbit7XG4rXHRjaGFyICpmdXNlX2FyZ3ZbXSA9IHsgXCJmdXNlX2VzdGFsZV90ZXN0XCIsIE5VTEwgfTtcbitcdHN0cnVjdCBmdXNlX2FyZ3MgYXJncyA9IEZVU0VfQVJHU19JTklUKDEsIGZ1c2VfYXJndik7XG4rXG4rXHRtZW1zZXQoXHUwMDI2Z19kcywgMCwgc2l6ZW9mKGdfZHMpKTtcbitcdGdfZHMud2hhdCA9IFJFRlVTRV9OT1RISU5HO1xuK1x0Z19kcy5yZWZ1c2Fsc19sZWZ0ID0gMTtcbitcbitcdHN0cmNweShzZWxmLVx1MDAzZW1vdW50cG9pbnQsIFwiL3RtcC9vcGVuX2VzdGFsZV90ZXN0X1hYWFhYWFwiKTtcbitcdGlmICghbWtkdGVtcChzZWxmLVx1MDAzZW1vdW50cG9pbnQpKVxuK1x0XHRTS0lQKHJldHVybiwgXCJta2R0ZW1wOiAlc1wiLCBzdHJlcnJvcihlcnJubykpO1xuK1xuK1x0c25wcmludGYoc2VsZi1cdTAwM2VmaWxlX3BhdGgsIHNpemVvZihzZWxmLVx1MDAzZWZpbGVfcGF0aCksXG4rXHRcdCBcIiVzL1wiIEZJTEVfTkFNRSwgc2VsZi1cdTAwM2Vtb3VudHBvaW50KTtcbitcdHNucHJpbnRmKHNlbGYtXHUwMDNlbGlua19wYXRoLCBzaXplb2Yoc2VsZi1cdTAwM2VsaW5rX3BhdGgpLFxuK1x0XHQgXCIlcy9cIiBMSU5LX05BTUUsIHNlbGYtXHUwMDNlbW91bnRwb2ludCk7XG4rXHRzbnByaW50ZihzZWxmLVx1MDAzZWFic2VudF9wYXRoLCBzaXplb2Yoc2VsZi1cdTAwM2VhYnNlbnRfcGF0aCksXG4rXHRcdCBcIiVzL1wiIEFCU0VOVF9OQU1FLCBzZWxmLVx1MDAzZW1vdW50cG9pbnQpO1xuK1xuK1x0c2VsZi1cdTAwM2VzZSA9IGZ1c2Vfc2Vzc2lvbl9uZXcoXHUwMDI2YXJncywgXHUwMDI2ZnNfb3BzLCBzaXplb2YoZnNfb3BzKSwgTlVMTCk7XG4rXHRpZiAoIXNlbGYtXHUwMDNlc2UpIHtcbitcdFx0cm1kaXIoc2VsZi1cdTAwM2Vtb3VudHBvaW50KTtcbitcdFx0U0tJUChyZXR1cm4sIFwiZnVzZV9zZXNzaW9uX25ldyBmYWlsZWRcIik7XG4rXHR9XG4rXG4rXHRpZiAoZnVzZV9zZXNzaW9uX21vdW50KHNlbGYtXHUwMDNlc2UsIHNlbGYtXHUwMDNlbW91bnRwb2ludCkpIHtcbitcdFx0ZnVzZV9zZXNzaW9uX2Rlc3Ryb3koc2VsZi1cdTAwM2VzZSk7XG4rXHRcdHJtZGlyKHNlbGYtXHUwMDNlbW91bnRwb2ludCk7XG4rXHRcdFNLSVAocmV0dXJuLCBcImZ1c2Vfc2Vzc2lvbl9tb3VudCBmYWlsZWQgKG5vIGZ1c2VybW91bnQzIG9yIG5vIHByaXZpbGVnZXMpXCIpO1xuK1x0fVxuK1xuK1x0aWYgKHB0aHJlYWRfY3JlYXRlKFx1MDAyNnNlbGYtXHUwMDNldGhyZWFkLCBOVUxMLCBydW5fZGFlbW9uLCBzZWxmLVx1MDAzZXNlKSkge1xuK1x0XHRmdXNlX3Nlc3Npb25fdW5tb3VudChzZWxmLVx1MDAzZXNlKTtcbitcdFx0ZnVzZV9zZXNzaW9uX2Rlc3Ryb3koc2VsZi1cdTAwM2VzZSk7XG4rXHRcdHJtZGlyKHNlbGYtXHUwMDNlbW91bnRwb2ludCk7XG4rXHRcdFNLSVAocmV0dXJuLCBcInB0aHJlYWRfY3JlYXRlOiAlc1wiLCBzdHJlcnJvcihlcnJubykpO1xuK1x0fVxuK1xuK1x0ZnVzZV9vcHRfZnJlZV9hcmdzKFx1MDAyNmFyZ3MpO1xuK31cbitcbitGSVhUVVJFX1RFQVJET1dOKG9wZW5fZXN0YWxlKVxuK3tcbitcdGZ1c2Vfc2Vzc2lvbl9leGl0KHNlbGYtXHUwMDNlc2UpO1xuK1x0ZnVzZV9zZXNzaW9uX3VubW91bnQoc2VsZi1cdTAwM2VzZSk7XG4rXHRwdGhyZWFkX2pvaW4oc2VsZi1cdTAwM2V0aHJlYWQsIE5VTEwpO1xuK1x0ZnVzZV9zZXNzaW9uX2Rlc3Ryb3koc2VsZi1cdTAwM2VzZSk7XG4rXHRybWRpcihzZWxmLVx1MDAzZW1vdW50cG9pbnQpO1xuK31cbitcbitURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfb3Blbl9pc19yZXRyaWVkKVxuK3tcbitcdGludCBmZDtcbitcbitcdGdfZHMud2hhdCA9IFJFRlVTRV9PUEVOO1xuK1xuK1x0ZmQgPSBvcGVuKHNlbGYtXHUwMDNlZmlsZV9wYXRoLCBPX1JET05MWSk7XG4rXG4rXHQvKlxuK1x0ICogVGhlIHJlZnVzYWwgZGVzY3JpYmVzIGEgaGFuZGxlIHRoZSBzZXJ2ZXIgc2hvdWxkIGhhdmUgaG9ub3VyZWQsIHNvXG4rXHQgKiB0aGUgd2FsayBpcyBlbnRpdGxlZCB0byByZXNvbHZlIHRoZSBuYW1lIGFnYWluIGFuZCBvcGVuIHdoYXQgaXRcbitcdCAqIHJlZmVycyB0byBub3cuIFJlcG9ydGluZyB0aGUgZmlsZSBtaXNzaW5nIGluc3RlYWQgZW5kcyB0aGUgd2Fsay5cbitcdCAqL1xuK1x0QVNTRVJUX0dFKGZkLCAwKSB7XG4rXHRcdFRIX0xPRyhcIm9wZW4gZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgb3BlbiByZXF1ZXN0KHMpXCIsXG4rXHRcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMub3BlbnNfc2Vlbik7XG4rXHR9XG4rXHRFWFBFQ1RfRVEoMiwgZ19kcy5vcGVuc19zZWVuKTtcbitcdGNsb3NlKGZkKTtcbit9XG4rXG4rVEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX2dldGF0dHJfb25fcGF0aF9pc19yZXRyaWVkKVxuK3tcbitcdHN0cnVjdCBzdGF0IHN0O1xuK1xuK1x0Z19kcy53aGF0ID0gUkVGVVNFX0dFVEFUVFI7XG4rXG4rXHQvKlxuK1x0ICogUmVhY2hlZCBieSBuYW1lLCBzbyB0aGUgd2FsayBjYW4gcmVzb2x2ZSBpdCBhZ2FpbiBhbmQgYXNrIGEgc2Vjb25kXG4rXHQgKiB0aW1lLCB0aGUgc2FtZSByZWNvdmVyeSB0aGUgb3BlbiBnZXRzLlxuK1x0ICovXG4rXHRBU1NFUlRfRVEoMCwgc3RhdChzZWxmLVx1MDAzZWZpbGVfcGF0aCwgXHUwMDI2c3QpKSB7XG4rXHRcdFRIX0xPRyhcInN0YXQgZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgZ2V0YXR0ciByZXF1ZXN0KHMpXCIsXG4rXHRcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMuZ2V0YXR0cnNfc2Vlbik7XG4rXHR9XG4rXHRFWFBFQ1RfR1QoZ19kcy5nZXRhdHRyc19zZWVuLCAxKTtcbit9XG4rXG4rVEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX3NldGF0dHJfb25fcGF0aF9pc19yZXRyaWVkKVxuK3tcbitcdGdfZHMud2hhdCA9IFJFRlVTRV9TRVRBVFRSO1xuK1xuK1x0LypcbitcdCAqIGNobW9kKCkgcmVhY2hlcyB0aGUgaW5vZGUgYnkgbmFtZSwgc28gdGhlIHNhbWUgcmV0cnkgYXBwbGllczogdGhlXG4rXHQgKiByZWZ1c2FsIGRlc2NyaWJlcyBhIGhhbmRsZSBhbmQgdGhlIHdhbGsgbWF5IHJlc29sdmUgdGhlIG5hbWUgYWdhaW4uXG4rXHQgKi9cbitcdEFTU0VSVF9FUSgwLCBjaG1vZChzZWxmLVx1MDAzZWZpbGVfcGF0aCwgMDYwMCkpIHtcbitcdFx0VEhfTE9HKFwiY2htb2QgZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgc2V0YXR0ciByZXF1ZXN0KHMpXCIsXG4rXHRcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMuc2V0YXR0cnNfc2Vlbik7XG4rXHR9XG4rXHRFWFBFQ1RfR1QoZ19kcy5zZXRhdHRyc19zZWVuLCAxKTtcbit9XG4rXG4rVEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX3JlYWRsaW5rX29uX3BhdGhfaXNfcmV0cmllZClcbit7XG4rXHRjaGFyIGJ1ZltQQVRIX01BWF07XG4rXHRzc2l6ZV90IG47XG4rXG4rXHRnX2RzLndoYXQgPSBSRUZVU0VfUkVBRExJTks7XG4rXG4rXHRuID0gcmVhZGxpbmsoc2VsZi1cdTAwM2VsaW5rX3BhdGgsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKTtcbitcdEFTU0VSVF9HRShuLCAwKSB7XG4rXHRcdFRIX0xPRyhcInJlYWRsaW5rIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHJlYWRsaW5rIHJlcXVlc3QocylcIixcbitcdFx0ICAgICAgIHN0cmVycm9yKGVycm5vKSwgZ19kcy5yZWFkbGlua3Nfc2Vlbik7XG4rXHR9XG4rXHRidWZbbl0gPSAnXFwwJztcbitcdEVYUEVDVF9TVFJFUShMSU5LX1RBUkdFVCwgYnVmKTtcbitcdEVYUEVDVF9HVChnX2RzLnJlYWRsaW5rc19zZWVuLCAxKTtcbit9XG4rXG4rVEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX3N0YXRmc19vbl9wYXRoX2lzX3JldHJpZWQpXG4re1xuK1x0c3RydWN0IHN0YXRmcyBzZnM7XG4rXG4rXHRnX2RzLndoYXQgPSBSRUZVU0VfU1RBVEZTO1xuK1xuK1x0LypcbitcdCAqIHN0YXRmcygpIGRlc2NyaWJlcyB0aGUgbW91bnQgcmF0aGVyIHRoYW4gdGhlIGZpbGUsIGJ1dCBpdCBpcyBzdGlsbFxuK1x0ICogcmVhY2hlZCB0aHJvdWdoIGEgcGF0aCB3YWxrLCBzbyBhIHJlZnVzYWwgdGhhdCBuYW1lcyBhIGhhbmRsZSBpc1xuK1x0ICogcmV0cmllZCB0aGUgc2FtZSB3YXkuXG4rXHQgKi9cbitcdEFTU0VSVF9FUSgwLCBzdGF0ZnMoc2VsZi1cdTAwM2VmaWxlX3BhdGgsIFx1MDAyNnNmcykpIHtcbitcdFx0VEhfTE9HKFwic3RhdGZzIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHN0YXRmcyByZXF1ZXN0KHMpXCIsXG4rXHRcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMuc3RhdGZzc19zZWVuKTtcbitcdH1cbitcdEVYUEVDVF9HVChnX2RzLnN0YXRmc3Nfc2VlbiwgMSk7XG4rfVxuK1xuK1RFU1RfRihvcGVuX2VzdGFsZSwgYWJzZW50X25hbWVfc3RpbGxfcmVwb3J0c19hYnNlbnQpXG4re1xuK1x0aW50IGZkO1xuK1xuK1x0LypcbitcdCAqIEhlcmUgaXQgaXMgdGhlIGxvb2t1cCB0aGF0IGZhaWxzIHJhdGhlciB0aGFuIHRoZSBvcGVuLCBzbyBub3RoaW5nIGlzXG4rXHQgKiBiZWluZyBkZXNjcmliZWQgYXMgc3RhbGUgYW5kIHRoZSBjYWxsZXIgbXVzdCBzdGlsbCBiZSB0b2xkIHRoZSBuYW1lXG4rXHQgKiBpcyBub3QgdGhlcmUuXG4rXHQgKi9cbitcdGZkID0gb3BlbihzZWxmLVx1MDAzZWFic2VudF9wYXRoLCBPX1JET05MWSk7XG4rXHRBU1NFUlRfTFQoZmQsIDApO1xuK1x0RVhQRUNUX0VRKEVOT0VOVCwgZXJybm8pO1xuK31cbitcbitURVNUX0hBUk5FU1NfTUFJTlxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMDA6MDU6MzIuMzI5Mzg3MjE4WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NzMzNzgxOTMwMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhpcyBQYXRjaCBTZXJpZXMgZm9yIEZ1enppbmcgUG90ZW50aWFsKipcblxuT2theSwgc28gdGhlIHRhc2sgYXQgaGFuZCBpcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBMaW51eCBrZXJuZWwgcGF0Y2ggc2VyaWVzIG1lcml0cyBmdXp6aW5nIGF0dGVudGlvbi4gQW5kIGlmIGl0IGRvZXMsIHRoZSBuZXh0IHN0ZXAgaXMgdG8gcGlucG9pbnQgdGhlIGNydWNpYWwgYEZvY3VzU3ltYm9sc2AgYW5kIGBFbmFibGVDb25maWdzYCB0aGF0IHdpbGwgbWFrZSBmdXp6aW5nIG1vc3QgZWZmZWN0aXZlLiBMZXQncyBkaWcgaW4uIFRoZSBpbml0aWFsIGdsYW5jZSBhdCB0aGUgcGF0Y2ggcmV2ZWFscyBpdHMgc2NvcGU6IGl0J3MgcGxheWluZyBpbiB0aGUgYGZzL2Z1c2VgIGRpcmVjdG9yeSwgdG91Y2hpbmcgYGRpci5jYCwgYGZpbGUuY2AsIGBmdXNlX2kuaGAsIGBpbm9kZS5jYCwgYW5kIGB2aXJ0aW9fZnMuY2AsIHBsdXMgYSBjaHVuayBvZiB0aGUgc2VsZi10ZXN0cyBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uLi5gLiBUaGlzIHRlbGxzIG1lIHdlJ3JlIGxvb2tpbmcgYXQgcG90ZW50aWFsbHkgc2Vuc2l0aXZlIGZpbGVzeXN0ZW0gaW50ZXJhY3Rpb25zIHdpdGhpbiB0aGUgRlVTRSAoRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UpIGNvbnRleHQsIHdoaWNoIGlzIGRlZmluaXRlbHkgc29tZXRoaW5nIEkgd2FudCB0byB0YWtlIGEgY2xvc2VyIGxvb2sgYXQuXG5cbk5vdywgaXQncyB0aW1lIHRvIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzOiBJJ2xsIHN0YXJ0IGJ5IGV4YW1pbmluZyB0aGUgcmVsZXZhbnQgYEtjb25maWdgIGZpbGVzLiBUaGF0J3MgdGhlIGdvLXRvIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBkZXBlbmRlbmNpZXMgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhdCBwbGF5LiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byB1c2UgbXkgZ3JlcHBlciBvciBwZXJoYXBzIGEgcXVpY2sgYHJlYWQtZmlsZWAgdG8gZ2V0IGEgaGFuZGxlIG9uIHdoYXQncyBhdmFpbGFibGUgYW5kIGNvbmRpdGlvbmFsIG9uIHRoaXMgc2VjdGlvbiBvZiBjb2RlLiBUaGUgYWltIGlzIHRvIHVuZGVyc3RhbmQgd2hhdCBidWlsZCBmbGFncyBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSByZWxldmFudCBhbmQgaG93IHRoZXkgbWlnaHQgaW5mbHVlbmNlIHRoZSBhdHRhY2sgc3VyZmFjZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAxMzIsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNDcsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQwMDowNTozOS42NjcyMDg3OVoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NDcxMjEyNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJGVVNFX0ZTXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2Z1c2VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZnVzZS9LY29uZmlnLTEtIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuZnMvZnVzZS9LY29uZmlnOjI6Y29uZmlnIEZVU0VfRlNcXG5mcy9mdXNlL0tjb25maWctMy1cXHR0cmlzdGF0ZSBcXFwiRlVTRSAoRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UpIHN1cHBvcnRcXFwiXFxuLS1cXG5mcy9mdXNlL0tjb25maWc9MjI9Y29uZmlnIENVU0VcXG5mcy9mdXNlL0tjb25maWctMjMtXFx0dHJpc3RhdGUgXFxcIkNoYXJhY3RlciBkZXZpY2UgaW4gVXNlcnNwYWNlIHN1cHBvcnRcXFwiXFxuZnMvZnVzZS9LY29uZmlnOjI0OlxcdGRlcGVuZHMgb24gRlVTRV9GU1xcbmZzL2Z1c2UvS2NvbmZpZy0yNS1cXHRoZWxwXFxuLS1cXG5mcy9mdXNlL0tjb25maWc9MzI9Y29uZmlnIFZJUlRJT19GU1xcbmZzL2Z1c2UvS2NvbmZpZy0zMy1cXHR0cmlzdGF0ZSBcXFwiVmlydGlvIEZpbGVzeXN0ZW1cXFwiXFxuZnMvZnVzZS9LY29uZmlnOjM0OlxcdGRlcGVuZHMgb24gRlVTRV9GU1xcbmZzL2Z1c2UvS2NvbmZpZy0zNS1cXHRzZWxlY3QgVklSVElPXFxuLS1cXG5mcy9mdXNlL0tjb25maWc9NTc9Y29uZmlnIEZVU0VfUEFTU1RIUk9VR0hcXG4tLVxcbmZzL2Z1c2UvS2NvbmZpZy01OS1cXHRkZWZhdWx0IHlcXG5mcy9mdXNlL0tjb25maWc6NjA6XFx0ZGVwZW5kcyBvbiBGVVNFX0ZTXFxuZnMvZnVzZS9LY29uZmlnLTYxLVxcdHNlbGVjdCBGU19TVEFDS1xcbi0tXFxuZnMvZnVzZS9LY29uZmlnPTY4PWNvbmZpZyBGVVNFX0lPX1VSSU5HXFxuLS1cXG5mcy9mdXNlL0tjb25maWctNzAtXFx0ZGVmYXVsdCB5XFxuZnMvZnVzZS9LY29uZmlnOjcxOlxcdGRlcGVuZHMgb24gRlVTRV9GU1xcbmZzL2Z1c2UvS2NvbmZpZy03Mi1cXHRkZXBlbmRzIG9uIElPX1VSSU5HXFxuLS1cXG5mcy9mdXNlL01ha2VmaWxlPTc9Y2NmbGFncy15ID0gLUkkKHNyYylcXG5mcy9mdXNlL01ha2VmaWxlLTgtXFxuZnMvZnVzZS9NYWtlZmlsZTo5Om9iai0kKENPTkZJR19GVVNFX0ZTKSArPSBmdXNlLm9cXG5mcy9mdXNlL01ha2VmaWxlLTEwLW9iai0kKENPTkZJR19DVVNFKSArPSBjdXNlLm9cXG4tLVxcbmZzL2Z1c2UvZGlyLmM9MTk0Nj1zdGF0aWMgaW50IGZ1c2VfZGlyX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsXFxuLS1cXG5mcy9mdXNlL2Rpci5jLTE5NTktXFx0aW5vZGVfbG9jayhpbm9kZSk7XFxuZnMvZnVzZS9kaXIuYzoxOTYwOlxcdGVyciA9IGZ1c2VfZnN5bmNfY29tbW9uKGZpbGUsIHN0YXJ0LCBlbmQsIGRhdGFzeW5jLCBGVVNFX0ZTWU5DRElSKTtcXG5mcy9mdXNlL2Rpci5jLTE5NjEtXFx0aWYgKGVyciA9PSAtRU5PU1lTKSB7XFxuLS1cXG5mcy9mdXNlL2ZpbGUuYz01MzE9aW50IGZ1c2VfZnN5bmNfY29tbW9uKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsXFxuLS1cXG5mcy9mdXNlL2ZpbGUuYy01NDEtXFx0aW5hcmcuZmggPSBmZi1cXHUwMDNlZmg7XFxuZnMvZnVzZS9maWxlLmM6NTQyOlxcdGluYXJnLmZzeW5jX2ZsYWdzID0gZGF0YXN5bmMgPyBGVVNFX0ZTWU5DX0ZEQVRBU1lOQyA6IDA7XFxuZnMvZnVzZS9maWxlLmMtNTQzLVxcdGFyZ3Mub3Bjb2RlID0gb3Bjb2RlO1xcbi0tXFxuZnMvZnVzZS9maWxlLmM9NTUxPXN0YXRpYyBpbnQgZnVzZV9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLFxcbi0tXFxuZnMvZnVzZS9maWxlLmMtNTg5LVxcbmZzL2Z1c2UvZmlsZS5jOjU5MDpcXHRlcnIgPSBmdXNlX2ZzeW5jX2NvbW1vbihmaWxlLCBzdGFydCwgZW5kLCBkYXRhc3luYywgRlVTRV9GU1lOQyk7XFxuZnMvZnVzZS9maWxlLmMtNTkxLVxcdGlmIChlcnIgPT0gLUVOT1NZUykge1xcbi0tXFxuZnMvZnVzZS9mdXNlX3RyYWNlLmgtMjctXFx0RU0oIEZVU0VfUkVMRUFTRSxcXHRcXHRcXFwiRlVTRV9SRUxFQVNFXFxcIilcXHRcXHRcXFxcXFxuZnMvZnVzZS9mdXNlX3RyYWNlLmg6Mjg6XFx0RU0oIEZVU0VfRlNZTkMsXFx0XFx0XFx0XFxcIkZVU0VfRlNZTkNcXFwiKVxcdFxcdFxcXFxcXG5mcy9mdXNlL2Z1c2VfdHJhY2UuaC0yOS1cXHRFTSggRlVTRV9TRVRYQVRUUixcXHRcXHRcXFwiRlVTRV9TRVRYQVRUUlxcXCIpXFx0XFxcXFxcbi0tXFxuZnMvZnVzZS9mdXNlX3RyYWNlLmgtMzctXFx0RU0oIEZVU0VfUkVMRUFTRURJUixcXHRcXHRcXFwiRlVTRV9SRUxFQVNFRElSXFxcIilcXHRcXFxcXFxuZnMvZnVzZS9mdXNlX3RyYWNlLmg6Mzg6XFx0RU0oIEZVU0VfRlNZTkNESVIsXFx0XFx0XFxcIkZVU0VfRlNZTkNESVJcXFwiKVxcdFxcXFxcXG5mcy9mdXNlL2Z1c2VfdHJhY2UuaC0zOS1cXHRFTSggRlVTRV9HRVRMSyxcXHRcXHRcXHRcXFwiRlVTRV9HRVRMS1xcXCIpXFx0XFx0XFxcXFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQwMDowNTozOS43MTE5MjQ3MjdaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo1MDc4Mjk4NTA3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byB0aGUgRlVTRSBLZXJuZWwgTW9kdWxlIENvbmZpZ3VyYXRpb24qKlxuXG5SaWdodCwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIExldCdzIHNlZSB3aGF0J3MgYWN0dWFsbHkgZ29pbmcgb24gd2l0aCB0aGUgRlVTRSBrZXJuZWwgbW9kdWxlIGJ1aWxkIGFuZCBjb25maWd1cmF0aW9uLiBNeSBpbml0aWFsIHN0ZXAgaXMgYWx3YXlzIHRvIGdvIHN0cmFpZ2h0IHRvIHRoZSBzb3VyY2UuIEknbSB0aGlua2luZyBJJ2xsIHN0YXJ0IGJ5IGNoZWNraW5nIHRoZSBgZnMvZnVzZS9LY29uZmlnYCBmaWxlLiBUaGF0J3Mgd2hlcmUgYWxsIHRoZSBidWlsZC10aW1lIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgRlVTRSBzaG91bGQgYmUgZGVmaW5lZCDigJMgdGhpbmdzIGxpa2Ugd2hldGhlciBpdCdzIGJ1aWx0LWluLCBhIG1vZHVsZSwgZmVhdHVyZXMgdG8gZW5hYmxlIG9yIGRpc2FibGUsIGFuZCBzbyBvbi4gVW5kZXJzdGFuZGluZyB0aGUgS2NvbmZpZyBvcHRpb25zIGlzIGZ1bmRhbWVudGFsIHRvIGNvbmZpZ3VyaW5nIHRoZSBGVVNFIG1vZHVsZSBhcHByb3ByaWF0ZWx5IGZvciBhIHNwZWNpZmljIGVudmlyb25tZW50IG9yIHVzZSBjYXNlLiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGljaCBvcHRpb25zIGFyZSBhdmFpbGFibGUgYW5kIHdoYXQgdGhleSdyZSBzZXQgdG8uIFRoZW4sIHdpdGggdGhhdCB1bmRlcnN0YW5kaW5nLCBJJ2xsIG1vdmUgb24gdG8gYGZzL2Z1c2UvTWFrZWZpbGVgLiBUaGUgTWFrZWZpbGUgd2lsbCBzaG93IG1lIHRoZSBidWlsZCBwcm9jZXNzIGl0c2VsZjogdGhlIGRlcGVuZGVuY2llcywgdGhlIHNvdXJjZSBmaWxlcyBpbmNsdWRlZCwgY29tcGlsZXIgZmxhZ3MsIGFuZCB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgb2YgaG93IEZVU0UgaXMgY29tcGlsZWQgYW5kIGxpbmtlZCBpbnRvIHRoZSBrZXJuZWwuIEJ5IGV4YW1pbmluZyBib3RoIG9mIHRoZXNlIGZpbGVzLCBJIHNob3VsZCBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIGhvdyBGVVNFIGlzIGludGVuZGVkIHRvIGJlIHVzZWQsIGl0cyBjb21waWxhdGlvbiBwcm9jZXNzLCBhbmQgdGhlIGZsZXhpYmlsaXR5IG9mZmVyZWQgdG8gYW4gZW5kLXVzZXIgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTYxNiwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDAwOjA1OjQ0Ljc5MDIyNTI0NFoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjcxMzg5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2Z1c2UvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiA3NVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbiAgIDI6XFx0Y29uZmlnIEZVU0VfRlNcXG4gICAzOlxcdFxcdHRyaXN0YXRlIFxcXCJGVVNFIChGaWxlc3lzdGVtIGluIFVzZXJzcGFjZSkgc3VwcG9ydFxcXCJcXG4gICA0OlxcdFxcdHNlbGVjdCBGU19QT1NJWF9BQ0xcXG4gICA1OlxcdFxcdHNlbGVjdCBGU19JT01BUFxcbiAgIDY6XFx0XFx0aGVscFxcbiAgIDc6XFx0XFx0ICBXaXRoIEZVU0UgaXQgaXMgcG9zc2libGUgdG8gaW1wbGVtZW50IGEgZnVsbHkgZnVuY3Rpb25hbCBmaWxlc3lzdGVtXFxuICAgODpcXHRcXHQgIGluIGEgdXNlcnNwYWNlIHByb2dyYW0uXFxuICAgOTpcXHRcXG4gIDEwOlxcdFxcdCAgVGhlcmUncyBhbHNvIGEgY29tcGFuaW9uIGxpYnJhcnk6IGxpYmZ1c2UyLiAgVGhpcyBsaWJyYXJ5IGlzIGF2YWlsYWJsZVxcbiAgMTE6XFx0XFx0ICBmcm9tIHRoZSBGVVNFIGhvbWVwYWdlOlxcbiAgMTI6XFx0XFx0ICBcXHUwMDNjaHR0cHM6Ly9naXRodWIuY29tL2xpYmZ1c2UvXFx1MDAzZVxcbiAgMTM6XFx0XFx0ICBhbHRob3VnaCBjaGFuY2VzIGFyZSB5b3VyIGRpc3RyaWJ1dGlvbiBhbHJlYWR5IGhhcyB0aGF0IGxpYnJhcnlcXG4gIDE0OlxcdFxcdCAgaW5zdGFsbGVkIGlmIHlvdSd2ZSBpbnN0YWxsZWQgdGhlIFxcXCJmdXNlXFxcIiBwYWNrYWdlIGl0c2VsZi5cXG4gIDE1OlxcdFxcbiAgMTY6XFx0XFx0ICBTZWUgXFx1MDAzY2ZpbGU6RG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9mdXNlL2Z1c2UucnN0XFx1MDAzZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cXG4gIDE3OlxcdFxcdCAgU2VlIFxcdTAwM2NmaWxlOkRvY3VtZW50YXRpb24vQ2hhbmdlc1xcdTAwM2UgZm9yIG5lZWRlZCBsaWJyYXJ5L3V0aWxpdHkgdmVyc2lvbi5cXG4gIDE4OlxcdFxcbiAgMTk6XFx0XFx0ICBJZiB5b3Ugd2FudCB0byBkZXZlbG9wIGEgdXNlcnNwYWNlIEZTLCBvciBpZiB5b3Ugd2FudCB0byB1c2VcXG4gIDIwOlxcdFxcdCAgYSBmaWxlc3lzdGVtIGJhc2VkIG9uIEZVU0UsIGFuc3dlciBZIG9yIE0uXFxuICAyMTpcXHRcXG4gIDIyOlxcdGNvbmZpZyBDVVNFXFxuICAyMzpcXHRcXHR0cmlzdGF0ZSBcXFwiQ2hhcmFjdGVyIGRldmljZSBpbiBVc2Vyc3BhY2Ugc3VwcG9ydFxcXCJcXG4gIDI0OlxcdFxcdGRlcGVuZHMgb24gRlVTRV9GU1xcbiAgMjU6XFx0XFx0aGVscFxcbiAgMjY6XFx0XFx0ICBUaGlzIEZVU0UgZXh0ZW5zaW9uIGFsbG93cyBjaGFyYWN0ZXIgZGV2aWNlcyB0byBiZVxcbiAgMjc6XFx0XFx0ICBpbXBsZW1lbnRlZCBpbiB1c2Vyc3BhY2UuXFxuICAyODpcXHRcXG4gIDI5OlxcdFxcdCAgSWYgeW91IHdhbnQgdG8gZGV2ZWxvcCBvciB1c2UgYSB1c2Vyc3BhY2UgY2hhcmFjdGVyIGRldmljZVxcbiAgMzA6XFx0XFx0ICBiYXNlZCBvbiBDVVNFLCBhbnN3ZXIgWSBvciBNLlxcbiAgMzE6XFx0XFxuICAzMjpcXHRjb25maWcgVklSVElPX0ZTXFxuICAzMzpcXHRcXHR0cmlzdGF0ZSBcXFwiVmlydGlvIEZpbGVzeXN0ZW1cXFwiXFxuICAzNDpcXHRcXHRkZXBlbmRzIG9uIEZVU0VfRlNcXG4gIDM1OlxcdFxcdHNlbGVjdCBWSVJUSU9cXG4gIDM2OlxcdFxcdGhlbHBcXG4gIDM3OlxcdFxcdCAgVGhlIFZpcnRpbyBGaWxlc3lzdGVtIGFsbG93cyBndWVzdHMgdG8gbW91bnQgZmlsZSBzeXN0ZW1zIGZyb20gdGhlXFxuICAzODpcXHRcXHQgIGhvc3QuXFxuICAzOTpcXHRcXG4gIDQwOlxcdFxcdCAgSWYgeW91IHdhbnQgdG8gc2hhcmUgZmlsZXMgYmV0d2VlbiBndWVzdHMgb3Igd2l0aCB0aGUgaG9zdCwgYW5zd2VyIFlcXG4gIDQxOlxcdFxcdCAgb3IgTS5cXG4gIDQyOlxcdFxcbiAgNDM6XFx0Y29uZmlnIEZVU0VfREFYXFxuICA0NDpcXHRcXHRib29sIFxcXCJWaXJ0aW8gRmlsZXN5c3RlbSBEaXJlY3QgSG9zdCBNZW1vcnkgQWNjZXNzIHN1cHBvcnRcXFwiXFxuICA0NTpcXHRcXHRkZWZhdWx0IHlcXG4gIDQ2OlxcdFxcdHNlbGVjdCBJTlRFUlZBTF9UUkVFXFxuICA0NzpcXHRcXHRkZXBlbmRzIG9uIFZJUlRJT19GU1xcbiAgNDg6XFx0XFx0ZGVwZW5kcyBvbiBGU19EQVhcXG4gIDQ5OlxcdFxcdGRlcGVuZHMgb24gREFYXFxuICA1MDpcXHRcXHRoZWxwXFxuICA1MTpcXHRcXHQgIFRoaXMgYWxsb3dzIGJ5cGFzc2luZyBndWVzdCBwYWdlIGNhY2hlIGFuZCBhbGxvd3MgbWFwcGluZyBob3N0IHBhZ2VcXG4gIDUyOlxcdFxcdCAgY2FjaGUgZGlyZWN0bHkgaW4gZ3Vlc3QgYWRkcmVzcyBzcGFjZS5cXG4gIDUzOlxcdFxcbiAgNTQ6XFx0XFx0ICBJZiB5b3Ugd2FudCB0byBhbGxvdyBtb3VudGluZyBhIFZpcnRpbyBGaWxlc3lzdGVtIHdpdGggdGhlIFxcXCJkYXhcXFwiXFxuICA1NTpcXHRcXHQgIG9wdGlvbiwgYW5zd2VyIFkuXFxuICA1NjpcXHRcXG4gIDU3OlxcdGNvbmZpZyBGVVNFX1BBU1NUSFJPVUdIXFxuICA1ODpcXHRcXHRib29sIFxcXCJGVVNFIHBhc3N0aHJvdWdoIG9wZXJhdGlvbnMgc3VwcG9ydFxcXCJcXG4gIDU5OlxcdFxcdGRlZmF1bHQgeVxcbiAgNjA6XFx0XFx0ZGVwZW5kcyBvbiBGVVNFX0ZTXFxuICA2MTpcXHRcXHRzZWxlY3QgRlNfU1RBQ0tcXG4gIDYyOlxcdFxcdGhlbHBcXG4gIDYzOlxcdFxcdCAgVGhpcyBhbGxvd3MgYnlwYXNzaW5nIEZVU0Ugc2VydmVyIGJ5IG1hcHBpbmcgc3BlY2lmaWMgRlVTRSBvcGVyYXRpb25zXFxuICA2NDpcXHRcXHQgIHRvIGJlIHBlcmZvcm1lZCBkaXJlY3RseSBvbiBhIGJhY2tpbmcgZmlsZS5cXG4gIDY1OlxcdFxcbiAgNjY6XFx0XFx0ICBJZiB5b3Ugd2FudCB0byBhbGxvdyBwYXNzdGhyb3VnaCBvcGVyYXRpb25zLCBhbnN3ZXIgWS5cXG4gIDY3OlxcdFxcbiAgNjg6XFx0Y29uZmlnIEZVU0VfSU9fVVJJTkdcXG4gIDY5OlxcdFxcdGJvb2wgXFxcIkZVU0UgY29tbXVuaWNhdGlvbiBvdmVyIGlvLXVyaW5nXFxcIlxcbiAgNzA6XFx0XFx0ZGVmYXVsdCB5XFxuICA3MTpcXHRcXHRkZXBlbmRzIG9uIEZVU0VfRlNcXG4gIDcyOlxcdFxcdGRlcGVuZHMgb24gSU9fVVJJTkdcXG4gIDczOlxcdFxcdGhlbHBcXG4gIDc0OlxcdFxcdCAgVGhpcyBhbGxvd3Mgc2VuZGluZyBGVVNFIHJlcXVlc3RzIG92ZXIgdGhlIGlvLXVyaW5nIGludGVyZmFjZSBhbmRcXG4gIDc1OlxcdCAgICAgICAgICBhbHNvIGFkZHMgcmVxdWVzdCBjb3JlIGFmZmluaXR5LlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQwMDowNTo0NC43OTAyOTg0NjRaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxODM0NTE2MjI0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czpcblxuKipBbmFseXppbmcgdGhlIEZ1c2UgTWFrZWZpbGUgZm9yIEJ1aWxkIENvbmZpZ3VyYXRpb25zKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoZSBgZnMvZnVzZS9NYWtlZmlsZWAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBidWlsZCBwcm9jZXNzIGZvciB0aGUgRlVTRSBtb2R1bGUuIEknbSBzcGVjaWZpY2FsbHkgaW50ZXJlc3RlZCBpbiBob3cgdGhlIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYWZmZWN0IHdoaWNoIGZpbGVzIGFyZSBjb21waWxlZCBhbmQgbGlua2VkLiBJIHdhbnQgdG8gc2VlIHdoaWNoIHNvdXJjZSBmaWxlcyBnZXQgaW5jbHVkZWQgb3IgZXhjbHVkZWQgYmFzZWQgb24gZGlmZmVyZW50IGtlcm5lbCBjb25maWdzLiBUaGlzIGxldmVsIG9mIGdyYW51bGFyIHVuZGVyc3RhbmRpbmcgaXMgY3JpdGljYWwgZm9yIGRlYnVnZ2luZyBhbmQgb3B0aW1pemF0aW9uLiBBIHRob3JvdWdoIHJldmlldyBvZiB0aGUgTWFrZWZpbGUgaXMgdGhlIGJlc3Qgd2F5IHRvIGdldCB0aGF0IGJpcmQncy1leWUgdmlldyBvZiB0aGUgYnVpbGQgcHJvY2Vzcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTI5MTEsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDAwOjA1OjQ2LjYyNDgxNjQ1OVoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU3MDExLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2Z1c2UvTWFrZWZpbGVcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogMjVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4gICAyOlxcdCNcXG4gICAzOlxcdCMgTWFrZWZpbGUgZm9yIHRoZSBGVVNFIGZpbGVzeXN0ZW0uXFxuICAgNDpcXHQjXFxuICAgNTpcXHRcXG4gICA2OlxcdCMgTmVlZGVkIGZvciB0cmFjZSBldmVudHNcXG4gICA3OlxcdGNjZmxhZ3MteSA9IC1JJChzcmMpXFxuICAgODpcXHRcXG4gICA5OlxcdG9iai0kKENPTkZJR19GVVNFX0ZTKSArPSBmdXNlLm9cXG4gIDEwOlxcdG9iai0kKENPTkZJR19DVVNFKSArPSBjdXNlLm9cXG4gIDExOlxcdG9iai0kKENPTkZJR19WSVJUSU9fRlMpICs9IHZpcnRpb2ZzLm9cXG4gIDEyOlxcdFxcbiAgMTM6XFx0ZnVzZS15IDo9IHRyYWNlLm9cXHQjIHB1dCB0cmFjZS5vIGZpcnN0IHNvIHdlIHNlZSBmdHJhY2UgZXJyb3JzIHNvb25lclxcbiAgMTQ6XFx0ZnVzZS15ICs9IGRldi5vIGRpci5vIGZpbGUubyBpbm9kZS5vIGNvbnRyb2wubyB4YXR0ci5vIGFjbC5vIHJlYWRkaXIubyBpb2N0bC5vIHJlcV90aW1lb3V0Lm8gcmVxLm9cXG4gIDE1OlxcdGZ1c2UteSArPSBwb2xsLm8gbm90aWZ5Lm9cXG4gIDE2OlxcdGZ1c2UteSArPSBpb21vZGUub1xcbiAgMTc6XFx0ZnVzZS0kKENPTkZJR19GVVNFX0RBWCkgKz0gZGF4Lm9cXG4gIDE4OlxcdGZ1c2UtJChDT05GSUdfRlVTRV9QQVNTVEhST1VHSCkgKz0gcGFzc3Rocm91Z2gubyBiYWNraW5nLm9cXG4gIDE5OlxcdGZ1c2UtJChDT05GSUdfU1lTQ1RMKSArPSBzeXNjdGwub1xcbiAgMjA6XFx0ZnVzZS0kKENPTkZJR19GVVNFX0lPX1VSSU5HKSArPSBkZXZfdXJpbmcub1xcbiAgMjE6XFx0XFxuICAyMjpcXHR2aXJ0aW9mcy15IDo9IHZpcnRpb19mcy5vXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDAwOjA1OjQ2LjYyNDg3NDkzOVoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQwNjAyOTkxNzY0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgRlVTRSBQYXRjaDogQSBGdXp6aW5nIE9wcG9ydHVuaXR5KipcblxuT2theSwgbGV0J3MgYnJlYWsgZG93biB0aGlzIHBhdGNoLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCBpdCdzIGZvY3VzaW5nIG9uIGVuaGFuY2luZyBGVVNFIGFuZCB2aXJ0aW8tZnMgZXJyb3IgaGFuZGxpbmcsIHNwZWNpZmljYWxseSBjb25jZXJuaW5nIEVOT0VOVCBlcnJvcnMgd2hlbiBkZWFsaW5nIHdpdGggbGl2ZSBub2RlIElEcy4gSXQgc2VlbXMgbGlrZSB0aGUgY29yZSBpc3N1ZSBpcyBob3cgd2UncmUgaGFuZGxpbmcgc3RhbGUgaW5vZGVzLCBhaW1pbmcgdG8gcHJvdmlkZSBtb3JlIHJvYnVzdCBlcnJvciBzaWduYWxpbmcuXG5cbk15IGtleSBjb25jZXJuIGlzIGhvdyB0aGlzIGVycm9yIGhhbmRsaW5nIHBlcmNvbGF0ZXMgdXAgdGhyb3VnaCB0aGUgVkZTLiBUaGlzIHBhdGNoIGlzIG1vZGlmeWluZyBzZXZlcmFsIGtleSBhcmVhczogYGZzL2Z1c2UvZGlyLmNgLCBgZnMvZnVzZS9maWxlLmNgLCBgZnMvZnVzZS9mdXNlX2kuaGAsIGBmcy9mdXNlL2lub2RlLmNgLCBhbmQgYGZzL2Z1c2UvdmlydGlvX2ZzLmNgLiBJdCBsb29rcyBsaWtlIEVOT0VOVCBpcyBiZWluZyBjb252ZXJ0ZWQgdG8gRVNUQUxFIG9yIEVPUEVOU1RBTEUgaW4gc2V2ZXJhbCBjb250ZXh0czogYGZ1c2VfZG9fZ2V0YXR0cmAsIGBmdXNlX3JlYWRsaW5rX2ZvbGlvYCwgYGZ1c2VfZGlyX29wZW5gLCBgZnVzZV9kb19zZXRhdHRyYCwgYGZ1c2Vfb3BlbmAsIGFuZCBgZnVzZV9zdGF0ZnNgLCB3aXRoIHNwZWNpZmljIGhhbmRsaW5nIGluIGB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZWAuIFRoZSBhZGRpdGlvbiBvZiBuZXcgdGVzdHMgaXMgcHJvbWlzaW5nLCBidXQgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvdmVyYWdlIGFuZCBmb2N1cy5cblxuVGhlIHNpZ25pZmljYW50IGNoYW5nZXMgYXJlOlxuKiAgIEluIGBmcy9mdXNlL2Rpci5jYCwgYGZ1c2VfZG9fZ2V0YXR0cmAsIGBmdXNlX3JlYWRsaW5rX2ZvbGlvYCwgYGZ1c2VfZGlyX29wZW5gLCBhbmQgYGZ1c2VfZG9fc2V0YXR0cmAuXG4qICAgSW4gYGZzL2Z1c2UvZmlsZS5jYCwgYGZ1c2Vfb3BlbmAuXG4qICAgQSBuZXcgaGVscGVyIGBmdXNlX3N0YWxlX2lub2RlX2VycigpYCBpbiBgZnMvZnVzZS9mdXNlX2kuaGAuXG4qICAgSW4gYGZzL2Z1c2UvaW5vZGUuY2AsIGBmdXNlX3N0YXRmc2AuXG4qICAgSW4gYGZzL2Z1c2UvdmlydGlvX2ZzLmNgLCBgdmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGVgLlxuXG5Ob3csIGRvZXMgdGhpcyBtZXJpdCBmdXp6aW5nPyBBYnNvbHV0ZWx5LCB5ZXMhIFRoZSBGVVNFIGVycm9yIGhhbmRsaW5nIGFuZCByZXR1cm4gY29kZXMgKEVTVEFMRSwgRU9QRU5TVEFMRSwgYW5kIHRoZSBFTk9FTlQgcmV0cnkgbG9naWMpIGRpcmVjdGx5IGltcGFjdCBWRlMgcGF0aCByZXNvbHV0aW9uIGFuZCBmaWxlIG9wZXJhdGlvbnMgYWNyb3NzIHRoZSBib2FyZC4gT3BlcmF0aW9ucyBsaWtlIG9wZW4sIGdldGF0dHIsIHNldGF0dHIsIHN0YXRmcywgYW5kIHJlYWRsaW5rIHdpbGwgYmUgZGlyZWN0bHkgYWZmZWN0ZWQgYnkgdGhlc2UgY2hhbmdlcyB3aGVuIGludGVyYWN0aW5nIHdpdGggdXNlcnNwYWNlIEZVU0Ugc2VydmVycyBvciB2aXJ0aW8tZnMuIFRoaXMgaXMgYWNjZXNzaWJsZSBmcm9tIHByZXR0eSBzdGFuZGFyZCB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMsIHN1Y2ggYXMgUUVNVSBvciBHQ0UuXG5cbkkgbmVlZCB0byBjb25maXJtIHRoZSBzY29wZSBvZiB0aGlzLiBJJ20gZm9jdXNpbmcgb24gdGhvc2UgbW9kaWZpY2F0aW9uczogYGZ1c2VfZG9fc2V0YXR0cmAsIGBmdXNlX2RvX2dldGF0dHJgLCBgZnVzZV9kaXJfb3BlbmAsIGBmdXNlX29wZW5gLCBgZnVzZV9yZWFkbGlua19mb2xpb2AsIGBmdXNlX3N0YXRmc2AsIGFuZCBgdmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGVgLiBUaGUgbm9uLXN0YXRpYyBuYXR1cmUgb2YgYGZ1c2VfZG9fc2V0YXR0cmAgaXMgd29ydGggYSBkZWVwZXIgZGl2ZS4gSSB3YW50IHRvIGNoZWNrIGl0cyBkZWNsYXJhdGlvbnMsIGNhbGxlcnMsIGFuZCBvdmVyYWxsIHVzYWdlIGFjcm9zcyBGVVNFIGZpbGVzLiBMZXQncyBhbmFseXplIHRoZSBjYWxsZXJzIG9mIHRoZSBgc3RhdGljYCBmdW5jdGlvbnMgYXMgd2VsbC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNhbGwgY2hhaW5zIGFuZCBob3cgdGhlc2UgZXJyb3IgY29kZXMgYXJlIHByb3BhZ2F0ZWQuIEdpdmVuIHRoYXQgdGhlc2UgZnVuY3Rpb25zIGFyZSBkZWVwbHkgaW52b2x2ZWQgd2l0aCBmaWxlIG9wZXJhdGlvbnMsIHRoZXkgcmVwcmVzZW50IGZlcnRpbGUgZ3JvdW5kIGZvciBmdXp6aW5nIHRvIHVuY292ZXIgcG90ZW50aWFsIGlzc3VlcywgZXNwZWNpYWxseSByYWNlIGNvbmRpdGlvbnMgb3IgaW5jb3JyZWN0IGVycm9yIHByb3BhZ2F0aW9uLlxuXG5TbywgbGV0J3MgbWFwIG91dCB0aGUgZnVuY3Rpb25zLiBJJ2xsIG5lZWQgdG8gY2hlY2sgdGhlIGV4YWN0IGRlY2xhcmF0aW9ucywgd2hlcmUgdGhleSdyZSBkZWZpbmVkLCBhbmQgdGhlIGNhbGxlcnMgb2YgZWFjaC4gQSB0aG9yb3VnaCBhbmFseXNpcyBoZXJlIHdpbGwgcmV2ZWFsIHBvdGVudGlhbCBlbnRyeSBwb2ludHMgZm9yIGZ1enppbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNDY0LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzA3LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMDA6MDY6MjcuMjI3ODY5MzQyWiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNTc2MDU2MzQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZnVzZV9kb19zZXRhdHRyXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2Z1c2VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZnVzZS9kaXIuYz0yMTE5PWludCBmdXNlX2ZsdXNoX3RpbWVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmdXNlX2ZpbGUgKmZmKVxcbi0tXFxuZnMvZnVzZS9kaXIuYy0yMTUzLSAqL1xcbmZzL2Z1c2UvZGlyLmM6MjE1NDppbnQgZnVzZV9kb19zZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksXFxuZnMvZnVzZS9kaXIuYy0yMTU1LVxcdFxcdCAgICBzdHJ1Y3QgaWF0dHIgKmF0dHIsIHN0cnVjdCBmaWxlICpmaWxlKVxcbi0tXFxuZnMvZnVzZS9kaXIuYz0yMzM2PXN0YXRpYyBpbnQgZnVzZV9zZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSxcXG4tLVxcbmZzL2Z1c2UvZGlyLmMtMjM4Mi1cXG5mcy9mdXNlL2Rpci5jOjIzODM6XFx0cmV0ID0gZnVzZV9kb19zZXRhdHRyKGlkbWFwLCBlbnRyeSwgYXR0ciwgZmlsZSk7XFxuZnMvZnVzZS9kaXIuYy0yMzg0LVxcdGlmICghcmV0KSB7XFxuLS1cXG5mcy9mdXNlL2ZpbGUuYz0yNzEyPXN0YXRpYyB2b2lkIGZ1c2VfZG9fdHJ1bmNhdGUoc3RydWN0IGZpbGUgKmZpbGUpXFxuLS1cXG5mcy9mdXNlL2ZpbGUuYy0yNzIyLVxcbmZzL2Z1c2UvZmlsZS5jOjI3MjM6XFx0ZnVzZV9kb19zZXRhdHRyKGZpbGVfbW50X2lkbWFwKGZpbGUpLCBmaWxlX2RlbnRyeShmaWxlKSwgXFx1MDAyNmF0dHIsIGZpbGUpO1xcbmZzL2Z1c2UvZmlsZS5jLTI3MjQtfVxcbi0tXFxuZnMvZnVzZS9mdXNlX2kuaD0xMTkwPWludCBmdXNlX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKTtcXG5mcy9mdXNlL2Z1c2VfaS5oLTExOTEtXFxuZnMvZnVzZS9mdXNlX2kuaDoxMTkyOmludCBmdXNlX2RvX3NldGF0dHIoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSxcXG5mcy9mdXNlL2Z1c2VfaS5oLTExOTMtXFx0XFx0ICAgIHN0cnVjdCBpYXR0ciAqYXR0ciwgc3RydWN0IGZpbGUgKmZpbGUpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQwMDowNjoyNy41ODU0ODI5NDZaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6ODM2NjQ4ODI5NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgZnVuY3Rpb25zLlxuXG4qKkluaXRpYWwgQ29uc2lkZXJhdGlvbnMgZm9yIEZVU0UgS2VybmVsIE1vZHVsZSBSZXZpZXcqKlxuXG5BbHJpZ2h0LCBiZWZvcmUgSSBkaXZlIGluIHRvbyBkZWVwLCBsZXQncyBlc3RhYmxpc2ggb3VyIGltbWVkaWF0ZSBwcmlvcml0aWVzLiBNeSBtaW5kIGlzIGFscmVhZHkgcnVubmluZyB0aHJvdWdoIGEgcXVpY2sgY2hlY2tsaXN0IG9mIGNyaXRpY2FsIEZVU0UgZnVuY3Rpb25zIHRoYXQgZGVtYW5kIG15IGF0dGVudGlvbi4gU3BlY2lmaWNhbGx5LCBJJ20gdGhpbmtpbmcgYWJvdXQgYGZ1c2Vfb3BlbmAsIGBmdXNlX2Rpcl9vcGVuYCwgYGZ1c2Vfc3RhdGZzYCwgYGZ1c2VfZ2V0YXR0cmAsIGFuZCBgZnVzZV9zZXRhdHRyYC4gVGhlc2UgYXJlIHRoZSBjb3JlIGJ1aWxkaW5nIGJsb2NrcyBmb3IgZmlsZSBhY2Nlc3MsIGRpcmVjdG9yeSB0cmF2ZXJzYWwsIGZpbGVzeXN0ZW0gc3RhdGlzdGljcywgYXR0cmlidXRlIHJldHJpZXZhbCwgYW5kIGF0dHJpYnV0ZSBtb2RpZmljYXRpb24sIHJlc3BlY3RpdmVseS4gVGhlbiB0aGVyZSdzIHRoZSBmb2xpby1zcGVjaWZpYyBoYW5kbGluZywgd2hpY2ggYWxzbyBuZWVkcyBhIGxvb2sgYXQgYGZ1c2VfcmVhZGxpbmtfZm9saW9gLCBhbmQgYGZ1c2Vfc3ltbGlua19yZWFkX2ZvbGlvYCwgYW5kIGZpbmFsbHkgbGV0J3MgdGhyb3cgaW4gYHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlYCwgdG8gZW5zdXJlIGEgY29tcGxldGUgcGljdHVyZS4gV2l0aCB0aG9zZSBpbiBtaW5kLCBJIG5lZWQgdG8ga25vdyB0aGUgZXhhY3QgZGVmaW5pdGlvbnMgb2YgdGhlc2UgaW4gdGhlIEZVU0Uga2VybmVsIG1vZHVsZS4gTG9va3MgbGlrZSB0aGUgbG9naWNhbCBmaXJzdCBzdGVwIGlzIHRvIGltbWVkaWF0ZWx5IHB1bGwgdXAgYGZzL2Z1c2UvYCBhbmQgYmVnaW4gdGhlIGNvZGUgcmV2aWV3LiBUaGF0J2xsIGJlIGEgZ29vZCBzdGFydGluZyBwb2ludC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTUzNzMsIk91dHB1dFRva2VucyI6NTQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQwMDowNjozNS45NTE5NzUwMDNaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUxMjI5NzI2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl4oc3RhdGljICk/KGludHx2b2lkKSBmdXNlXyhvcGVufGRpcl9vcGVufHN0YXRmc3xnZXRhdHRyfHNldGF0dHJ8c3ltbGlua19yZWFkX2ZvbGlvKVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9mdXNlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2Z1c2UvZGlyLmM9MTg2Nj1zdGF0aWMgY29uc3QgY2hhciAqZnVzZV9nZXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9mdXNlL2Rpci5jLTE5MDItXFxuZnMvZnVzZS9kaXIuYzoxOTAzOnN0YXRpYyBpbnQgZnVzZV9kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcXG5mcy9mdXNlL2Rpci5jLTE5MDQte1xcbi0tXFxuZnMvZnVzZS9kaXIuYz0yMDkyPXZvaWQgZnVzZV9yZWxlYXNlX25vd3JpdGUoc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2Z1c2UvZGlyLmMtMjEwMC1cXG5mcy9mdXNlL2Rpci5jOjIxMDE6c3RhdGljIHZvaWQgZnVzZV9zZXRhdHRyX2ZpbGwoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX2FyZ3MgKmFyZ3MsXFxuZnMvZnVzZS9kaXIuYy0yMTAyLVxcdFxcdFxcdCAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9mdXNlL2Rpci5jPTIxNTQ9aW50IGZ1c2VfZG9fc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxcbi0tXFxuZnMvZnVzZS9kaXIuYy0yMzM1LVxcbmZzL2Z1c2UvZGlyLmM6MjMzNjpzdGF0aWMgaW50IGZ1c2Vfc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZW50cnksXFxuZnMvZnVzZS9kaXIuYy0yMzM3LVxcdFxcdFxcdHN0cnVjdCBpYXR0ciAqYXR0cilcXG4tLVxcbmZzL2Z1c2UvZGlyLmMtMjM5OC1cXG5mcy9mdXNlL2Rpci5jOjIzOTk6c3RhdGljIGludCBmdXNlX2dldGF0dHIoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsXFxuZnMvZnVzZS9kaXIuYy0yNDAwLVxcdFxcdFxcdGNvbnN0IHN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3Qga3N0YXQgKnN0YXQsXFxuLS1cXG5mcy9mdXNlL2Rpci5jPTI0ODM9dm9pZCBmdXNlX2luaXRfZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9mdXNlL2Rpci5jLTI0OTYtXFxuZnMvZnVzZS9kaXIuYzoyNDk3OnN0YXRpYyBpbnQgZnVzZV9zeW1saW5rX3JlYWRfZm9saW8oc3RydWN0IGZpbGUgKm51bGwsIHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuZnMvZnVzZS9kaXIuYy0yNDk4LXtcXG4tLVxcbmZzL2Z1c2UvZmlsZS5jPTIzNz1zdGF0aWMgdm9pZCBmdXNlX3RydW5jYXRlX3VwZGF0ZV9hdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbi0tXFxuZnMvZnVzZS9maWxlLmMtMjQ5LVxcbmZzL2Z1c2UvZmlsZS5jOjI1MDpzdGF0aWMgaW50IGZ1c2Vfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcXG5mcy9mdXNlL2ZpbGUuYy0yNTEte1xcbi0tXFxuZnMvZnVzZS9pbm9kZS5jPTYzMj1zdGF0aWMgdm9pZCBjb252ZXJ0X2Z1c2Vfc3RhdGZzKHN0cnVjdCBrc3RhdGZzICpzdGJ1Ziwgc3RydWN0IGZ1c2Vfa3N0YXRmcyAqYXR0cilcXG4tLVxcbmZzL2Z1c2UvaW5vZGUuYy02NDUtXFxuZnMvZnVzZS9pbm9kZS5jOjY0NjpzdGF0aWMgaW50IGZ1c2Vfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZilcXG5mcy9mdXNlL2lub2RlLmMtNjQ3LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMDA6MDY6MzYuMDAzMjExOTE5WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjY5NjQzNjk2MTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDpcblxuKipEaWdnaW5nIGludG8gdmlydGlvX2ZzLmMgZm9yIENvbXBsZXRpb24gSGFuZGxpbmcqKlxuXG5Pa2F5LCBzbyB3ZSdyZSBsb29raW5nIGF0IGNvbXBsZXRpb24gaGFuZGxpbmcgd2l0aGluIHZpcnRpby1mcy4gTXkgaW5pdGlhbCBmb2N1cyBpcyBkZWZpbml0ZWx5IGdvaW5nIHRvIGJlIG9uIGB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZWAuIFRoYXQncyB3aGVyZSB0aGUgcnViYmVyIG1lZXRzIHRoZSByb2FkLCB3aGVyZSB0aGUga2VybmVsIHNpZ25hbHMgYSByZXF1ZXN0IGlzIGZpbmlzaGVkLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0aGUgZGF0YSBnZXRzIGNsZWFuZWQgdXAsIGhvdyBlcnJvcnMgYXJlIHJlcG9ydGVkIGJhY2sgKGlmIGFueSksIGFuZCBob3cgdGhlIHdob2xlIHRoaW5nIHRyYW5zaXRpb25zIHRvIHRoZSBuZXh0IHBoYXNlIGluIHRoZSByZXF1ZXN0IGxpZmVjeWNsZS4gSSdsbCBsaWtlbHkgYmUgY2hlY2tpbmcgdGhlIHN1cnJvdW5kaW5nIGNvZGUgZm9yIGhvdyB0aGF0IGZ1bmN0aW9uIGlzIGNhbGxlZCBhbmQgd2hlcmUgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBjb21wbGV0ZSB0aGUgcmVxdWVzdCBjb21lcyBmcm9tIGluIHRoZSBmaXJzdCBwbGFjZS4gSeKAmW0gdGhpbmtpbmcgdGhlcmUgbWlnaHQgYmUgc2V2ZXJhbCBjcml0aWNhbCBwb2ludHMgdGhlcmUuIEFuZCBJJ2xsIGJlIGtlZXBpbmcgYW4gZXllIG91dCBmb3IgYW55IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMgb3IgZWRnZSBjYXNlcy4gVGltZSB0byBkaWcgaW4hXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2NDIzLCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMDA6MDY6NDIuOTY3NTg0MDU5WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NjA4MDQ2NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9mdXNlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2Z1c2UvdmlydGlvX2ZzLmM9ODEzPXN0YXRpYyB2b2lkIHZpcnRpb19mc19maXh1cF9zdGFsZV9lcnJvcihzdHJ1Y3QgZnVzZV9yZXEgKnJlcSlcXG4tLVxcbmZzL2Z1c2UvdmlydGlvX2ZzLmMtODQzLS8qIFdvcmsgZnVuY3Rpb24gZm9yIHJlcXVlc3QgY29tcGxldGlvbiAqL1xcbmZzL2Z1c2UvdmlydGlvX2ZzLmM6ODQ0OnN0YXRpYyB2b2lkIHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlKHN0cnVjdCBmdXNlX3JlcSAqcmVxLFxcbmZzL2Z1c2UvdmlydGlvX2ZzLmMtODQ1LVxcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgdmlydGlvX2ZzX3ZxICpmc3ZxKVxcbi0tXFxuZnMvZnVzZS92aXJ0aW9fZnMuYz04ODE9c3RhdGljIHZvaWQgdmlydGlvX2ZzX2NvbXBsZXRlX3JlcV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4tLVxcbmZzL2Z1c2UvdmlydGlvX2ZzLmMtODg1LVxcbmZzL2Z1c2UvdmlydGlvX2ZzLmM6ODg2OlxcdHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlKHctXFx1MDAzZXJlcSwgdy1cXHUwMDNlZnN2cSk7XFxuZnMvZnVzZS92aXJ0aW9fZnMuYy04ODctXFx0a2ZyZWUodyk7XFxuLS1cXG5mcy9mdXNlL3ZpcnRpb19mcy5jPTg5MD1zdGF0aWMgdm9pZCB2aXJ0aW9fZnNfcmVxdWVzdHNfZG9uZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4tLVxcbmZzL2Z1c2UvdmlydGlvX2ZzLmMtOTMxLVxcdFxcdH0gZWxzZSB7XFxuZnMvZnVzZS92aXJ0aW9fZnMuYzo5MzI6XFx0XFx0XFx0dmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGUocmVxLCBmc3ZxKTtcXG5mcy9mdXNlL3ZpcnRpb19mcy5jLTkzMy1cXHRcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDAwOjA2OjQzLjAxMzY2NzYyNloiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNDEwNTc5NDg2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgRlVTRS9WaXJ0aW9GUyBTeW1ib2wgVmlzaWJpbGl0eSoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgcHJpbWFyeSBjb25jZXJuIGlzIHRoZSB2aXNpYmlsaXR5IG9mIGNlcnRhaW4gRlVTRSBhbmQgVmlydGlvRlMgZnVuY3Rpb25zLCBzcGVjaWZpY2FsbHkgdG8gZGV0ZXJtaW5lIHdoaWNoIG9uZXMgYXJlIGV4cG9zZWQgYXMgcHJvcGVyIHN5bWJvbHMuIFRoZSBnb2FsIGlzIHRvIGlkZW50aWZ5IEFQSSBlbnRyeSBwb2ludHMsIGZhdm9yaW5nIHRob3NlIHRoYXQgYXJlIG5vbi1zdGF0aWMgYW5kIG5vdCBpbmxpbmVkIGJlY2F1c2UgdGhlc2UgYXJlIG1vcmUgbGlrZWx5IHRvIGJlIGFjY2Vzc2libGUgaW4gYSBwcmVkaWN0YWJsZSB3YXkuXG5cbkZpcnN0LCBJIGNvbmZpcm1lZCB0aGF0IGBmdXNlX2RvX3NldGF0dHJgIGlzIGluZGVlZCBub24tc3RhdGljLCBhIGdvb2Qgc3RhcnQuIFRoZW4sIEkgcXVpY2tseSBzY2FubmVkIG90aGVyIGZ1bmN0aW9ucyB3aXRoaW4gYGZzL2Z1c2UvZGlyLmNgLCBhbmQgYGZzL2Z1c2UvZmlsZS5jYCB0byBpZGVudGlmeSBvdGhlciBmdW5jdGlvbnMgb2YgaW50ZXJlc3Q6IGBmdXNlX29wZW5gLCBgZnVzZV9kaXJfb3BlbmAsIGBmdXNlX2RvX2dldGF0dHJgLCBgZnVzZV9zdGF0ZnNgLCBgZnVzZV9yZWFkbGlua19mb2xpb2AsIGFuZCBgdmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGVgLlxuXG5Mb29raW5nIGF0IHRoZSBkaWZmLCBpdCBzZWVtcyBzZXZlcmFsIG9mIHRoZXNlIGhhdmUgYmVlbiBtb2RpZmllZDogYGZ1c2VfZG9fZ2V0YXR0cmAsIGBmdXNlX3JlYWRsaW5rX2ZvbGlvYCwgYGZ1c2VfZGlyX29wZW5gLCBgZnVzZV9kb19zZXRhdHRyYCAoaW4gYGZzL2Z1c2UvZGlyLmNgKSBhbmQgYGZ1c2Vfb3BlbmAgKGluIGBmcy9mdXNlL2ZpbGUuY2ApLiBBZGRpdGlvbmFsbHksIGBmdXNlX3N0YXRmc2AgaXMgY2hhbmdlZCBpbiBgZnMvZnVzZS9pbm9kZS5jYCwgYW5kIHRoZXJlIGFyZSBjaGFuZ2VzIGluIGBmcy9mdXNlL3ZpcnRpb19mcy5jYCByZWxhdGVkIHRvIGB2aXJ0aW9fZnNfZml4dXBfc3RhbGVfZXJyb3JgIGFuZCBgdmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGVgLiBUaGUgYGZ1c2Vfc3RhbGVfaW5vZGVfZXJyYCBmdW5jdGlvbiBpcyBhbHNvIG5vdyBhbiBpbmxpbmUgZnVuY3Rpb24gZGVmaW5lZCBpbiBgZnMvZnVzZS9mdXNlX2kuaGAuXG5cbkkgdGhlbiBtYWRlIGEgbm90ZSBvZiB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbiBvcHRpb25zOiBgRlVTRV9GU2AgYW5kIGBWSVJUSU9fRlNgLiBBIHF1aWNrIGNyb3NzLXJlZmVyZW5jZSBvZiB0aGUgS2NvbmZpZyBzaG93ZWQgdGhhdCBgVklSVElPX0ZTYCBkZXBlbmRzIG9uIGBGVVNFX0ZTYCBhbmQgYEZVU0VfRlNgIHNlbGVjdHMgYEZTX1BPU0lYX0FDTGAgYW5kIGBGU19JT01BUGAuXG5cbk5vdywgdGhlIGZvY3VzIGlzIG9uIGEgc3Vic2V0IG9mIHN5bWJvbHM6IGBmdXNlX2RvX3NldGF0dHJgLCBgZnVzZV9kb19nZXRhdHRyYCwgYGZ1c2VfZGlyX29wZW5gLCBgZnVzZV9vcGVuYCwgYGZ1c2VfcmVhZGxpbmtfZm9saW9gLCBgZnVzZV9zdGF0ZnNgLCBhbmQgYHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlYC4gSSBuZWVkIHRvIGRldGVybWluZSBpZiB0aGVzZSBhcmUgY29tcGlsZWQgYXMgZGlzdGluY3Qgc3ltYm9scy5cblxuYGZ1c2VfZG9fc2V0YXR0cmAgaGFzIGFscmVhZHkgYmVlbiBlc3RhYmxpc2hlZCBhcyBub24tc3RhdGljLiBIb3dldmVyLCBhZnRlciBjYXJlZnVsIHJldmlldywgaXQgbG9va3MgbGlrZSBgZnVzZV9vcGVuYCwgYGZ1c2VfZGlyX29wZW5gLCBhbmQgYGZ1c2Vfc3RhdGZzYCBhcmUgc3RhdGljIGZpbGVfb3BlcmF0aW9ucy9zdXBlcl9vcGVyYXRpb25zIGNhbGxiYWNrcy4gVGhpcyBpcyBnb29kIGJlY2F1c2UgZXZlbiB0aG91Z2ggdGhleSBhcmUgc3RhdGljLCBiZWNhdXNlIHRoZWlyIGFkZHJlc3MgaXMgdGFrZW4gYW5kIGFzc2lnbmVkIGludG8gYSBzdHJ1Y3QgZnVuY3Rpb24gcG9pbnRlciwgdGhleSBhcmUgbm90IGlubGluZWQuIGBmdXNlX2RvX2dldGF0dHJgIGFuZCBgZnVzZV9yZWFkbGlua19mb2xpb2AgYXJlIGJvdGggc3RhdGljIGhlbHBlcnMuIEFuZCBgdmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGVgIGlzIHN0YXRpYyBhcyB3ZWxsLlxuXG5UaGVyZWZvcmUsIGBmdXNlX2RvX3NldGF0dHJgLCBgZnVzZV9vcGVuYCwgYGZ1c2VfZGlyX29wZW5gLCBhbmQgYGZ1c2Vfc3RhdGZzYCBhcmUgdGhlIHNpZ25pZmljYW50IHN5bWJvbHMgdG8gZm9jdXMgb24uIFRoZXkgYXJlICpsaWtlbHkqIHRoZSBwcmltYXJ5IGV4cG9zZWQgQVBJIGVudHJ5IHBvaW50cyBpbiB0aGUgbW9kdWxlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzAzMSwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEwMDksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMDA6MDc6MDcuMTE5NDY0NTU5WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0ODAzMjAwNiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJmdXNlX29wZW5cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvZnVzZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9mdXNlL2Rldi5jPTc3Mz1zdGF0aWMgdm9pZCBmdXNlX2FkanVzdF9jb21wYXQoc3RydWN0IGZ1c2VfY2hhbiAqZmNoLCBzdHJ1Y3QgZnVzZV9hcmdzICphcmdzKVxcbi0tXFxuZnMvZnVzZS9kZXYuYy03OTYtXFx0XFx0Y2FzZSBGVVNFX0NSRUFURTpcXG5mcy9mdXNlL2Rldi5jOjc5NzpcXHRcXHRcXHRhcmdzLVxcdTAwM2Vpbl9hcmdzWzBdLnNpemUgPSBzaXplb2Yoc3RydWN0IGZ1c2Vfb3Blbl9pbik7XFxuZnMvZnVzZS9kZXYuYy03OTgtXFx0XFx0XFx0YnJlYWs7XFxuLS1cXG5mcy9mdXNlL2Rpci5jPTgyMz1zdGF0aWMgaW50IGZ1c2VfY3JlYXRlX29wZW4oc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBpbm9kZSAqZGlyLFxcbi0tXFxuZnMvZnVzZS9kaXIuYy04MzEtXFx0c3RydWN0IGZ1c2VfY3JlYXRlX2luIGluYXJnO1xcbmZzL2Z1c2UvZGlyLmM6ODMyOlxcdHN0cnVjdCBmdXNlX29wZW5fb3V0ICpvdXRvcGVucDtcXG5mcy9mdXNlL2Rpci5jLTgzMy1cXHRzdHJ1Y3QgZnVzZV9lbnRyeV9vdXQgb3V0ZW50cnk7XFxuLS1cXG5mcy9mdXNlL2Rpci5jPTE5MDM9c3RhdGljIGludCBmdXNlX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbi0tXFxuZnMvZnVzZS9kaXIuYy0xOTE2LVxcdC8qXFxuZnMvZnVzZS9kaXIuYzoxOTE3OlxcdCAqIEFzIGluIGZ1c2Vfb3Blbl9jb21tb24oKTogYSBwYXRoIHdhbGsgc3RhbmRzIGJlaGluZCB0aGlzIG9wZW4sXFxuZnMvZnVzZS9kaXIuYy0xOTE4LVxcdCAqIHNvIHRoZSByZWZ1c2FsIGlzIEVPUEVOU1RBTEUgZm9yIHBhdGhfb3BlbmF0KCkgdG8gYW5zd2VyLlxcbi0tXFxuZnMvZnVzZS9maWxlLmM9MjU9c3RhdGljIGludCBmdXNlX3NlbmRfb3BlbihzdHJ1Y3QgZnVzZV9tb3VudCAqZm0sIHU2NCBub2RlaWQsXFxuZnMvZnVzZS9maWxlLmMtMjYtXFx0XFx0XFx0ICB1bnNpZ25lZCBpbnQgb3Blbl9mbGFncywgaW50IG9wY29kZSxcXG5mcy9mdXNlL2ZpbGUuYzoyNzpcXHRcXHRcXHQgIHN0cnVjdCBmdXNlX29wZW5fb3V0ICpvdXRhcmdwKVxcbmZzL2Z1c2UvZmlsZS5jLTI4LXtcXG5mcy9mdXNlL2ZpbGUuYzoyOTpcXHRzdHJ1Y3QgZnVzZV9vcGVuX2luIGluYXJnO1xcbmZzL2Z1c2UvZmlsZS5jLTMwLVxcdEZVU0VfQVJHUyhhcmdzKTtcXG4tLVxcbmZzL2Z1c2UvZmlsZS5jPTEzMz1zdHJ1Y3QgZnVzZV9maWxlICpmdXNlX2ZpbGVfb3BlbihzdHJ1Y3QgZnVzZV9tb3VudCAqZm0sIHU2NCBub2RlaWQsXFxuLS1cXG5mcy9mdXNlL2ZpbGUuYy0xNTgtXFx0XFx0LyogU3RvcmUgb3V0YXJnIGZvciBmdXNlX2ZpbmlzaF9vcGVuKCkgKi9cXG5mcy9mdXNlL2ZpbGUuYzoxNTk6XFx0XFx0c3RydWN0IGZ1c2Vfb3Blbl9vdXQgKm91dGFyZ3AgPSBcXHUwMDI2ZmYtXFx1MDAzZWFyZ3MtXFx1MDAzZW9wZW5fb3V0YXJnO1xcbmZzL2Z1c2UvZmlsZS5jLTE2MC1cXHRcXHRpbnQgZXJyO1xcbi0tXFxuZnMvZnVzZS9maWxlLmM9MjM3PXN0YXRpYyB2b2lkIGZ1c2VfdHJ1bmNhdGVfdXBkYXRlX2F0dHIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXFxuLS1cXG5mcy9mdXNlL2ZpbGUuYy0yNDktXFxuZnMvZnVzZS9maWxlLmM6MjUwOnN0YXRpYyBpbnQgZnVzZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbmZzL2Z1c2UvZmlsZS5jLTI1MS17XFxuLS1cXG5mcy9mdXNlL2ZpbGUuYz0zMDg4PXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZmlsZV9vcGVyYXRpb25zID0ge1xcbi0tXFxuZnMvZnVzZS9maWxlLmMtMzA5Mi1cXHQubW1hcFxcdFxcdD0gZnVzZV9maWxlX21tYXAsXFxuZnMvZnVzZS9maWxlLmM6MzA5MzpcXHQub3BlblxcdFxcdD0gZnVzZV9vcGVuLFxcbmZzL2Z1c2UvZmlsZS5jLTMwOTQtXFx0LmZsdXNoXFx0XFx0PSBmdXNlX2ZsdXNoLFxcbi0tXFxuZnMvZnVzZS9mdXNlX2kuaD0zMzM9dW5pb24gZnVzZV9maWxlX2FyZ3Mge1xcbmZzL2Z1c2UvZnVzZV9pLmgtMzM0LVxcdC8qIFVzZWQgZHVyaW5nIG9wZW4oKSAqL1xcbmZzL2Z1c2UvZnVzZV9pLmg6MzM1OlxcdHN0cnVjdCBmdXNlX29wZW5fb3V0IG9wZW5fb3V0YXJnO1xcbmZzL2Z1c2UvZnVzZV9pLmgtMzM2LVxcdC8qIFVzZWQgZHVyaW5nIHJlbGVhc2UoKSAqL1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQwMDowNzowNy4xNjc1MDMyMzZaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6OTg2NDY1OTk0OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqRGl2aW5nIGludG8gYGZ1c2VfZGlyX29wZW5gKipcblxuT2theSwgdGltZSB0byBkaXNzZWN0IHRoZSB1c2FnZSBvZiBgZnVzZV9kaXJfb3BlbmAgd2l0aGluIGBmcy9mdXNlL2Rpci5jYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUgYW5kIGhvdyBpdCdzIGJlaW5nIGxldmVyYWdlZCBpbiB0aGUgRlVTRSBmaWxlc3lzdGVtIGxheWVyLiBJJ20gYXNzdW1pbmcgdGhlcmUncyBzb21lIGlzc3VlIHRoYXQgd2FycmFudHMgaW52ZXN0aWdhdGlvbiwgb3IgcGVyaGFwcyBJJ20gbG9va2luZyB0byBvcHRpbWl6ZSBkaXJlY3Rvcnkgb3BlcmF0aW9ucy4gUmVnYXJkbGVzcywgdGhlIGZpcnN0IHN0ZXAgaXMgYWx3YXlzIHRvIGdvIHN0cmFpZ2h0IHRvIHRoZSBzb3VyY2UgYW5kIHNlZSAqaG93KiB0aGlzIGNydWNpYWwgZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVkIGFuZCB3aGF0IGNvbnRleHQgaXMgc2hhcGluZyBpdHMgZXhlY3V0aW9uLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGUgZnVzZSBkYWVtb24gaW50ZXJhY3RzIHdpdGggdGhlIGtlcm5lbCBzcGFjZS4gS25vd2luZyB3aGVyZSBpdCBpcyBiZWluZyBjYWxsZWQgZnJvbSB3aWxsIGhlbHAgaW5mb3JtIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIGludGVyYWN0aW9ucyBiZXR3ZWVuIHVzZXJzcGFjZSBhbmQgdGhlIGtlcm5lbCwgYW5kIHRoZSByZXNvdXJjZXMgdGhhdCBpdCBtYXkgYmUgY29uc3VtaW5nLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIHBvdGVudGlhbCBib3R0bGVuZWNrcywgcmFjZSBjb25kaXRpb25zLCBvciBtYXliZSBldmVuIG9wcG9ydHVuaXRpZXMgdG8gcmVkdWNlIHVubmVjZXNzYXJ5IHN5c3RlbSBjYWxscyBvciBpbXByb3ZlIGNhY2hpbmcgc3RyYXRlZ2llcyByZWxhdGVkIHRvIGRpcmVjdG9yeSBoYW5kbGluZyB3aXRoaW4gdGhlIEZVU0UgZnJhbWV3b3JrLiBMZXQncyBzZWUgd2hhdCdzIHdoYXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5NjM5LCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMDA6MDc6MTcuMDMyMTY1NTU1WiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NDIyMjkyNiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJmdXNlX2Rpcl9vcGVuXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2Z1c2VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZnVzZS9kaXIuYz0xODY2PXN0YXRpYyBjb25zdCBjaGFyICpmdXNlX2dldF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2Z1c2UvZGlyLmMtMTkwMi1cXG5mcy9mdXNlL2Rpci5jOjE5MDM6c3RhdGljIGludCBmdXNlX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbmZzL2Z1c2UvZGlyLmMtMTkwNC17XFxuLS1cXG5mcy9mdXNlL2Rpci5jPTI0NDg9c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnVzZV9kaXJfb3BlcmF0aW9ucyA9IHtcXG4tLVxcbmZzL2Z1c2UvZGlyLmMtMjQ1MS1cXHQuaXRlcmF0ZV9zaGFyZWRcXHQ9IGZ1c2VfcmVhZGRpcixcXG5mcy9mdXNlL2Rpci5jOjI0NTI6XFx0Lm9wZW5cXHRcXHQ9IGZ1c2VfZGlyX29wZW4sXFxuZnMvZnVzZS9kaXIuYy0yNDUzLVxcdC5yZWxlYXNlXFx0PSBmdXNlX2Rpcl9yZWxlYXNlLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQwMDowNzoxNy4wNzYzOTM3NTFaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NzQ2MDA1OTM3OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiB0aGUgRlVTRSBhbmQgVmlydGlvLWZzIENoYW5nZXMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEkgc2VlIHRoYXQgYGZ1c2Vfb3BlbmAgaXMgaG9va2VkIHVwIHRvIGBmdXNlX2ZpbGVfb3BlcmF0aW9ucy5vcGVuYCwgYW5kIGBmdXNlX2Rpcl9vcGVuYCB0byBgZnVzZV9kaXJfb3BlcmF0aW9ucy5vcGVuYC4gYGZ1c2Vfc3RhdGZzYCBpcyBoYW5kbGluZyB0aGUgYHN0YXRfZnNgIHN1cGVyIG9wZXJhdGlvbi4gYGZ1c2VfZG9fc2V0YXR0cmAgaXMgbm93IGV4cG9zZWQsIGFuZCBJIHNlZSBpdCdzIGRlY2xhcmVkIGluIGBmdXNlX2kuaGAsIGFjY2Vzc2libGUgZnJvbSBvdXRzaWRlLCBhbmQgYGZ1c2VfZG9fZ2V0YXR0cmAgaXMgY2FsbGVkIHdpdGhpbiBgZGlyLmNgLiBBbHNvLCBgdmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGVgLCBpcyBiZWluZyBjYWxsZWQgYnkgdGhlIHZpcnRpby1mcyBjb21wbGV0aW9uIHJvdXRpbmVzIGluIGB2aXJ0aW9fZnMuY2AuXG5cbkkndmUgZ290IGEgZ29vZCBoYW5kbGUgb24gd2hlcmUgdGhlc2UgY2hhbmdlcyB0b3VjaCB0aGUgY29kZWJhc2UuIFRoZSBtb2RpZmllZCBmaWxlcyBpbmNsdWRlIGBmcy9mdXNlL2Rpci5jYCwgYGZzL2Z1c2UvZmlsZS5jYCwgYGZzL2Z1c2UvZnVzZV9pLmhgLCBgZnMvZnVzZS9pbm9kZS5jYCwgYW5kIG9mIGNvdXJzZSBgZnMvZnVzZS92aXJ0aW9fZnMuY2AsIHBsdXMgdGhlIHNlbGZ0ZXN0cy5cblxuQXMgZm9yIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMsIGBGVVNFX0ZTYCBhbmQgYFZJUlRJT19GU2AgYXJlIHRoZSBvbmVzIHJlbGV2YW50IHRvIHRoaXMgY2hhbmdlLiBObyBvdGhlciBmaWxlcyBhcmUgbW9kaWZpZWQgaW4ga2VybmVsIHNwYWNlLlxuXG5Ob3csIEkndmUgZ290IGEgc29saWQgbGlzdCBvZiBrZXkgc3ltYm9scyBmb3IgZnVydGhlciBhbmFseXNpczogYGZ1c2VfZG9fc2V0YXR0cmAsIGBmdXNlX29wZW5gLCBgZnVzZV9kaXJfb3BlbmAsIGBmdXNlX2RvX2dldGF0dHJgLCBgZnVzZV9zdGF0ZnNgLCBgZnVzZV9yZWFkbGlua19mb2xpb2AsIGFuZCBgdmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGVgLlxuXG5BbmQgaGVyZSBhcmUgdGhlIHJlbGV2YW50IGNvbmZpZ3MgSSBuZWVkIHRvIGNvbnNpZGVyIGZvciB0ZXN0aW5nOiBgRlVTRV9GU2AsIGFuZCBgVklSVElPX0ZTYC5cblxuVGhpcyBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcuIFRoZSBwYXRjaCBpcyBhYm91dCBpbXByb3ZpbmcgZXJyb3IgaGFuZGxpbmcgaW4gRlVTRSBhbmQgdmlydGlvLWZzLCBzcGVjaWZpY2FsbHkgd2hlbiBsaXZlIG5vZGUgSUQgcmVxdWVzdHMgZmFpbCB3aXRoIC1FTk9FTlQuIEl0J3MgdHJhbnNsYXRpbmcgdGhvc2UgZXJyb3JzIHRvIC1FU1RBTEUgKGZvciBnZXRhdHRyLCBzZXRhdHRyLCByZWFkbGluaywgc3RhdGZzKSBvciAtRU9QRU5TVEFMRSAoZm9yIG9wZW4vb3BlbmRpcikgc28gdGhlIFZGUyBsYXllciBjYW4gcmV0cnkgdGhlIHBhdGggcmVzb2x1dGlvbiB3aXRoIExPT0tVUF9SRVZBTC4gVGhpcyB0b3VjaGVzIGNvcmUgRlVTRSBiZWhhdmlvciBhY3Jvc3Mgc2V2ZXJhbCBvcGVyYXRpb25zLCBib3RoIHN0YW5kYXJkIEZVU0UgbW91bnRzIGFuZCB2aXJ0aW8tZnMuIFRlc3RpbmcgdGhpcyB0aG9yb3VnaGx5IGlzIGltcG9ydGFudC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjAxMjUsIk91dHB1dFRva2VucyI6MTg2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTE2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDAwOjA3OjI0LjUzNjQ1NjY2WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODM0OTEwMTQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkZVU0VfRlNcIixcbiAgICBcIlZJUlRJT19GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImZ1c2VfZG9fc2V0YXR0clwiLFxuICAgIFwiZnVzZV9vcGVuXCIsXG4gICAgXCJmdXNlX2Rpcl9vcGVuXCIsXG4gICAgXCJmdXNlX2RvX2dldGF0dHJcIixcbiAgICBcImZ1c2Vfc3RhdGZzXCIsXG4gICAgXCJmdXNlX3JlYWRsaW5rX2ZvbGlvXCIsXG4gICAgXCJ2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHVwZGF0ZXMgZXJyb3IgaGFuZGxpbmcgZm9yIGxpdmUgbm9kZSBJRHMgaW4gRlVTRSBhbmQgdmlydGlvLWZzIHdoZW4gdGhlIHVzZXIvaG9zdCBzZXJ2ZXIgcmV0dXJucyAtRU5PRU5ULCB0cmFuc2xhdGluZyBpdCB0byAtRVNUQUxFIG9yIC1FT1BFTlNUQUxFIHRvIHRyaWdnZXIgVkZTIHBhdGggbG9va3VwIHJldHJpZXMgKExPT0tVUF9SRVZBTCkuIFRoZXNlIGZ1bmN0aW9uYWwgY2hhbmdlcyBpbXBhY3QgY29yZSBmaWxlIG9wZXJhdGlvbnMgKG9wZW4sIGdldGF0dHIsIHNldGF0dHIsIHJlYWRsaW5rLCBzdGF0ZnMpIGluIEZVU0UgYW5kIHZpcnRpby1mcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJGVVNFX0ZTXCIsXG4gICAgXCJWSVJUSU9fRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJmdXNlX2RvX3NldGF0dHJcIixcbiAgICBcImZ1c2Vfb3BlblwiLFxuICAgIFwiZnVzZV9kaXJfb3BlblwiLFxuICAgIFwiZnVzZV9kb19nZXRhdHRyXCIsXG4gICAgXCJmdXNlX3N0YXRmc1wiLFxuICAgIFwiZnVzZV9yZWFkbGlua19mb2xpb1wiLFxuICAgIFwidmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCB1cGRhdGVzIGVycm9yIGhhbmRsaW5nIGZvciBsaXZlIG5vZGUgSURzIGluIEZVU0UgYW5kIHZpcnRpby1mcyB3aGVuIHRoZSB1c2VyL2hvc3Qgc2VydmVyIHJldHVybnMgLUVOT0VOVCwgdHJhbnNsYXRpbmcgaXQgdG8gLUVTVEFMRSBvciAtRU9QRU5TVEFMRSB0byB0cmlnZ2VyIFZGUyBwYXRoIGxvb2t1cCByZXRyaWVzIChMT09LVVBfUkVWQUwpLiBUaGVzZSBmdW5jdGlvbmFsIGNoYW5nZXMgaW1wYWN0IGNvcmUgZmlsZSBvcGVyYXRpb25zIChvcGVuLCBnZXRhdHRyLCBzZXRhdHRyLCByZWFkbGluaywgc3RhdGZzKSBpbiBGVVNFIGFuZCB2aXJ0aW8tZnMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDAwOjA3OjI0LjYxOTk1NTAyNFoiLCJTZXEiOjIxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjE4NDU2ODYwNjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQwMDowNzoyNC42MjA0OTc3OTNaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoyMTg0NTEzODkyOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggc2VyaWVzIG1vZGlmaWVzIGVycm9yIGNvZGUgaGFuZGxpbmcgaW4gRlVTRSBhbmQgdmlydGlvLWZzIGJ5IHRyYW5zbGF0aW5nIC1FTk9FTlQgcmVzcG9uc2VzIHRvIC1FU1RBTEUgb3IgLUVPUEVOU1RBTEUgZm9yIG9wZXJhdGlvbnMgcmVmZXJlbmNpbmcgaW5vZGVzIGJ5IG5vZGVpZCAoZS5nLiwgRlVTRV9PUEVOLCBGVVNFX09QRU5ESVIsIEZVU0VfR0VUQVRUUiwgRlVTRV9TRVRBVFRSLCBGVVNFX1JFQURMSU5LLCBGVVNFX1NUQVRGUykgdG8gZW5hYmxlIFZGUyBwYXRoIGxvb2t1cCByZXRyaWVzIChyZXRyeV9lc3RhbGUpLlxcblxcblRoaXMgY2hhbmdlIHB1cmVseSBhbHRlcnMgaW50ZWdlciByZXR1cm4gdmFsdWVzL2Vycm5vIGNvZGVzIGluIGVycm9yIHBhdGhzLiBJdCBkb2VzIG5vdCBpbnRyb2R1Y2Ugb3IgbW9kaWZ5IGFueSBtZW1vcnkgYWxsb2NhdGlvbnMsIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbnMsIGJ1ZmZlciBjb3BpZXMgdG8gdXNlcnNwYWNlLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzIG9yIGluZm9ybWF0aW9uIGRpc2Nsb3N1cmUgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOIGRldGVjdGlvbi4gQW55IGNvbnRyb2wgZmxvdyBvciBmdW5jdGlvbmFsIHJlZ3Jlc3Npb24gaXNzdWVzIGFyZSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIHRlc3RpbmcgYW5kIEtBU0FOIGJ1aWxkcy5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBiNGNjYTM0YjZmZWU5NDg2M2IxYmUyMDM5MjA5MzhlMWY0YWY5YmU0XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgMjggMDA6MDU6MzAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9mdXNlL2Rpci5jIGIvZnMvZnVzZS9kaXIuY1xuaW5kZXggZTQ5YjRlODc0YjE1Zi4uMjE3YTAzOTk5MDUwNyAxMDA2NDRcbi0tLSBhL2ZzL2Z1c2UvZGlyLmNcbisrKyBiL2ZzL2Z1c2UvZGlyLmNcbkBAIC0xNTMyLDYgKzE1MzIsOCBAQCBzdGF0aWMgaW50IGZ1c2VfZG9fZ2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGlub2RlICppbm9kZSxcbiBcdFx0XHRpZiAoc3RhdClcbiBcdFx0XHRcdGZ1c2VfZmlsbGF0dHIoaWRtYXAsIGlub2RlLCBcdTAwMjZvdXRhcmcuYXR0ciwgc3RhdCk7XG4gXHRcdH1cbitcdH0gZWxzZSB7XG4rXHRcdGVyciA9IGZ1c2Vfc3RhbGVfaW5vZGVfZXJyKGVycik7XG4gXHR9XG4gXHRyZXR1cm4gZXJyO1xuIH1cbkBAIC0xODQ4LDYgKzE4NTAsNyBAQCBzdGF0aWMgaW50IGZ1c2VfcmVhZGxpbmtfZm9saW8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZvbGlvICpmb2xpbylcbiBcbiBcdGZ1c2VfaW52YWxpZGF0ZV9hdGltZShpbm9kZSk7XG4gXG4rXHRyZXMgPSBmdXNlX3N0YWxlX2lub2RlX2VycihyZXMpO1xuIFx0aWYgKHJlcyBcdTAwM2MgMClcbiBcdFx0cmV0dXJuIHJlcztcbiBcbkBAIC0xOTEwLDYgKzE5MTMsMTIgQEAgc3RhdGljIGludCBmdXNlX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxuIFx0XHRyZXR1cm4gZXJyO1xuIFxuIFx0ZXJyID0gZnVzZV9kb19vcGVuKGZtLCBnZXRfbm9kZV9pZChpbm9kZSksIGZpbGUsIHRydWUpO1xuK1x0LypcbitcdCAqIEFzIGluIGZ1c2Vfb3Blbl9jb21tb24oKTogYSBwYXRoIHdhbGsgc3RhbmRzIGJlaGluZCB0aGlzIG9wZW4sXG4rXHQgKiBzbyB0aGUgcmVmdXNhbCBpcyBFT1BFTlNUQUxFIGZvciBwYXRoX29wZW5hdCgpIHRvIGFuc3dlci5cbitcdCAqL1xuK1x0aWYgKGVyciA9PSAtRU5PRU5UKVxuK1x0XHRlcnIgPSAtRU9QRU5TVEFMRTtcbiBcdGlmICghZXJyKSB7XG4gXHRcdHN0cnVjdCBmdXNlX2ZpbGUgKmZmID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4gXG5AQCAtMjI0OSw2ICsyMjU4LDcgQEAgaW50IGZ1c2VfZG9fc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuIFx0aWYgKGVycikge1xuIFx0XHRpZiAoZXJyID09IC1FSU5UUilcbiBcdFx0XHRmdXNlX2ludmFsaWRhdGVfYXR0cihpbm9kZSk7XG4rXHRcdGVyciA9IGZ1c2Vfc3RhbGVfaW5vZGVfZXJyKGVycik7XG4gXHRcdGdvdG8gZXJyb3I7XG4gXHR9XG4gXG5kaWZmIC0tZ2l0IGEvZnMvZnVzZS9maWxlLmMgYi9mcy9mdXNlL2ZpbGUuY1xuaW5kZXggOGQ2MTM1YTYxMDhhNC4uMzA4YjE1YzMwZjM0ZCAxMDA2NDRcbi0tLSBhL2ZzL2Z1c2UvZmlsZS5jXG4rKysgYi9mcy9mdXNlL2ZpbGUuY1xuQEAgLTI3OSw2ICsyNzksMTcgQEAgc3RhdGljIGludCBmdXNlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG4gXHRcdGZ1c2Vfc2V0X25vd3JpdGUoaW5vZGUpO1xuIFxuIFx0ZXJyID0gZnVzZV9kb19vcGVuKGZtLCBnZXRfbm9kZV9pZChpbm9kZSksIGZpbGUsIGZhbHNlKTtcbitcdC8qXG4rXHQgKiBUaGlzIG9wZW4gcmVhY2hlZCB0aGUgc2VydmVyIHRocm91Z2ggYSBwYXRoIHdhbGssIHNvIGEgcmVmdXNhbFxuK1x0ICogZm9yIHRoZSBsaXZlIG5vZGVpZCBpcyByZXBvcnRlZCBhcyBFT1BFTlNUQUxFIHJhdGhlciB0aGFuIHRoZVxuK1x0ICogRVNUQUxFIHRoZSBub2RlaWQtb25seSByZXF1ZXN0cyBzYXk6IHBhdGhfb3BlbmF0KCkgcGlja3MgdGhlXG4rXHQgKiBjaGVhcGVzdCByZXRyeSBmb3IgdGhlIHdhbGsgaW4gcHJvZ3Jlc3MsIEVDSElMRCB1bmRlciBMT09LVVBfUkNVXG4rXHQgKiBhbmQgRVNUQUxFIG90aGVyd2lzZS4gZnVzZV9maWxlX29wZW4oKSBpcyBsZWZ0IGFsb25lIGJlY2F1c2VcbitcdCAqIGZ1c2VfcHJpdl9pb2N0bF9wcmVwYXJlKCkgcmVhY2hlcyBpdCB0byBzZXJ2ZSBGU19JT0NfR0VURkxBR1MsXG4rXHQgKiB3aXRoIG5vIG9wZW4gYmVoaW5kIGl0IHRvIHRyYW5zbGF0ZSB0aGUgaW50ZXJuYWwgZXJybm8uXG4rXHQgKi9cbitcdGlmIChlcnIgPT0gLUVOT0VOVClcbitcdFx0ZXJyID0gLUVPUEVOU1RBTEU7XG4gXHRpZiAoIWVycikge1xuIFx0XHRmZiA9IGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhO1xuIFx0XHRlcnIgPSBmdXNlX2ZpbmlzaF9vcGVuKGlub2RlLCBmaWxlKTtcbmRpZmYgLS1naXQgYS9mcy9mdXNlL2Z1c2VfaS5oIGIvZnMvZnVzZS9mdXNlX2kuaFxuaW5kZXggYzhkNGM1ZjNhZjdlOC4uZTZiMjU5N2Q2ZGQ2ZiAxMDA2NDRcbi0tLSBhL2ZzL2Z1c2UvZnVzZV9pLmhcbisrKyBiL2ZzL2Z1c2UvZnVzZV9pLmhcbkBAIC0xMjUwLDYgKzEyNTAsMjUgQEAgdm9pZCBmdXNlX2lub2RlX3VuY2FjaGVkX2lvX2VuZChzdHJ1Y3QgZnVzZV9pbm9kZSAqZmkpO1xuIGludCBmdXNlX2ZpbGVfaW9fb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGlub2RlICppbm9kZSk7XG4gdm9pZCBmdXNlX2ZpbGVfaW9fcmVsZWFzZShzdHJ1Y3QgZnVzZV9maWxlICpmZiwgc3RydWN0IGlub2RlICppbm9kZSk7XG4gXG4rLypcbisgKiBSZXBvcnQgYSByZXF1ZXN0IHJlZnVzZWQgZm9yIGEgbGl2ZSBub2RlaWQgYXMgc3RhbGUuXG4rICpcbisgKiBBIHJlcXVlc3QgdGhhdCBuYW1lcyBhIG5vZGVpZCBhbmQgbm90aGluZyBlbHNlIGlzIG9ubHkgc2VudCBmb3IgYW5cbisgKiBpbm9kZSB0aGUgY2xpZW50IGhhcyBsb29rZWQgdXAgYW5kIGhvbGRzIGEgcmVmZXJlbmNlIHRvLCBhbmQgdGhlXG4rICogc2VydmVyIG93ZXMgdGhlIGNsaWVudCB0aGF0IGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuXG4rICogRU5PRU5UIGZyb20gdGhlIHNlcnZlciBkZXNjcmliZXMgdGhlIGlub2RlIGl0c2VsZiByYXRoZXIgdGhhbiBhIG5hbWVcbisgKiB0aGF0IGhhcyBnb25lIGF3YXkuIFJlcG9ydCB0aGUgaGFuZGxlIGFzIHN0YWxlLCB3aGljaCB0aGUgY2FsbGVyXG4rICogYW5zd2VycyBieSByZXNvbHZpbmcgdGhlIG5hbWUgYWdhaW4gdW5kZXIgTE9PS1VQX1JFVkFMIGFuZCBhY3Rpbmcgb25cbisgKiB3aGF0ZXZlciBpdCByZWZlcnMgdG8gbm93LiBBIG5hbWUgdGhhdCByZWFsbHkgaGFzIGdvbmUgZmFpbHMgdGhhdFxuKyAqIHNlY29uZCBsb29rdXAgYW5kIHRoZSBjYWxsZXIgc3RpbGwgc2VlcyBFTk9FTlQuXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgZnVzZV9zdGFsZV9pbm9kZV9lcnIoaW50IGVycilcbit7XG4rXHRpZiAoZXJyID09IC1FTk9FTlQpXG4rXHRcdHJldHVybiAtRVNUQUxFO1xuK1x0cmV0dXJuIGVycjtcbit9XG4rXG4gLyogZmlsZS5jICovXG4gc3RydWN0IGZ1c2VfZmlsZSAqZnVzZV9maWxlX29wZW4oc3RydWN0IGZ1c2VfbW91bnQgKmZtLCB1NjQgbm9kZWlkLFxuIFx0XHRcdFx0IHVuc2lnbmVkIGludCBvcGVuX2ZsYWdzLCBib29sIGlzZGlyKTtcbmRpZmYgLS1naXQgYS9mcy9mdXNlL2lub2RlLmMgYi9mcy9mdXNlL2lub2RlLmNcbmluZGV4IGU5NTUyYmUzNjM3YmMuLmNkZTBhNTMzNTA4OTcgMTAwNjQ0XG4tLS0gYS9mcy9mdXNlL2lub2RlLmNcbisrKyBiL2ZzL2Z1c2UvaW5vZGUuY1xuQEAgLTY2Niw3ICs2NjYsNyBAQCBzdGF0aWMgaW50IGZ1c2Vfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZilcbiBcdGVyciA9IGZ1c2Vfc2ltcGxlX3JlcXVlc3QoZm0sIFx1MDAyNmFyZ3MpO1xuIFx0aWYgKCFlcnIpXG4gXHRcdGNvbnZlcnRfZnVzZV9zdGF0ZnMoYnVmLCBcdTAwMjZvdXRhcmcuc3QpO1xuLVx0cmV0dXJuIGVycjtcbitcdHJldHVybiBmdXNlX3N0YWxlX2lub2RlX2VycihlcnIpO1xuIH1cbiBcbiBzdGF0aWMgc3RydWN0IGZ1c2Vfc3luY19idWNrZXQgKmZ1c2Vfc3luY19idWNrZXRfYWxsb2Modm9pZClcbmRpZmYgLS1naXQgYS9mcy9mdXNlL3ZpcnRpb19mcy5jIGIvZnMvZnVzZS92aXJ0aW9fZnMuY1xuaW5kZXggZjE1ZTUxNmViY2I1Yy4uN2IwM2JmODdjMmFlOCAxMDA2NDRcbi0tLSBhL2ZzL2Z1c2UvdmlydGlvX2ZzLmNcbisrKyBiL2ZzL2Z1c2UvdmlydGlvX2ZzLmNcbkBAIC03ODAsNiArNzgwLDY2IEBAIHN0YXRpYyBib29sIHZpcnRpb19mc192ZXJpZnlfcmVzcG9uc2Uoc3RydWN0IGZ1c2VfcmVxICpyZXEsIHVuc2lnbmVkIGludCBsZW4pXG4gXHRyZXR1cm4gdHJ1ZTtcbiB9XG4gXG4rLypcbisgKiBSZXBvcnQgYSByZXF1ZXN0IHJlZnVzZWQgZm9yIGEgbGl2ZSBub2RlaWQgYXMgc3RhbGUuXG4rICpcbisgKiBUaGVzZSByZXF1ZXN0cyBjYXJyeSBhIG5vZGVpZCBhbmQgbm8gbmFtZSwgc28gdGhlIGNsaWVudCBvbmx5IHNlbmRzIHRoZW0gZm9yXG4rICogYW4gaW5vZGUgaXQgaGFzIGFscmVhZHkgbG9va2VkIHVwIGFuZCBob2xkcyBhIHJlZmVyZW5jZSB0bywgYW5kIGEgc2VydmVyIG93ZXNcbisgKiB0aGUgY2xpZW50IHRoYXQgaW5vZGUgdW50aWwgaXQgaXMgc2VudCBGVVNFX0ZPUkdFVC4gQSBzZXJ2ZXIgYW5zd2VyaW5nIHdpdGhcbisgKiBFTk9FTlQgaXMgZGVzY3JpYmluZyBhIGhhbmRsZSBpdCB3YXMgb2JsaWdlZCB0byBob25vdXIgcmF0aGVyIHRoYW4gYSBuYW1lXG4rICogdGhhdCBoYXMgZ29uZSBhd2F5LCBhbmQgdGhlIGNhbGxlciBoYXMgbm8gcmVhc29uIHRvIGRvdWJ0IGl0LlxuKyAqXG4rICogU2F5aW5nIHRoZSBoYW5kbGUgaXMgc3RhbGUgaXMgc29tZXRoaW5nIHRoZSBjYWxsZXIga25vd3MgaG93IHRvIGFuc3dlcjogaXRcbisgKiByZXBlYXRzIHRoZSBsb29rdXAgdW5kZXIgTE9PS1VQX1JFVkFMIGFuZCBhY3RzIG9uIHdoYXRldmVyIHRoZSBuYW1lIHJlZmVycyB0b1xuKyAqIG5vdy4gQSBuYW1lIHRoYXQgZ2VudWluZWx5IGhhcyBnb25lIGZhaWxzIHRoZSByZXRyaWVkIGxvb2t1cCwgc28gYSBjYWxsZXJcbisgKiBzdGlsbCBsZWFybnMgaXQgaXMgZ29uZS4gcmV0cnlfZXN0YWxlKCkgaXMgd2hhdCBkb2VzIHRoaXMsIGFuZCBmcy9uYW1laS5jLFxuKyAqIGZzL29wZW4uYywgZnMvc3RhdC5jLCBmcy9zdGF0ZnMuYywgZnMvdXRpbWVzLmMgYW5kIGZzL3hhdHRyLmMgYWxsIHJlYWNoIGl0LFxuKyAqIHdoaWNoIGlzIHdoYXQgbWFrZXMgdGhlIGNvbnZlcnNpb24gdXNlZnVsIHJhdGhlciB0aGFuIGEgcmVuYW1lIG9mIHRoZSBlcnJvci5cbisgKlxuKyAqIEEgcmVxdWVzdCB0aGF0IG5hbWVzIHNvbWV0aGluZyB3aGljaCBjYW4gaXRzZWxmIGJlIGFic2VudCBpcyBsZWZ0IGFsb25lLFxuKyAqIGJlY2F1c2UgRU5PRU5UIGlzIHRoZW4gYW1iaWd1b3VzIGFuZCBpcyBmcmVxdWVudGx5IHRoZSBhbnN3ZXIgdGhlIGNhbGxlclxuKyAqIGFza2VkIGZvci4gRlVTRV9MT09LVVAgcmVwb3J0cyBhIG1pc3NpbmcgbmFtZSBpbiBhIGxpdmluZyBkaXJlY3RvcnkgYW5kIHRoZVxuKyAqIGRpcmVjdG9yeSBvcGVyYXRpb25zIGNhcnJ5IGEgcGFyZW50IG5vZGVpZCBiZXNpZGUgb25lLCBzbyBuZWl0aGVyIGNhbiBiZVxuKyAqIHJlYWQgYXMgYSBzdGF0ZW1lbnQgYWJvdXQgdGhlIGlub2RlLiBUaGUgZXh0ZW5kZWQgYXR0cmlidXRlIHJlcXVlc3RzIGJlbG9uZ1xuKyAqIHdpdGggdGhlbTogdGhleSBjYXJyeSBhbiBhdHRyaWJ1dGUgbmFtZSwgYW5kIHdoaWxlIGEgc2VydmVyIHNob3VsZCByZXBvcnQgYVxuKyAqIG1pc3NpbmcgYXR0cmlidXRlIGFzIEVOT0RBVEEsIG9uZSB0aGF0IGFuc3dlcnMgRU5PRU5UIGluc3RlYWQgd291bGQgaGF2ZSBhXG4rICogY29ycmVjdCByZXBseSB0dXJuZWQgaW50byBhIHJldHJ5IHRoYXQgY2Fubm90IHN1Y2NlZWQuXG4rICpcbisgKiBSZXF1ZXN0cyBhZ2FpbnN0IGFuIGFscmVhZHkgb3BlbiBkZXNjcmlwdG9yIGFyZSBhbHNvIGxlZnQgYWxvbmUsIHNpbmNlIHRoZXJlXG4rICogaXMgbm8gZXF1aXZhbGVudCByZXRyeSB0byByZWFjaCBhbmQgY29udmVydGluZyB0aGUgZXJyb3Igd291bGQgcmVuYW1lIGFcbisgKiBmYWlsdXJlIHJhdGhlciB0aGFuIHJlcGFpciBpdCwgYW5kIEZVU0VfSU9DVEwgYW5kIEZVU0VfUE9MTCBoYW5kIHRoZVxuKyAqIHNlcnZlcidzIGVycm5vIHRvIHVzZXJzcGFjZSB2ZXJiYXRpbS5cbisgKi9cbitzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfZml4dXBfc3RhbGVfZXJyb3Ioc3RydWN0IGZ1c2VfcmVxICpyZXEpXG4re1xuK1x0aWYgKHJlcS1cdTAwM2VvdXQuaC5lcnJvciAhPSAtRU5PRU5UKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRzd2l0Y2ggKHJlcS1cdTAwM2Vpbi5oLm9wY29kZSkge1xuK1x0Y2FzZSBGVVNFX09QRU46XG4rXHRjYXNlIEZVU0VfT1BFTkRJUjpcbitcdFx0LypcbitcdFx0ICogQW4gb3BlbiBzYXlzIEVPUEVOU1RBTEUsIGFuZCBwYXRoX29wZW5hdCgpIGRlY2lkZXMgd2hhdCB0aGVcbitcdFx0ICogd2FsayBpbiBwcm9ncmVzcyBzaG91bGQgbWFrZSBvZiBpdDogRUNISUxEIHVuZGVyIExPT0tVUF9SQ1VcbitcdFx0ICogc28gaXQgZHJvcHMgdG8gUkVGLXdhbGssIEVTVEFMRSBvdGhlcndpc2Ugc28gdGhlIG5hbWUgaXNcbitcdFx0ICogcmVzb2x2ZWQgYWdhaW4gdW5kZXIgTE9PS1VQX1JFVkFMLiBOYW1pbmcgRVNUQUxFIGhlcmUgd291bGRcbitcdFx0ICogdGFrZSB0aGUgc2Vjb25kIGluIGJvdGggY2FzZXMgYW5kIHNraXAgYSBjaGVhcGVyIHJldHJ5LlxuK1x0XHQgKi9cbitcdFx0cmVxLVx1MDAzZW91dC5oLmVycm9yID0gLUVPUEVOU1RBTEU7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBGVVNFX0dFVEFUVFI6XG4rXHRjYXNlIEZVU0VfU0VUQVRUUjpcbitcdGNhc2UgRlVTRV9SRUFETElOSzpcbitcdGNhc2UgRlVTRV9TVEFURlM6XG4rXHRcdC8qXG4rXHRcdCAqIE5vdGhpbmcgdHJhbnNsYXRlcyBFT1BFTlNUQUxFIG91dHNpZGUgdGhlIG9wZW4gcGF0aCwgc29cbitcdFx0ICogdGhlc2Ugc2F5IEVTVEFMRSBkaXJlY3RseSwgd2hpY2ggcmV0cnlfZXN0YWxlKCkgYW5zd2Vycy5cbitcdFx0ICovXG4rXHRcdHJlcS1cdTAwM2VvdXQuaC5lcnJvciA9IC1FU1RBTEU7XG4rXHRcdGJyZWFrO1xuK1x0fVxuK31cbitcbiAvKiBXb3JrIGZ1bmN0aW9uIGZvciByZXF1ZXN0IGNvbXBsZXRpb24gKi9cbiBzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZShzdHJ1Y3QgZnVzZV9yZXEgKnJlcSxcbiBcdFx0XHRcdCAgICAgICBzdHJ1Y3QgdmlydGlvX2ZzX3ZxICpmc3ZxKVxuQEAgLTgxMCw2ICs4NzAsOCBAQCBzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZShzdHJ1Y3QgZnVzZV9yZXEgKnJlcSxcbiBcbiBcdGNsZWFyX2JpdChGUl9TRU5ULCBcdTAwMjZyZXEtXHUwMDNlZmxhZ3MpO1xuIFxuK1x0dmlydGlvX2ZzX2ZpeHVwX3N0YWxlX2Vycm9yKHJlcSk7XG4rXG4gXHRmdXNlX3JlcXVlc3RfZW5kKHJlcSk7XG4gXHRzcGluX2xvY2soXHUwMDI2ZnN2cS1cdTAwM2Vsb2NrKTtcbiBcdGRlY19pbl9mbGlnaHRfcmVxKGZzdnEpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZVxuaW5kZXggZmI1MTYwM2ZlNDE5OC4uOWNiMzA0ODEyOGQ1YiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZVxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uZ2l0aWdub3JlXG5AQCAtMSw0ICsxLDYgQEBcbiAjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbitmdXNlX2FjbF9jYWNoZV90ZXN0XG4gZnVzZV9tbnRcbitmdXNlX2VzdGFsZV90ZXN0XG4gZnVzZWN0bF90ZXN0XG4gd3JpdGVfZXh0ZW5kX2VvZl90ZXN0XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvTWFrZWZpbGVcbmluZGV4IDk1YTFlZTk0N2NhNzYuLmY1NjRjYjM3YjNhNWIgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL01ha2VmaWxlXG5AQCAtNiwxMSArNiwxMiBAQCBURVNUX0dFTl9QUk9HUyA6PSBmdXNlY3RsX3Rlc3RcbiBURVNUX0dFTl9QUk9HUyArPSB3cml0ZV9leHRlbmRfZW9mX3Rlc3RcbiBURVNUX0dFTl9GSUxFUyA6PSBmdXNlX21udFxuIFxuLSMgZnVzZV9hY2xfY2FjaGVfdGVzdCByZXF1aXJlcyBsaWJmdXNlMzsgYWRkIGl0IG9ubHkgd2hlbiB0aGUgbGlicmFyeSBpcyBwcmVzZW50LlxuLUFDTF9DRkxBR1MgOj0gJChzaGVsbCBwa2ctY29uZmlnIGZ1c2UzIC0tY2ZsYWdzIDJcdTAwM2UvZGV2L251bGwpXG4tQUNMX0xETElCUyA6PSAkKHNoZWxsIHBrZy1jb25maWcgZnVzZTMgLS1saWJzIDJcdTAwM2UvZGV2L251bGwpXG4taWZuZXEgKCQoQUNMX0NGTEFHUyksKVxuKyMgVGhlc2UgdGVzdHMgcmVxdWlyZSBsaWJmdXNlMzsgYWRkIHRoZW0gb25seSB3aGVuIHRoZSBsaWJyYXJ5IGlzIHByZXNlbnQuXG4rRlVTRTNfQ0ZMQUdTIDo9ICQoc2hlbGwgcGtnLWNvbmZpZyBmdXNlMyAtLWNmbGFncyAyXHUwMDNlL2Rldi9udWxsKVxuK0ZVU0UzX0xETElCUyA6PSAkKHNoZWxsIHBrZy1jb25maWcgZnVzZTMgLS1saWJzIDJcdTAwM2UvZGV2L251bGwpXG4raWZuZXEgKCQoRlVTRTNfQ0ZMQUdTKSwpXG4gVEVTVF9HRU5fUFJPR1MgKz0gZnVzZV9hY2xfY2FjaGVfdGVzdFxuK1RFU1RfR0VOX1BST0dTICs9IGZ1c2VfZXN0YWxlX3Rlc3RcbiBlbmRpZlxuIFxuIGluY2x1ZGUgLi4vLi4vbGliLm1rXG5AQCAtMzAsNSArMzEsOCBAQCBlbmRpZlxuICQoT1VUUFVUKS9mdXNlX21udDogQ0ZMQUdTICs9ICQoVkFSX0NGTEFHUylcbiAkKE9VVFBVVCkvZnVzZV9tbnQ6IExETElCUyArPSAkKFZBUl9MRExJQlMpXG4gXG4tJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IENGTEFHUyArPSAkKEFDTF9DRkxBR1MpXG4tJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IExETElCUyArPSAkKEFDTF9MRExJQlMpXG4rJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IENGTEFHUyArPSAkKEZVU0UzX0NGTEFHUylcbiskKE9VVFBVVCkvZnVzZV9hY2xfY2FjaGVfdGVzdDogTERMSUJTICs9ICQoRlVTRTNfTERMSUJTKVxuK1xuKyQoT1VUUFVUKS9mdXNlX2VzdGFsZV90ZXN0OiBDRkxBR1MgKz0gJChGVVNFM19DRkxBR1MpXG4rJChPVVRQVVQpL2Z1c2VfZXN0YWxlX3Rlc3Q6IExETElCUyArPSAkKEZVU0UzX0xETElCUylcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL2Z1c2VfZXN0YWxlX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvZnVzZV9lc3RhbGVfdGVzdC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uODJiODQyZDNhNWY3YlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9mdXNlX2VzdGFsZV90ZXN0LmNcbkBAIC0wLDAgKzEsNDUwIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIFRlc3Q6IGEgcmVxdWVzdCByZWZ1c2VkIGZvciBhbiBpbm9kZSB0aGUgY2xpZW50IHN0aWxsIGhvbGRzIGEgcmVmZXJlbmNlIHRvXG4rICpcbisgKiBGVVNFX09QRU4sIEZVU0VfR0VUQVRUUiwgRlVTRV9TRVRBVFRSLCBGVVNFX1JFQURMSU5LIGFuZCBGVVNFX1NUQVRGUyBjYXJyeSBhXG4rICogbm9kZWlkIHJhdGhlciB0aGFuIGEgcGF0aC4gIFRoZSBjbGllbnQgb25seSBzZW5kcyB0aGVtIGZvciBhbiBpbm9kZSBpdCBoYXNcbisgKiBhbHJlYWR5IGxvb2tlZCB1cCBhbmQgaG9sZHMgYSByZWZlcmVuY2UgdG8sIGFuZCBhIHNlcnZlciBvd2VzIHRoZSBjbGllbnQgdGhhdFxuKyAqIGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuICBBIHNlcnZlciB0aGF0IGxldHMgdGhlIGlub2RlIGdvIGVhcmx5LFxuKyAqIGFzIG9uZSBiYWNraW5nIGEgc2hhcmVkIGRpcmVjdG9yeSBkb2VzIHdoZW4gdGhlIG5hbWUgaXMgcmVuYW1lZCBvdmVyLCBhbnN3ZXJzXG4rICogd2l0aCBFTk9FTlQuXG4rICpcbisgKiBPbiBhbiB1bmZpeGVkIGtlcm5lbCB0aGF0IEVOT0VOVCBpcyBwYXNzZWQgb3V0IHVuY2hhbmdlZC4gIFRoZSBwYXRoIHdhbGsgaGFzXG4rICogbm8gcmVhc29uIHRvIGRvdWJ0IGl0IGFuZCB0aGUgY2FsbGVyIGlzIHRvbGQgYSBmaWxlIGlzIG1pc3Npbmcgd2hlbiBpdCBuZXZlclxuKyAqIHN0b3BwZWQgZXhpc3RpbmcuICBDYWxsZXJzIHRoYXQgcmVhZCBhIG1pc3NpbmcgZmlsZSBhcyBhbiBlbXB0eSBvbmUgYWN0IG9uXG4rICogdGhlIGVtcHRpbmVzcy5cbisgKlxuKyAqIEZpeGVkIChmcy9mdXNlL2ZpbGUuYyBhbmQgZnMvZnVzZS9kaXIuYyk6IEVOT0VOVCBiZWNvbWVzIEVTVEFMRSwgd2hpY2hcbisgKiBkZXNjcmliZXMgdGhlIGhhbmRsZSByYXRoZXIgdGhhbiB0aGUgbmFtZS4gIGZpbGVuYW1lX2xvb2t1cCgpIGFuZFxuKyAqIGRvX2ZpbHBfb3BlbigpIGFscmVhZHkgcmV0cnkgd2l0aCBMT09LVVBfUkVWQUwgb24gRVNUQUxFLCBzbyB0aGUgbmFtZSBpc1xuKyAqIHJlc29sdmVkIGFnYWluIGFuZCB0aGUgaW5vZGUgaXQgcmVmZXJzIHRvIG5vdyBpcyB1c2VkLiAgQSBuYW1lIHRoYXQgaGFzXG4rICogZ2VudWluZWx5IGdvbmUgYXdheSBmYWlscyB0aGUgcmV0cmllZCBsb29rdXAsIHNvIEVOT0VOVCBzdGlsbCByZWFjaGVzIGFcbisgKiBjYWxsZXIgdGhhdCBkZXNlcnZlcyBpdC5cbisgKlxuKyAqIE9ubHkgcmVxdWVzdHMgcmVhY2hhYmxlIHRocm91Z2ggYSBwYXRoIHdhbGsgYXJlIGNvdmVyZWQsIGJlY2F1c2UgdGhlIHJldHJ5XG4rICogaXMgd2hhdCBtYWtlcyBFU1RBTEUgdXNlZnVsIGFuZCB0aGUgd2FsayBpcyB3aGF0IHBlcmZvcm1zIGl0LiAgQW4gb3BlcmF0aW9uXG4rICogb24gYSBkZXNjcmlwdG9yIGFscmVhZHkgb3BlbiBoYXMgbm8gZXF1aXZhbGVudCByZWNvdmVyeS5cbisgKlxuKyAqIFRlc3Qgb3V0bGluZTpcbisgKiAgMS4gTW91bnQgYSBtaW5pbWFsIEZVU0UgZnMgaG9sZGluZyBvbmUgZmlsZS5cbisgKiAgMi4gVGhlIHNlcnZlciByZWZ1c2VzIHRoZSBmaXJzdCByZXF1ZXN0IG9mIHRoZSBraW5kIHVuZGVyIHRlc3QgYW5kIGFsbG93c1xuKyAqICAgICBldmVyeSBvbmUgYWZ0ZXIgaXQsIHN0YW5kaW5nIGluIGZvciBhIHNlcnZlciB0aGF0IHJlbGVhc2VkIHRoZSBpbm9kZSBhbmRcbisgKiAgICAgaGFzIHNpbmNlIHJlc29sdmVkIHRoZSBuYW1lIGFnYWluLlxuKyAqICAzLiBvcGVuYXQoKSB0aGUgZmlsZS5cbisgKiAgICAgQnVnZ3k6ICBFTk9FTlQgcmVhY2hlcyB0aGUgY2FsbGVyLCBvbmUgb3BlbiB3YXMgYXNrZWQgZm9yLiAgRkFJTC5cbisgKiAgICAgRml4ZWQ6ICB0aGUgd2FsayByZXRyaWVzLCB0aGUgc2Vjb25kIG9wZW4gaXMgYWxsb3dlZCwgdGhlIGRlc2NyaXB0b3IgaXNcbisgKiAgICAgICAgICAgICByZXR1cm5lZCwgdHdvIG9wZW5zIHdlcmUgYXNrZWQgZm9yLiAgUEFTUy5cbisgKiAgNC4gc3RhdCgpLCBjaG1vZCgpLCByZWFkbGluaygpIGFuZCBzdGF0ZnMoKSBieSBuYW1lLCB3aGljaCBhcmUgdGhlIHNhbWVcbisgKiAgICAgcmVjb3ZlcnkgdGhyb3VnaCBGVVNFX0dFVEFUVFIsIEZVU0VfU0VUQVRUUiwgRlVTRV9SRUFETElOSyBhbmRcbisgKiAgICAgRlVTRV9TVEFURlMuICBFYWNoIGlzIHJlYWNoZWQgdGhyb3VnaCBhIHBhdGggd2Fsaywgd2hpY2ggaXMgd2hhdCBtYWtlc1xuKyAqICAgICB0aGUgcmV0cnkgYXZhaWxhYmxlLlxuKyAqICA1LiBPcGVuIGEgbmFtZSB0aGUgc2VydmVyIGRvZXMgbm90IGhhdmUgYXQgYWxsLlxuKyAqICAgICBCb3RoOiAgIEVOT0VOVCwgYmVjYXVzZSB0aGUgbG9va3VwIGZhaWxzIHJhdGhlciB0aGFuIHRoZSBvcGVuLCBhbmQgYVxuKyAqICAgICAgICAgICAgIGZpbGUgdGhhdCBpcyBhYnNlbnQgbXVzdCBzdGlsbCBsb29rIGFic2VudC5cbisgKi9cbitcbisjZGVmaW5lIF9HTlVfU09VUkNFXG4rI2RlZmluZSBGVVNFX1VTRV9WRVJTSU9OIDM0XG4rXG4rI2luY2x1ZGUgXHUwMDNjZXJybm8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NmdXNlX2xvd2xldmVsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9saW1pdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGJvb2wuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3N0YXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0dmZzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvdmZzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwiLi4vLi4va3NlbGZ0ZXN0X2hhcm5lc3MuaFwiXG4rXG4rI2RlZmluZSBGSUxFX05BTUVcdFwiaGVsZFwiXG4rI2RlZmluZSBMSU5LX05BTUVcdFwiaGVsZC1saW5rXCJcbisjZGVmaW5lIEFCU0VOVF9OQU1FXHRcIm5vLXN1Y2gtZmlsZVwiXG4rI2RlZmluZSBGSUxFX0lOT1x0MlxuKyNkZWZpbmUgTElOS19JTk9cdDNcbisjZGVmaW5lIENPTlRFTlRTXHRcInByZXNlbnRcXG5cIlxuKyNkZWZpbmUgTElOS19UQVJHRVRcdEZJTEVfTkFNRVxuK1xuKy8qXG4rICogV2hpY2ggcmVxdWVzdCB0aGUgc2VydmVyIHJlZnVzZXMsIGFuZCBob3cgbWFueSB0aW1lcy4gIFNoYXJlZCB3aXRoIHRoZVxuKyAqIGRhZW1vbiB0aHJlYWQ7IG9uZSB0ZXN0IHJ1bnMgYXQgYSB0aW1lLCBzbyBwbGFpbiBpbnRzLlxuKyAqXG4rICogRXZlcnkgb25lIG9mIHRoZXNlIG5hbWVzIGFuIGlub2RlIGJ5IG5vZGVpZCByYXRoZXIgdGhhbiBieSBuYW1lLCBzbyBhXG4rICogcmVmdXNhbCBvZiBhbnkgb2YgdGhlbSBpcyBkZXNjcmliaW5nIGEgaGFuZGxlIHJhdGhlciB0aGFuIGEgbWlzc2luZyBmaWxlLlxuKyAqIEZVU0VfTE9PS1VQIGlzIGRlbGliZXJhdGVseSBhYnNlbnQ6IGl0IGNhcnJpZXMgYSBuYW1lLCBzbyBpdHMgRU5PRU5UIGlzIGFuXG4rICogYW5zd2VyIHJhdGhlciB0aGFuIGEgZmF1bHQsIGFuZCBhYnNlbnRfbmFtZV9zdGlsbF9yZXBvcnRzX2Fic2VudCBjb3ZlcnMgaXQuXG4rICovXG4rZW51bSByZWZ1c2Vfd2hhdCB7XG4rXHRSRUZVU0VfTk9USElORyxcbitcdFJFRlVTRV9PUEVOLFxuK1x0UkVGVVNFX0dFVEFUVFIsXG4rXHRSRUZVU0VfU0VUQVRUUixcbitcdFJFRlVTRV9SRUFETElOSyxcbitcdFJFRlVTRV9TVEFURlMsXG4rfTtcbitcbitzdGF0aWMgc3RydWN0IHtcbitcdGVudW0gcmVmdXNlX3doYXQgd2hhdDtcbitcdGludCByZWZ1c2Fsc19sZWZ0O1xuK1x0aW50IG9wZW5zX3NlZW47XG4rXHRpbnQgZ2V0YXR0cnNfc2VlbjtcbitcdGludCBzZXRhdHRyc19zZWVuO1xuK1x0aW50IHJlYWRsaW5rc19zZWVuO1xuK1x0aW50IHN0YXRmc3Nfc2Vlbjtcbit9IGdfZHM7XG4rXG4rLyogVHJ1ZSBvbmNlLCBmb3IgdGhlIHJlcXVlc3QgdW5kZXIgdGVzdCwgYW5kIHRoZW4gbmV2ZXIgYWdhaW4uICovXG4rc3RhdGljIGJvb2wgcmVmdXNlX25vdyhlbnVtIHJlZnVzZV93aGF0IHdoYXQpXG4re1xuK1x0aWYgKGdfZHMud2hhdCAhPSB3aGF0IHx8IGdfZHMucmVmdXNhbHNfbGVmdCBcdTAwM2M9IDApXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdGdfZHMucmVmdXNhbHNfbGVmdC0tO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGZpbGxfYXR0cihmdXNlX2lub190IGlubywgc3RydWN0IHN0YXQgKnN0KVxuK3tcbitcdG1lbXNldChzdCwgMCwgc2l6ZW9mKCpzdCkpO1xuK1x0c3QtXHUwMDNlc3RfaW5vID0gaW5vO1xuK1x0LypcbitcdCAqIE93bmVkIGJ5IHdob2V2ZXIgcnVucyB0aGUgdGVzdCwgc28gdGhhdCBjaG1vZCgpIGlzIGEgcmVxdWVzdCB0aGVcbitcdCAqIGtlcm5lbCB3aWxsIGNhcnJ5IHRocm91Z2ggdG8gdGhlIHNlcnZlciByYXRoZXIgdGhhbiByZWZ1c2UgaXRzZWxmLlxuK1x0ICovXG4rXHRzdC1cdTAwM2VzdF91aWQgPSBnZXR1aWQoKTtcbitcdHN0LVx1MDAzZXN0X2dpZCA9IGdldGdpZCgpO1xuK1x0aWYgKGlubyA9PSBGVVNFX1JPT1RfSUQpIHtcbitcdFx0c3QtXHUwMDNlc3RfbW9kZSA9IFNfSUZESVIgfCAwNzU1O1xuK1x0XHRzdC1cdTAwM2VzdF9ubGluayA9IDI7XG4rXHR9IGVsc2UgaWYgKGlubyA9PSBMSU5LX0lOTykge1xuK1x0XHRzdC1cdTAwM2VzdF9tb2RlID0gU19JRkxOSyB8IDA3Nzc7XG4rXHRcdHN0LVx1MDAzZXN0X25saW5rID0gMTtcbitcdFx0c3QtXHUwMDNlc3Rfc2l6ZSA9IHNpemVvZihMSU5LX1RBUkdFVCkgLSAxO1xuK1x0fSBlbHNlIHtcbitcdFx0c3QtXHUwMDNlc3RfbW9kZSA9IFNfSUZSRUcgfCAwNjQ0O1xuK1x0XHRzdC1cdTAwM2VzdF9ubGluayA9IDE7XG4rXHRcdHN0LVx1MDAzZXN0X3NpemUgPSBzaXplb2YoQ09OVEVOVFMpIC0gMTtcbitcdH1cbit9XG4rXG4rc3RhdGljIHZvaWQgdF9sb29rdXAoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgcGFyZW50LCBjb25zdCBjaGFyICpuYW1lKVxuK3tcbitcdHN0cnVjdCBmdXNlX2VudHJ5X3BhcmFtIGU7XG4rXHRmdXNlX2lub190IGlubztcbitcbitcdGlmIChwYXJlbnQgIT0gRlVTRV9ST09UX0lEKVxuK1x0XHRpbm8gPSAwO1xuK1x0ZWxzZSBpZiAoIXN0cmNtcChuYW1lLCBGSUxFX05BTUUpKVxuK1x0XHRpbm8gPSBGSUxFX0lOTztcbitcdGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgTElOS19OQU1FKSlcbitcdFx0aW5vID0gTElOS19JTk87XG4rXHRlbHNlXG4rXHRcdGlubyA9IDA7XG4rXG4rXHRpZiAoIWlubykge1xuK1x0XHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbitcdG1lbXNldChcdTAwMjZlLCAwLCBzaXplb2YoZSkpO1xuK1x0ZS5pbm8gPSBpbm87XG4rXHRlLmF0dHJfdGltZW91dCA9IDA7XG4rXHRlLmVudHJ5X3RpbWVvdXQgPSAwO1xuK1x0ZmlsbF9hdHRyKGlubywgXHUwMDI2ZS5hdHRyKTtcbitcdGZ1c2VfcmVwbHlfZW50cnkocmVxLCBcdTAwMjZlKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdF9nZXRhdHRyKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubyxcbitcdFx0ICAgICAgc3RydWN0IGZ1c2VfZmlsZV9pbmZvICpmaSlcbit7XG4rXHRzdHJ1Y3Qgc3RhdCBzdDtcbitcbitcdCh2b2lkKWZpO1xuK1x0LyogVGhlIHJvb3QgaXMgbGVmdCBhbG9uZTsgcmVmdXNpbmcgaXQgd291bGQgYnJlYWsgdGhlIG1vdW50IGl0c2VsZi4gKi9cbitcdGlmIChpbm8gPT0gRklMRV9JTk8pIHtcbitcdFx0Z19kcy5nZXRhdHRyc19zZWVuKys7XG4rXHRcdGlmIChyZWZ1c2Vfbm93KFJFRlVTRV9HRVRBVFRSKSkge1xuK1x0XHRcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTtcbitcdFx0XHRyZXR1cm47XG4rXHRcdH1cbitcdH1cbitcdGZpbGxfYXR0cihpbm8sIFx1MDAyNnN0KTtcbitcdGZ1c2VfcmVwbHlfYXR0cihyZXEsIFx1MDAyNnN0LCAwKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdF9vcGVuKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubywgc3RydWN0IGZ1c2VfZmlsZV9pbmZvICpmaSlcbit7XG4rXHRpZiAoaW5vICE9IEZJTEVfSU5PKSB7XG4rXHRcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuK1x0Z19kcy5vcGVuc19zZWVuKys7XG4rXHRpZiAocmVmdXNlX25vdyhSRUZVU0VfT1BFTikpIHtcbitcdFx0LypcbitcdFx0ICogVGhlIGlub2RlIGlzIGdvbmUgYXMgZmFyIGFzIHRoaXMgc2VydmVyIGlzIGNvbmNlcm5lZCwgZXZlblxuK1x0XHQgKiB0aG91Z2ggdGhlIGNsaWVudCBpcyBob2xkaW5nIGEgcmVmZXJlbmNlIHRvIGl0IGFuZCBhc2tlZCBieVxuK1x0XHQgKiBub2RlaWQgcmF0aGVyIHRoYW4gYnkgbmFtZS5cbitcdFx0ICovXG4rXHRcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1x0ZnVzZV9yZXBseV9vcGVuKHJlcSwgZmkpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0X3JlYWQoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgaW5vLCBzaXplX3Qgc2l6ZSwgb2ZmX3Qgb2ZmLFxuK1x0XHQgICBzdHJ1Y3QgZnVzZV9maWxlX2luZm8gKmZpKVxuK3tcbitcdHNpemVfdCBsZW4gPSBzaXplb2YoQ09OVEVOVFMpIC0gMTtcbitcbitcdCh2b2lkKWZpO1xuK1x0aWYgKGlubyAhPSBGSUxFX0lOTykge1xuK1x0XHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdGlmICgoc2l6ZV90KW9mZiBcdTAwM2U9IGxlbikge1xuK1x0XHRmdXNlX3JlcGx5X2J1ZihyZXEsIE5VTEwsIDApO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXHRpZiAob2ZmICsgc2l6ZSBcdTAwM2UgbGVuKVxuK1x0XHRzaXplID0gbGVuIC0gb2ZmO1xuK1x0ZnVzZV9yZXBseV9idWYocmVxLCBDT05URU5UUyArIG9mZiwgc2l6ZSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRfc2V0YXR0cihmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8sIHN0cnVjdCBzdGF0ICphdHRyLFxuK1x0XHQgICAgICBpbnQgdG9fc2V0LCBzdHJ1Y3QgZnVzZV9maWxlX2luZm8gKmZpKVxuK3tcbitcdHN0cnVjdCBzdGF0IHN0O1xuK1xuK1x0KHZvaWQpYXR0cjtcbitcdCh2b2lkKXRvX3NldDtcbitcdCh2b2lkKWZpO1xuK1x0aWYgKGlubyA9PSBGSUxFX0lOTykge1xuK1x0XHRnX2RzLnNldGF0dHJzX3NlZW4rKztcbitcdFx0aWYgKHJlZnVzZV9ub3coUkVGVVNFX1NFVEFUVFIpKSB7XG4rXHRcdFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpO1xuK1x0XHRcdHJldHVybjtcbitcdFx0fVxuK1x0fVxuK1x0ZmlsbF9hdHRyKGlubywgXHUwMDI2c3QpO1xuK1x0ZnVzZV9yZXBseV9hdHRyKHJlcSwgXHUwMDI2c3QsIDApO1xuK31cbitcbitzdGF0aWMgdm9pZCB0X3JlYWRsaW5rKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubylcbit7XG4rXHRpZiAoaW5vICE9IExJTktfSU5PKSB7XG4rXHRcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRUlOVkFMKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuK1x0Z19kcy5yZWFkbGlua3Nfc2VlbisrO1xuK1x0aWYgKHJlZnVzZV9ub3coUkVGVVNFX1JFQURMSU5LKSkge1xuK1x0XHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdGZ1c2VfcmVwbHlfcmVhZGxpbmsocmVxLCBMSU5LX1RBUkdFVCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRfc3RhdGZzKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubylcbit7XG4rXHRzdHJ1Y3Qgc3RhdHZmcyBzZnM7XG4rXG4rXHQodm9pZClpbm87XG4rXHRnX2RzLnN0YXRmc3Nfc2VlbisrO1xuK1x0aWYgKHJlZnVzZV9ub3coUkVGVVNFX1NUQVRGUykpIHtcbitcdFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRtZW1zZXQoXHUwMDI2c2ZzLCAwLCBzaXplb2Yoc2ZzKSk7XG4rXHRzZnMuZl9ic2l6ZSA9IDUxMjtcbitcdHNmcy5mX2Zyc2l6ZSA9IDUxMjtcbitcdHNmcy5mX25hbWVtYXggPSBOQU1FX01BWDtcbitcdGZ1c2VfcmVwbHlfc3RhdGZzKHJlcSwgXHUwMDI2c2ZzKTtcbit9XG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBmdXNlX2xvd2xldmVsX29wcyBmc19vcHMgPSB7XG4rXHQubG9va3VwXHRcdD0gdF9sb29rdXAsXG4rXHQuZ2V0YXR0clx0PSB0X2dldGF0dHIsXG4rXHQuc2V0YXR0clx0PSB0X3NldGF0dHIsXG4rXHQucmVhZGxpbmtcdD0gdF9yZWFkbGluayxcbitcdC5zdGF0ZnNcdFx0PSB0X3N0YXRmcyxcbitcdC5vcGVuXHRcdD0gdF9vcGVuLFxuK1x0LnJlYWRcdFx0PSB0X3JlYWQsXG4rfTtcbitcbitzdGF0aWMgdm9pZCAqcnVuX2RhZW1vbih2b2lkICphcmcpXG4re1xuK1x0ZnVzZV9zZXNzaW9uX2xvb3AoKHN0cnVjdCBmdXNlX3Nlc3Npb24gKilhcmcpO1xuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuKy8qIC0tLS0ga3NlbGZ0ZXN0IGhhcm5lc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4rXG4rRklYVFVSRShvcGVuX2VzdGFsZSkge1xuK1x0c3RydWN0IGZ1c2Vfc2Vzc2lvbiAqc2U7XG4rXHRjaGFyICAgICAgICAgICAgICAgICBtb3VudHBvaW50W1BBVEhfTUFYXTtcbitcdGNoYXIgICAgICAgICAgICAgICAgIGZpbGVfcGF0aFtQQVRIX01BWF07XG4rXHRjaGFyICAgICAgICAgICAgICAgICBsaW5rX3BhdGhbUEFUSF9NQVhdO1xuK1x0Y2hhciAgICAgICAgICAgICAgICAgYWJzZW50X3BhdGhbUEFUSF9NQVhdO1xuK1x0cHRocmVhZF90ICAgICAgICAgICAgdGhyZWFkO1xuK307XG4rXG4rRklYVFVSRV9TRVRVUChvcGVuX2VzdGFsZSlcbit7XG4rXHRjaGFyICpmdXNlX2FyZ3ZbXSA9IHsgXCJmdXNlX2VzdGFsZV90ZXN0XCIsIE5VTEwgfTtcbitcdHN0cnVjdCBmdXNlX2FyZ3MgYXJncyA9IEZVU0VfQVJHU19JTklUKDEsIGZ1c2VfYXJndik7XG4rXG4rXHRtZW1zZXQoXHUwMDI2Z19kcywgMCwgc2l6ZW9mKGdfZHMpKTtcbitcdGdfZHMud2hhdCA9IFJFRlVTRV9OT1RISU5HO1xuK1x0Z19kcy5yZWZ1c2Fsc19sZWZ0ID0gMTtcbitcbitcdHN0cmNweShzZWxmLVx1MDAzZW1vdW50cG9pbnQsIFwiL3RtcC9vcGVuX2VzdGFsZV90ZXN0X1hYWFhYWFwiKTtcbitcdGlmICghbWtkdGVtcChzZWxmLVx1MDAzZW1vdW50cG9pbnQpKVxuK1x0XHRTS0lQKHJldHVybiwgXCJta2R0ZW1wOiAlc1wiLCBzdHJlcnJvcihlcnJubykpO1xuK1xuK1x0c25wcmludGYoc2VsZi1cdTAwM2VmaWxlX3BhdGgsIHNpemVvZihzZWxmLVx1MDAzZWZpbGVfcGF0aCksXG4rXHRcdCBcIiVzL1wiIEZJTEVfTkFNRSwgc2VsZi1cdTAwM2Vtb3VudHBvaW50KTtcbitcdHNucHJpbnRmKHNlbGYtXHUwMDNlbGlua19wYXRoLCBzaXplb2Yoc2VsZi1cdTAwM2VsaW5rX3BhdGgpLFxuK1x0XHQgXCIlcy9cIiBMSU5LX05BTUUsIHNlbGYtXHUwMDNlbW91bnRwb2ludCk7XG4rXHRzbnByaW50ZihzZWxmLVx1MDAzZWFic2VudF9wYXRoLCBzaXplb2Yoc2VsZi1cdTAwM2VhYnNlbnRfcGF0aCksXG4rXHRcdCBcIiVzL1wiIEFCU0VOVF9OQU1FLCBzZWxmLVx1MDAzZW1vdW50cG9pbnQpO1xuK1xuK1x0c2VsZi1cdTAwM2VzZSA9IGZ1c2Vfc2Vzc2lvbl9uZXcoXHUwMDI2YXJncywgXHUwMDI2ZnNfb3BzLCBzaXplb2YoZnNfb3BzKSwgTlVMTCk7XG4rXHRpZiAoIXNlbGYtXHUwMDNlc2UpIHtcbitcdFx0cm1kaXIoc2VsZi1cdTAwM2Vtb3VudHBvaW50KTtcbitcdFx0U0tJUChyZXR1cm4sIFwiZnVzZV9zZXNzaW9uX25ldyBmYWlsZWRcIik7XG4rXHR9XG4rXG4rXHRpZiAoZnVzZV9zZXNzaW9uX21vdW50KHNlbGYtXHUwMDNlc2UsIHNlbGYtXHUwMDNlbW91bnRwb2ludCkpIHtcbitcdFx0ZnVzZV9zZXNzaW9uX2Rlc3Ryb3koc2VsZi1cdTAwM2VzZSk7XG4rXHRcdHJtZGlyKHNlbGYtXHUwMDNlbW91bnRwb2ludCk7XG4rXHRcdFNLSVAocmV0dXJuLCBcImZ1c2Vfc2Vzc2lvbl9tb3VudCBmYWlsZWQgKG5vIGZ1c2VybW91bnQzIG9yIG5vIHByaXZpbGVnZXMpXCIpO1xuK1x0fVxuK1xuK1x0aWYgKHB0aHJlYWRfY3JlYXRlKFx1MDAyNnNlbGYtXHUwMDNldGhyZWFkLCBOVUxMLCBydW5fZGFlbW9uLCBzZWxmLVx1MDAzZXNlKSkge1xuK1x0XHRmdXNlX3Nlc3Npb25fdW5tb3VudChzZWxmLVx1MDAzZXNlKTtcbitcdFx0ZnVzZV9zZXNzaW9uX2Rlc3Ryb3koc2VsZi1cdTAwM2VzZSk7XG4rXHRcdHJtZGlyKHNlbGYtXHUwMDNlbW91bnRwb2ludCk7XG4rXHRcdFNLSVAocmV0dXJuLCBcInB0aHJlYWRfY3JlYXRlOiAlc1wiLCBzdHJlcnJvcihlcnJubykpO1xuK1x0fVxuK1xuK1x0ZnVzZV9vcHRfZnJlZV9hcmdzKFx1MDAyNmFyZ3MpO1xuK31cbitcbitGSVhUVVJFX1RFQVJET1dOKG9wZW5fZXN0YWxlKVxuK3tcbitcdGZ1c2Vfc2Vzc2lvbl9leGl0KHNlbGYtXHUwMDNlc2UpO1xuK1x0ZnVzZV9zZXNzaW9uX3VubW91bnQoc2VsZi1cdTAwM2VzZSk7XG4rXHRwdGhyZWFkX2pvaW4oc2VsZi1cdTAwM2V0aHJlYWQsIE5VTEwpO1xuK1x0ZnVzZV9zZXNzaW9uX2Rlc3Ryb3koc2VsZi1cdTAwM2VzZSk7XG4rXHRybWRpcihzZWxmLVx1MDAzZW1vdW50cG9pbnQpO1xuK31cbitcbitURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfb3Blbl9pc19yZXRyaWVkKVxuK3tcbitcdGludCBmZDtcbitcbitcdGdfZHMud2hhdCA9IFJFRlVTRV9PUEVOO1xuK1xuK1x0ZmQgPSBvcGVuKHNlbGYtXHUwMDNlZmlsZV9wYXRoLCBPX1JET05MWSk7XG4rXG4rXHQvKlxuK1x0ICogVGhlIHJlZnVzYWwgZGVzY3JpYmVzIGEgaGFuZGxlIHRoZSBzZXJ2ZXIgc2hvdWxkIGhhdmUgaG9ub3VyZWQsIHNvXG4rXHQgKiB0aGUgd2FsayBpcyBlbnRpdGxlZCB0byByZXNvbHZlIHRoZSBuYW1lIGFnYWluIGFuZCBvcGVuIHdoYXQgaXRcbitcdCAqIHJlZmVycyB0byBub3cuIFJlcG9ydGluZyB0aGUgZmlsZSBtaXNzaW5nIGluc3RlYWQgZW5kcyB0aGUgd2Fsay5cbitcdCAqL1xuK1x0QVNTRVJUX0dFKGZkLCAwKSB7XG4rXHRcdFRIX0xPRyhcIm9wZW4gZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgb3BlbiByZXF1ZXN0KHMpXCIsXG4rXHRcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMub3BlbnNfc2Vlbik7XG4rXHR9XG4rXHRFWFBFQ1RfRVEoMiwgZ19kcy5vcGVuc19zZWVuKTtcbitcdGNsb3NlKGZkKTtcbit9XG4rXG4rVEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX2dldGF0dHJfb25fcGF0aF9pc19yZXRyaWVkKVxuK3tcbitcdHN0cnVjdCBzdGF0IHN0O1xuK1xuK1x0Z19kcy53aGF0ID0gUkVGVVNFX0dFVEFUVFI7XG4rXG4rXHQvKlxuK1x0ICogUmVhY2hlZCBieSBuYW1lLCBzbyB0aGUgd2FsayBjYW4gcmVzb2x2ZSBpdCBhZ2FpbiBhbmQgYXNrIGEgc2Vjb25kXG4rXHQgKiB0aW1lLCB0aGUgc2FtZSByZWNvdmVyeSB0aGUgb3BlbiBnZXRzLlxuK1x0ICovXG4rXHRBU1NFUlRfRVEoMCwgc3RhdChzZWxmLVx1MDAzZWZpbGVfcGF0aCwgXHUwMDI2c3QpKSB7XG4rXHRcdFRIX0xPRyhcInN0YXQgZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgZ2V0YXR0ciByZXF1ZXN0KHMpXCIsXG4rXHRcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMuZ2V0YXR0cnNfc2Vlbik7XG4rXHR9XG4rXHRFWFBFQ1RfR1QoZ19kcy5nZXRhdHRyc19zZWVuLCAxKTtcbit9XG4rXG4rVEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX3NldGF0dHJfb25fcGF0aF9pc19yZXRyaWVkKVxuK3tcbitcdGdfZHMud2hhdCA9IFJFRlVTRV9TRVRBVFRSO1xuK1xuK1x0LypcbitcdCAqIGNobW9kKCkgcmVhY2hlcyB0aGUgaW5vZGUgYnkgbmFtZSwgc28gdGhlIHNhbWUgcmV0cnkgYXBwbGllczogdGhlXG4rXHQgKiByZWZ1c2FsIGRlc2NyaWJlcyBhIGhhbmRsZSBhbmQgdGhlIHdhbGsgbWF5IHJlc29sdmUgdGhlIG5hbWUgYWdhaW4uXG4rXHQgKi9cbitcdEFTU0VSVF9FUSgwLCBjaG1vZChzZWxmLVx1MDAzZWZpbGVfcGF0aCwgMDYwMCkpIHtcbitcdFx0VEhfTE9HKFwiY2htb2QgZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgc2V0YXR0ciByZXF1ZXN0KHMpXCIsXG4rXHRcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMuc2V0YXR0cnNfc2Vlbik7XG4rXHR9XG4rXHRFWFBFQ1RfR1QoZ19kcy5zZXRhdHRyc19zZWVuLCAxKTtcbit9XG4rXG4rVEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX3JlYWRsaW5rX29uX3BhdGhfaXNfcmV0cmllZClcbit7XG4rXHRjaGFyIGJ1ZltQQVRIX01BWF07XG4rXHRzc2l6ZV90IG47XG4rXG4rXHRnX2RzLndoYXQgPSBSRUZVU0VfUkVBRExJTks7XG4rXG4rXHRuID0gcmVhZGxpbmsoc2VsZi1cdTAwM2VsaW5rX3BhdGgsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKTtcbitcdEFTU0VSVF9HRShuLCAwKSB7XG4rXHRcdFRIX0xPRyhcInJlYWRsaW5rIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHJlYWRsaW5rIHJlcXVlc3QocylcIixcbitcdFx0ICAgICAgIHN0cmVycm9yKGVycm5vKSwgZ19kcy5yZWFkbGlua3Nfc2Vlbik7XG4rXHR9XG4rXHRidWZbbl0gPSAnXFwwJztcbitcdEVYUEVDVF9TVFJFUShMSU5LX1RBUkdFVCwgYnVmKTtcbitcdEVYUEVDVF9HVChnX2RzLnJlYWRsaW5rc19zZWVuLCAxKTtcbit9XG4rXG4rVEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX3N0YXRmc19vbl9wYXRoX2lzX3JldHJpZWQpXG4re1xuK1x0c3RydWN0IHN0YXRmcyBzZnM7XG4rXG4rXHRnX2RzLndoYXQgPSBSRUZVU0VfU1RBVEZTO1xuK1xuK1x0LypcbitcdCAqIHN0YXRmcygpIGRlc2NyaWJlcyB0aGUgbW91bnQgcmF0aGVyIHRoYW4gdGhlIGZpbGUsIGJ1dCBpdCBpcyBzdGlsbFxuK1x0ICogcmVhY2hlZCB0aHJvdWdoIGEgcGF0aCB3YWxrLCBzbyBhIHJlZnVzYWwgdGhhdCBuYW1lcyBhIGhhbmRsZSBpc1xuK1x0ICogcmV0cmllZCB0aGUgc2FtZSB3YXkuXG4rXHQgKi9cbitcdEFTU0VSVF9FUSgwLCBzdGF0ZnMoc2VsZi1cdTAwM2VmaWxlX3BhdGgsIFx1MDAyNnNmcykpIHtcbitcdFx0VEhfTE9HKFwic3RhdGZzIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHN0YXRmcyByZXF1ZXN0KHMpXCIsXG4rXHRcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMuc3RhdGZzc19zZWVuKTtcbitcdH1cbitcdEVYUEVDVF9HVChnX2RzLnN0YXRmc3Nfc2VlbiwgMSk7XG4rfVxuK1xuK1RFU1RfRihvcGVuX2VzdGFsZSwgYWJzZW50X25hbWVfc3RpbGxfcmVwb3J0c19hYnNlbnQpXG4re1xuK1x0aW50IGZkO1xuK1xuK1x0LypcbitcdCAqIEhlcmUgaXQgaXMgdGhlIGxvb2t1cCB0aGF0IGZhaWxzIHJhdGhlciB0aGFuIHRoZSBvcGVuLCBzbyBub3RoaW5nIGlzXG4rXHQgKiBiZWluZyBkZXNjcmliZWQgYXMgc3RhbGUgYW5kIHRoZSBjYWxsZXIgbXVzdCBzdGlsbCBiZSB0b2xkIHRoZSBuYW1lXG4rXHQgKiBpcyBub3QgdGhlcmUuXG4rXHQgKi9cbitcdGZkID0gb3BlbihzZWxmLVx1MDAzZWFic2VudF9wYXRoLCBPX1JET05MWSk7XG4rXHRBU1NFUlRfTFQoZmQsIDApO1xuK1x0RVhQRUNUX0VRKEVOT0VOVCwgZXJybm8pO1xuK31cbitcbitURVNUX0hBUk5FU1NfTUFJTlxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMDA6MDc6MjQuNjIwNDk5Mjg0WiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxODQ1MTEyODI4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5c2lzIG9mIHRoZSBGVVNFIFBhdGNoIFNlcmllcyBhbmQgS01TQU4gRnV6emluZyBOZWVkcyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gVGhlIG9iamVjdGl2ZSBpcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBGVVNFIHBhdGNoIHNlcmllcyB3YXJyYW50cyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IGl0IHByb2JhYmx5IGRvZXNuJ3QsIGJ1dCBsZXQncyBjb25maXJtLlxuXG5UaGUgcGF0Y2ggZm9jdXNlcyBvbiBlcnJvciBjb2RlIHRyYW5zbGF0aW9uIHdpdGhpbiB0aGUgRlVTRSBzdWJzeXN0ZW0uIFNwZWNpZmljYWxseSwgaXQgY2hhbmdlcyBob3cgYC1FTk9FTlRgIGlzIGhhbmRsZWQsIHJlbWFwcGluZyBpdCB0byBgLUVTVEFMRWAgb3IgYC1FT1BFTlNUQUxFYCBpbiB2YXJpb3VzIGZ1bmN0aW9ucyAoYGZ1c2VfZG9fZ2V0YXR0cmAsIGBmdXNlX3JlYWRsaW5rX2ZvbGlvYCwgYGZ1c2VfZGlyX29wZW5gLCBgZnVzZV9kb19zZXRhdHRyYCwgYGZ1c2Vfb3BlbmAsIGBmdXNlX3N0YXRmc2AsIGFuZCBgdmlydGlvX2ZzX2ZpeHVwX3N0YWxlX2Vycm9yYCkuIFRoaXMgbW9kaWZpY2F0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhlIFZGUyByZXRyeSBtZWNoYW5pc20gKGByZXRyeV9lc3RhbGUoKWAgYW5kIGBwYXRoX29wZW5hdCgpYCkgbW9yZSBlZmZlY3RpdmUgd2hlbiBkZWFsaW5nIHdpdGggc3RhbGUgbm9kZSBJRHMuXG5cbk15IGNvbmNlcm5zIHdpdGggS01TQU4gdHlwaWNhbGx5IHJldm9sdmUgYXJvdW5kIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBpbmZvcm1hdGlvbiBsZWFrcywgYW5kIHNpbWlsYXIgdnVsbmVyYWJpbGl0aWVzLiBJIG5lZWQgdG8gYXNjZXJ0YWluIGlmIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBhbnkgb2YgdGhvc2Ugcmlza3MuXG5cbkZpcnN0LCBJIGV4YW1pbmVkIHdoZXRoZXIgdGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IG1lbW9yeSBhbGxvY2F0aW9ucy4gTm8sIGl0IGRvZXNuJ3QuIFNlY29uZCwgSSBjaGVja2VkIGlmIHRoZSBwYXRjaCBpcyBpbnZvbHZlZCBpbiBhbnkgY29weSB0byB1c2VyIHNwYWNlLCBjb3B5IGZyb20gdW5pbml0aWFsaXplZCBkYXRhIHRvIHRoZSBrZXJuZWwgb3IgdXNlciBidWZmZXJzLiBUaGVyZSdzIG5vIGludm9sdmVtZW50LiBUaGlyZCwgSSBpbnNwZWN0ZWQgaWYgdGhlcmUgaXMgYW55IHN0cnVjdHVyZSBwYWRkaW5nIG1vZGlmaWNhdGlvbiBvciBjb250cm9sIGZsb3cgbW9kaWZpY2F0aW9ucyB3aGljaCBjb3VsZCBhbGxvdyByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGVyZSdzIG5vIHN1Y2ggbW9kaWZpY2F0aW9uLiBUaGUgY29yZSBjaGFuZ2UgaXMgc2ltcGx5IHJlbWFwcGluZyBpbnRlZ2VyIGVycm9yIHJldHVybiBjb2Rlcy5cblxuVG8gYmUgYWJzb2x1dGVseSBzdXJlLCBJJ2xsIGdvIHRocm91Z2ggdGhlIHN0YW5kYXJkIEtNU0FOIHJpc2sgYXJlYXMgYWdhaW46XG5cbjEuICAqKktlcm5lbCBzdHJ1Y3R1cmVzIHRvIHVzZXJzcGFjZSoqOiBObyBuZXcga2VybmVsIHN0cnVjdHVyZXMgYXJlIGJlaW5nIHNlbnQgdG8gdXNlciBzcGFjZSB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcyBvciBwYWRkaW5nIG1pZ2h0IGJlIGFuIGlzc3VlLlxuMi4gICoqQ29uZGl0aW9uYWwgbG9naWMgYmFzZWQgb24gdW5pbml0aWFsaXplZCBkYXRhKio6IFRoZXJlJ3Mgbm8gYnJhbmNoaW5nIG9yIGNvbmRpdGlvbmFsIGxvZ2ljIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy5cbjMuICAqKkNvbXBsZXggZGF0YSBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb24qKjogTm8gbmV3IGFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQgbGF0ZXIuXG40LiAgKipCb3VuZHMgY2hlY2tzIGFuZCBidWZmZXIgbWFuaXB1bGF0aW9ucyoqOiBUaGVyZSBhcmUgbm8gbW9kaWZpY2F0aW9ucyB0byBib3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyB0aGF0IHdvdWxkIGFsbG93IHJlYWRpbmcgdW5pbml0aWFsaXplZCBieXRlcyBmcm9tIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cbkluIHNob3J0LCB0aGlzIGlzIHByaW1hcmlseSBhIHJlbWFwcGluZyBvZiBlcnJvciBjb2RlcyB0byBlbnN1cmUgdGhlIFZGUyBwcm9wZXJseSByZXRyaWVzIHN0YWxlIGlub2Rlcy4gS01TQU4gZGV0ZWN0cyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gVGhpcyBwYXRjaCBkb2Vzbid0IGludHJvZHVjZSBhbnkgbmV3IG1lbW9yeSBhbGxvY2F0aW9ucywgY29weSBvcGVyYXRpb25zLCBidWZmZXIgbWFuaXB1bGF0aW9ucywgb3IgaW5mb3JtYXRpb24gbGVha3MuIFN0YW5kYXJkIEtBU0FOL3N5emthbGxlciBmdXp6aW5nIHNob3VsZCBiZSBzdWZmaWNpZW50IHRvIGV4ZXJjaXNlIHRoZSBGVVNFIGZpbGVzeXN0ZW0gYmVoYXZpb3IgYW5kIGVycm9yLWhhbmRsaW5nIHBhdGhzIGNvdmVyZWQgYnkgdGhpcyBwYXRjaC4gQSBkZWRpY2F0ZWQgS01TQU4gcnVuIGlzbid0IG5lY2Vzc2FyeSBoZXJlLlxuXG5Pa2F5LCBJJ20gY29uZmlkZW50IGluIHRoYXQgY29uY2x1c2lvbi4gTGV0J3MgY2FsbCB0aGUgYHNldC1yZXN1bHRzYCB0b29sIGFuZCBtYXJrIHRoaXMgYXMgbm90IHJlcXVpcmluZyBLTVNBTi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAxMjksIk91dHB1dFRva2VucyI6MTk1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTI0MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDAwOjA3OjQ2LjQ2NTYxNDg5MloiLCJTZXEiOjI0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5NTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggc2VyaWVzIG1vZGlmaWVzIGVycm9yIGNvZGUgaGFuZGxpbmcgaW4gRlVTRSBhbmQgdmlydGlvLWZzIGJ5IHRyYW5zbGF0aW5nIC1FTk9FTlQgcmVzcG9uc2VzIHRvIC1FU1RBTEUgb3IgLUVPUEVOU1RBTEUgZm9yIG9wZXJhdGlvbnMgcmVmZXJlbmNpbmcgaW5vZGVzIGJ5IG5vZGVpZCAoZS5nLiwgRlVTRV9PUEVOLCBGVVNFX09QRU5ESVIsIEZVU0VfR0VUQVRUUiwgRlVTRV9TRVRBVFRSLCBGVVNFX1JFQURMSU5LLCBGVVNFX1NUQVRGUykgdG8gZW5hYmxlIFZGUyBwYXRoIGxvb2t1cCByZXRyaWVzIChyZXRyeV9lc3RhbGUpLlxcblxcblRoaXMgY2hhbmdlIHB1cmVseSBhbHRlcnMgaW50ZWdlciByZXR1cm4gdmFsdWVzL2Vycm5vIGNvZGVzIGluIGVycm9yIHBhdGhzLiBJdCBkb2VzIG5vdCBpbnRyb2R1Y2Ugb3IgbW9kaWZ5IGFueSBtZW1vcnkgYWxsb2NhdGlvbnMsIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbnMsIGJ1ZmZlciBjb3BpZXMgdG8gdXNlcnNwYWNlLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzIG9yIGluZm9ybWF0aW9uIGRpc2Nsb3N1cmUgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOIGRldGVjdGlvbi4gQW55IGNvbnRyb2wgZmxvdyBvciBmdW5jdGlvbmFsIHJlZ3Jlc3Npb24gaXNzdWVzIGFyZSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIHRlc3RpbmcgYW5kIEtBU0FOIGJ1aWxkcy5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBzZXJpZXMgbW9kaWZpZXMgZXJyb3IgY29kZSBoYW5kbGluZyBpbiBGVVNFIGFuZCB2aXJ0aW8tZnMgYnkgdHJhbnNsYXRpbmcgLUVOT0VOVCByZXNwb25zZXMgdG8gLUVTVEFMRSBvciAtRU9QRU5TVEFMRSBmb3Igb3BlcmF0aW9ucyByZWZlcmVuY2luZyBpbm9kZXMgYnkgbm9kZWlkIChlLmcuLCBGVVNFX09QRU4sIEZVU0VfT1BFTkRJUiwgRlVTRV9HRVRBVFRSLCBGVVNFX1NFVEFUVFIsIEZVU0VfUkVBRExJTkssIEZVU0VfU1RBVEZTKSB0byBlbmFibGUgVkZTIHBhdGggbG9va3VwIHJldHJpZXMgKHJldHJ5X2VzdGFsZSkuXFxuXFxuVGhpcyBjaGFuZ2UgcHVyZWx5IGFsdGVycyBpbnRlZ2VyIHJldHVybiB2YWx1ZXMvZXJybm8gY29kZXMgaW4gZXJyb3IgcGF0aHMuIEl0IGRvZXMgbm90IGludHJvZHVjZSBvciBtb2RpZnkgYW55IG1lbW9yeSBhbGxvY2F0aW9ucywgc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucywgYnVmZmVyIGNvcGllcyB0byB1c2Vyc3BhY2UsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3Mgb3IgaW5mb3JtYXRpb24gZGlzY2xvc3VyZSB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4gZGV0ZWN0aW9uLiBBbnkgY29udHJvbCBmbG93IG9yIGZ1bmN0aW9uYWwgcmVncmVzc2lvbiBpc3N1ZXMgYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQgdGVzdGluZyBhbmQgS0FTQU4gYnVpbGRzLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowp89kd[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-27 23:50:26 +0000 UTC FinishedAt: 2026-08-28 00:07:48 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "torvalds", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux", "commit_hash": "45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "FUSE_FS", "VIRTIO_FS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "torvalds", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux", "commit_hash": "45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "FUSE_FS", "VIRTIO_FS" ], "series_id": "e207d03b-7c13-4124-a8de-2147db3ad6e0" }, "track": "KASAN", "fuzz": { "focus": [ "fs", "kvm" ], "focus_symbols": [ "fuse_do_setattr", "fuse_open", "fuse_dir_open", "fuse_do_getattr", "fuse_statfs", "fuse_readlink_folio", "virtio_fs_request_complete" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDAwOjA1PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0ZVU0VfRlMmIzM0OywKICAgICYjMzQ7VklSVElPX0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7ZnVzZV9kb19zZXRhdHRyJiMzNDssCiAgICAmIzM0O2Z1c2Vfb3BlbiYjMzQ7LAogICAgJiMzNDtmdXNlX2Rpcl9vcGVuJiMzNDssCiAgICAmIzM0O2Z1c2VfZG9fZ2V0YXR0ciYjMzQ7LAogICAgJiMzNDtmdXNlX3N0YXRmcyYjMzQ7LAogICAgJiMzNDtmdXNlX3JlYWRsaW5rX2ZvbGlvJiMzNDssCiAgICAmIzM0O3ZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIG1vZGlmaWVzIGVycm9yIGNvZGUgaGFuZGxpbmcgaW4gRlVTRSBhbmQgdmlydGlvLWZzIGJ5IHRyYW5zbGF0aW5nIC1FTk9FTlQgcmVzcG9uc2VzIHRvIC1FU1RBTEUgb3IgLUVPUEVOU1RBTEUgZm9yIG9wZXJhdGlvbnMgcmVmZXJlbmNpbmcgaW5vZGVzIGJ5IG5vZGVpZCAoZS5nLiwgRlVTRV9PUEVOLCBGVVNFX09QRU5ESVIsIEZVU0VfR0VUQVRUUiwgRlVTRV9TRVRBVFRSLCBGVVNFX1JFQURMSU5LLCBGVVNFX1NUQVRGUykgdG8gZW5hYmxlIFZGUyBwYXRoIGxvb2t1cCByZXRyaWVzIChyZXRyeV9lc3RhbGUpLlxuXG5UaGlzIGNoYW5nZSBwdXJlbHkgYWx0ZXJzIGludGVnZXIgcmV0dXJuIHZhbHVlcy9lcnJubyBjb2RlcyBpbiBlcnJvciBwYXRocy4gSXQgZG9lcyBub3QgaW50cm9kdWNlIG9yIG1vZGlmeSBhbnkgbWVtb3J5IGFsbG9jYXRpb25zLCBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLCBidWZmZXIgY29waWVzIHRvIHVzZXJzcGFjZSwgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2VzcyBvciBpbmZvcm1hdGlvbiBkaXNjbG9zdXJlIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBkZXRlY3Rpb24uIEFueSBjb250cm9sIGZsb3cgb3IgZnVuY3Rpb25hbCByZWdyZXNzaW9uIGlzc3VlcyBhcmUgY292ZXJlZCBieSBzdGFuZGFyZCB0ZXN0aW5nIGFuZCBLQVNBTiBidWlsZHMuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHVwZGF0ZXMgZXJyb3IgaGFuZGxpbmcgZm9yIGxpdmUgbm9kZSBJRHMgaW4gRlVTRSBhbmQgdmlydGlvLWZzIHdoZW4gdGhlIHVzZXIvaG9zdCBzZXJ2ZXIgcmV0dXJucyAtRU5PRU5ULCB0cmFuc2xhdGluZyBpdCB0byAtRVNUQUxFIG9yIC1FT1BFTlNUQUxFIHRvIHRyaWdnZXIgVkZTIHBhdGggbG9va3VwIHJldHJpZXMgKExPT0tVUF9SRVZBTCkuIFRoZXNlIGZ1bmN0aW9uYWwgY2hhbmdlcyBpbXBhY3QgY29yZSBmaWxlIG9wZXJhdGlvbnMgKG9wZW4sIGdldGF0dHIsIHNldGF0dHIsIHJlYWRsaW5rLCBzdGF0ZnMpIGluIEZVU0UgYW5kIHZpcnRpby1mcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAwMDowNTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGI0Y2NhMzRiNmZlZTk0ODYzYjFiZTIwMzkyMDkzOGUxZjRhZjliZTRcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIEF1ZyAyOCAwMDowNTozMCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9mdXNlL2Rpci5jIGIvZnMvZnVzZS9kaXIuY1xuaW5kZXggZTQ5YjRlODc0YjE1Zi4uMjE3YTAzOTk5MDUwNyAxMDA2NDRcbi0tLSBhL2ZzL2Z1c2UvZGlyLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2Z1c2UvZGlyLmNcbkBAIC0xNTMyLDYgJiM0MzsxNTMyLDggQEAgc3RhdGljIGludCBmdXNlX2RvX2dldGF0dHIoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gXHRcdFx0aWYgKHN0YXQpXG4gXHRcdFx0XHRmdXNlX2ZpbGxhdHRyKGlkbWFwLCBpbm9kZSwgXHUwMDI2b3V0YXJnLmF0dHIsIHN0YXQpO1xuIFx0XHR9XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdGVyciA9IGZ1c2Vfc3RhbGVfaW5vZGVfZXJyKGVycik7XG4gXHR9XG4gXHRyZXR1cm4gZXJyO1xuIH1cbkBAIC0xODQ4LDYgJiM0MzsxODUwLDcgQEAgc3RhdGljIGludCBmdXNlX3JlYWRsaW5rX2ZvbGlvKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXG4gXHRmdXNlX2ludmFsaWRhdGVfYXRpbWUoaW5vZGUpO1xuIFxuJiM0MztcdHJlcyA9IGZ1c2Vfc3RhbGVfaW5vZGVfZXJyKHJlcyk7XG4gXHRpZiAocmVzIFx1MDAzYyAwKVxuIFx0XHRyZXR1cm4gcmVzO1xuIFxuQEAgLTE5MTAsNiAmIzQzOzE5MTMsMTIgQEAgc3RhdGljIGludCBmdXNlX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxuIFx0XHRyZXR1cm4gZXJyO1xuIFxuIFx0ZXJyID0gZnVzZV9kb19vcGVuKGZtLCBnZXRfbm9kZV9pZChpbm9kZSksIGZpbGUsIHRydWUpO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQXMgaW4gZnVzZV9vcGVuX2NvbW1vbigpOiBhIHBhdGggd2FsayBzdGFuZHMgYmVoaW5kIHRoaXMgb3BlbixcbiYjNDM7XHQgKiBzbyB0aGUgcmVmdXNhbCBpcyBFT1BFTlNUQUxFIGZvciBwYXRoX29wZW5hdCgpIHRvIGFuc3dlci5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoZXJyID09IC1FTk9FTlQpXG4mIzQzO1x0XHRlcnIgPSAtRU9QRU5TVEFMRTtcbiBcdGlmICghZXJyKSB7XG4gXHRcdHN0cnVjdCBmdXNlX2ZpbGUgKmZmID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4gXG5AQCAtMjI0OSw2ICYjNDM7MjI1OCw3IEBAIGludCBmdXNlX2RvX3NldGF0dHIoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSxcbiBcdGlmIChlcnIpIHtcbiBcdFx0aWYgKGVyciA9PSAtRUlOVFIpXG4gXHRcdFx0ZnVzZV9pbnZhbGlkYXRlX2F0dHIoaW5vZGUpO1xuJiM0MztcdFx0ZXJyID0gZnVzZV9zdGFsZV9pbm9kZV9lcnIoZXJyKTtcbiBcdFx0Z290byBlcnJvcjtcbiBcdH1cbiBcbmRpZmYgLS1naXQgYS9mcy9mdXNlL2ZpbGUuYyBiL2ZzL2Z1c2UvZmlsZS5jXG5pbmRleCA4ZDYxMzVhNjEwOGE0Li4zMDhiMTVjMzBmMzRkIDEwMDY0NFxuLS0tIGEvZnMvZnVzZS9maWxlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2Z1c2UvZmlsZS5jXG5AQCAtMjc5LDYgJiM0MzsyNzksMTcgQEAgc3RhdGljIGludCBmdXNlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG4gXHRcdGZ1c2Vfc2V0X25vd3JpdGUoaW5vZGUpO1xuIFxuIFx0ZXJyID0gZnVzZV9kb19vcGVuKGZtLCBnZXRfbm9kZV9pZChpbm9kZSksIGZpbGUsIGZhbHNlKTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoaXMgb3BlbiByZWFjaGVkIHRoZSBzZXJ2ZXIgdGhyb3VnaCBhIHBhdGggd2Fsaywgc28gYSByZWZ1c2FsXG4mIzQzO1x0ICogZm9yIHRoZSBsaXZlIG5vZGVpZCBpcyByZXBvcnRlZCBhcyBFT1BFTlNUQUxFIHJhdGhlciB0aGFuIHRoZVxuJiM0MztcdCAqIEVTVEFMRSB0aGUgbm9kZWlkLW9ubHkgcmVxdWVzdHMgc2F5OiBwYXRoX29wZW5hdCgpIHBpY2tzIHRoZVxuJiM0MztcdCAqIGNoZWFwZXN0IHJldHJ5IGZvciB0aGUgd2FsayBpbiBwcm9ncmVzcywgRUNISUxEIHVuZGVyIExPT0tVUF9SQ1VcbiYjNDM7XHQgKiBhbmQgRVNUQUxFIG90aGVyd2lzZS4gZnVzZV9maWxlX29wZW4oKSBpcyBsZWZ0IGFsb25lIGJlY2F1c2VcbiYjNDM7XHQgKiBmdXNlX3ByaXZfaW9jdGxfcHJlcGFyZSgpIHJlYWNoZXMgaXQgdG8gc2VydmUgRlNfSU9DX0dFVEZMQUdTLFxuJiM0MztcdCAqIHdpdGggbm8gb3BlbiBiZWhpbmQgaXQgdG8gdHJhbnNsYXRlIHRoZSBpbnRlcm5hbCBlcnJuby5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoZXJyID09IC1FTk9FTlQpXG4mIzQzO1x0XHRlcnIgPSAtRU9QRU5TVEFMRTtcbiBcdGlmICghZXJyKSB7XG4gXHRcdGZmID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4gXHRcdGVyciA9IGZ1c2VfZmluaXNoX29wZW4oaW5vZGUsIGZpbGUpO1xuZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZnVzZV9pLmggYi9mcy9mdXNlL2Z1c2VfaS5oXG5pbmRleCBjOGQ0YzVmM2FmN2U4Li5lNmIyNTk3ZDZkZDZmIDEwMDY0NFxuLS0tIGEvZnMvZnVzZS9mdXNlX2kuaFxuJiM0MzsmIzQzOyYjNDM7IGIvZnMvZnVzZS9mdXNlX2kuaFxuQEAgLTEyNTAsNiAmIzQzOzEyNTAsMjUgQEAgdm9pZCBmdXNlX2lub2RlX3VuY2FjaGVkX2lvX2VuZChzdHJ1Y3QgZnVzZV9pbm9kZSAqZmkpO1xuIGludCBmdXNlX2ZpbGVfaW9fb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGlub2RlICppbm9kZSk7XG4gdm9pZCBmdXNlX2ZpbGVfaW9fcmVsZWFzZShzdHJ1Y3QgZnVzZV9maWxlICpmZiwgc3RydWN0IGlub2RlICppbm9kZSk7XG4gXG4mIzQzOy8qXG4mIzQzOyAqIFJlcG9ydCBhIHJlcXVlc3QgcmVmdXNlZCBmb3IgYSBsaXZlIG5vZGVpZCBhcyBzdGFsZS5cbiYjNDM7ICpcbiYjNDM7ICogQSByZXF1ZXN0IHRoYXQgbmFtZXMgYSBub2RlaWQgYW5kIG5vdGhpbmcgZWxzZSBpcyBvbmx5IHNlbnQgZm9yIGFuXG4mIzQzOyAqIGlub2RlIHRoZSBjbGllbnQgaGFzIGxvb2tlZCB1cCBhbmQgaG9sZHMgYSByZWZlcmVuY2UgdG8sIGFuZCB0aGVcbiYjNDM7ICogc2VydmVyIG93ZXMgdGhlIGNsaWVudCB0aGF0IGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuXG4mIzQzOyAqIEVOT0VOVCBmcm9tIHRoZSBzZXJ2ZXIgZGVzY3JpYmVzIHRoZSBpbm9kZSBpdHNlbGYgcmF0aGVyIHRoYW4gYSBuYW1lXG4mIzQzOyAqIHRoYXQgaGFzIGdvbmUgYXdheS4gUmVwb3J0IHRoZSBoYW5kbGUgYXMgc3RhbGUsIHdoaWNoIHRoZSBjYWxsZXJcbiYjNDM7ICogYW5zd2VycyBieSByZXNvbHZpbmcgdGhlIG5hbWUgYWdhaW4gdW5kZXIgTE9PS1VQX1JFVkFMIGFuZCBhY3Rpbmcgb25cbiYjNDM7ICogd2hhdGV2ZXIgaXQgcmVmZXJzIHRvIG5vdy4gQSBuYW1lIHRoYXQgcmVhbGx5IGhhcyBnb25lIGZhaWxzIHRoYXRcbiYjNDM7ICogc2Vjb25kIGxvb2t1cCBhbmQgdGhlIGNhbGxlciBzdGlsbCBzZWVzIEVOT0VOVC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IGZ1c2Vfc3RhbGVfaW5vZGVfZXJyKGludCBlcnIpXG4mIzQzO3tcbiYjNDM7XHRpZiAoZXJyID09IC1FTk9FTlQpXG4mIzQzO1x0XHRyZXR1cm4gLUVTVEFMRTtcbiYjNDM7XHRyZXR1cm4gZXJyO1xuJiM0Mzt9XG4mIzQzO1xuIC8qIGZpbGUuYyAqL1xuIHN0cnVjdCBmdXNlX2ZpbGUgKmZ1c2VfZmlsZV9vcGVuKHN0cnVjdCBmdXNlX21vdW50ICpmbSwgdTY0IG5vZGVpZCxcbiBcdFx0XHRcdCB1bnNpZ25lZCBpbnQgb3Blbl9mbGFncywgYm9vbCBpc2Rpcik7XG5kaWZmIC0tZ2l0IGEvZnMvZnVzZS9pbm9kZS5jIGIvZnMvZnVzZS9pbm9kZS5jXG5pbmRleCBlOTU1MmJlMzYzN2JjLi5jZGUwYTUzMzUwODk3IDEwMDY0NFxuLS0tIGEvZnMvZnVzZS9pbm9kZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9mdXNlL2lub2RlLmNcbkBAIC02NjYsNyAmIzQzOzY2Niw3IEBAIHN0YXRpYyBpbnQgZnVzZV9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKVxuIFx0ZXJyID0gZnVzZV9zaW1wbGVfcmVxdWVzdChmbSwgXHUwMDI2YXJncyk7XG4gXHRpZiAoIWVycilcbiBcdFx0Y29udmVydF9mdXNlX3N0YXRmcyhidWYsIFx1MDAyNm91dGFyZy5zdCk7XG4tXHRyZXR1cm4gZXJyO1xuJiM0MztcdHJldHVybiBmdXNlX3N0YWxlX2lub2RlX2VycihlcnIpO1xuIH1cbiBcbiBzdGF0aWMgc3RydWN0IGZ1c2Vfc3luY19idWNrZXQgKmZ1c2Vfc3luY19idWNrZXRfYWxsb2Modm9pZClcbmRpZmYgLS1naXQgYS9mcy9mdXNlL3ZpcnRpb19mcy5jIGIvZnMvZnVzZS92aXJ0aW9fZnMuY1xuaW5kZXggZjE1ZTUxNmViY2I1Yy4uN2IwM2JmODdjMmFlOCAxMDA2NDRcbi0tLSBhL2ZzL2Z1c2UvdmlydGlvX2ZzLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2Z1c2UvdmlydGlvX2ZzLmNcbkBAIC03ODAsNiAmIzQzOzc4MCw2NiBAQCBzdGF0aWMgYm9vbCB2aXJ0aW9fZnNfdmVyaWZ5X3Jlc3BvbnNlKHN0cnVjdCBmdXNlX3JlcSAqcmVxLCB1bnNpZ25lZCBpbnQgbGVuKVxuIFx0cmV0dXJuIHRydWU7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBSZXBvcnQgYSByZXF1ZXN0IHJlZnVzZWQgZm9yIGEgbGl2ZSBub2RlaWQgYXMgc3RhbGUuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZXNlIHJlcXVlc3RzIGNhcnJ5IGEgbm9kZWlkIGFuZCBubyBuYW1lLCBzbyB0aGUgY2xpZW50IG9ubHkgc2VuZHMgdGhlbSBmb3JcbiYjNDM7ICogYW4gaW5vZGUgaXQgaGFzIGFscmVhZHkgbG9va2VkIHVwIGFuZCBob2xkcyBhIHJlZmVyZW5jZSB0bywgYW5kIGEgc2VydmVyIG93ZXNcbiYjNDM7ICogdGhlIGNsaWVudCB0aGF0IGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuIEEgc2VydmVyIGFuc3dlcmluZyB3aXRoXG4mIzQzOyAqIEVOT0VOVCBpcyBkZXNjcmliaW5nIGEgaGFuZGxlIGl0IHdhcyBvYmxpZ2VkIHRvIGhvbm91ciByYXRoZXIgdGhhbiBhIG5hbWVcbiYjNDM7ICogdGhhdCBoYXMgZ29uZSBhd2F5LCBhbmQgdGhlIGNhbGxlciBoYXMgbm8gcmVhc29uIHRvIGRvdWJ0IGl0LlxuJiM0MzsgKlxuJiM0MzsgKiBTYXlpbmcgdGhlIGhhbmRsZSBpcyBzdGFsZSBpcyBzb21ldGhpbmcgdGhlIGNhbGxlciBrbm93cyBob3cgdG8gYW5zd2VyOiBpdFxuJiM0MzsgKiByZXBlYXRzIHRoZSBsb29rdXAgdW5kZXIgTE9PS1VQX1JFVkFMIGFuZCBhY3RzIG9uIHdoYXRldmVyIHRoZSBuYW1lIHJlZmVycyB0b1xuJiM0MzsgKiBub3cuIEEgbmFtZSB0aGF0IGdlbnVpbmVseSBoYXMgZ29uZSBmYWlscyB0aGUgcmV0cmllZCBsb29rdXAsIHNvIGEgY2FsbGVyXG4mIzQzOyAqIHN0aWxsIGxlYXJucyBpdCBpcyBnb25lLiByZXRyeV9lc3RhbGUoKSBpcyB3aGF0IGRvZXMgdGhpcywgYW5kIGZzL25hbWVpLmMsXG4mIzQzOyAqIGZzL29wZW4uYywgZnMvc3RhdC5jLCBmcy9zdGF0ZnMuYywgZnMvdXRpbWVzLmMgYW5kIGZzL3hhdHRyLmMgYWxsIHJlYWNoIGl0LFxuJiM0MzsgKiB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZSBjb252ZXJzaW9uIHVzZWZ1bCByYXRoZXIgdGhhbiBhIHJlbmFtZSBvZiB0aGUgZXJyb3IuXG4mIzQzOyAqXG4mIzQzOyAqIEEgcmVxdWVzdCB0aGF0IG5hbWVzIHNvbWV0aGluZyB3aGljaCBjYW4gaXRzZWxmIGJlIGFic2VudCBpcyBsZWZ0IGFsb25lLFxuJiM0MzsgKiBiZWNhdXNlIEVOT0VOVCBpcyB0aGVuIGFtYmlndW91cyBhbmQgaXMgZnJlcXVlbnRseSB0aGUgYW5zd2VyIHRoZSBjYWxsZXJcbiYjNDM7ICogYXNrZWQgZm9yLiBGVVNFX0xPT0tVUCByZXBvcnRzIGEgbWlzc2luZyBuYW1lIGluIGEgbGl2aW5nIGRpcmVjdG9yeSBhbmQgdGhlXG4mIzQzOyAqIGRpcmVjdG9yeSBvcGVyYXRpb25zIGNhcnJ5IGEgcGFyZW50IG5vZGVpZCBiZXNpZGUgb25lLCBzbyBuZWl0aGVyIGNhbiBiZVxuJiM0MzsgKiByZWFkIGFzIGEgc3RhdGVtZW50IGFib3V0IHRoZSBpbm9kZS4gVGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSByZXF1ZXN0cyBiZWxvbmdcbiYjNDM7ICogd2l0aCB0aGVtOiB0aGV5IGNhcnJ5IGFuIGF0dHJpYnV0ZSBuYW1lLCBhbmQgd2hpbGUgYSBzZXJ2ZXIgc2hvdWxkIHJlcG9ydCBhXG4mIzQzOyAqIG1pc3NpbmcgYXR0cmlidXRlIGFzIEVOT0RBVEEsIG9uZSB0aGF0IGFuc3dlcnMgRU5PRU5UIGluc3RlYWQgd291bGQgaGF2ZSBhXG4mIzQzOyAqIGNvcnJlY3QgcmVwbHkgdHVybmVkIGludG8gYSByZXRyeSB0aGF0IGNhbm5vdCBzdWNjZWVkLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXF1ZXN0cyBhZ2FpbnN0IGFuIGFscmVhZHkgb3BlbiBkZXNjcmlwdG9yIGFyZSBhbHNvIGxlZnQgYWxvbmUsIHNpbmNlIHRoZXJlXG4mIzQzOyAqIGlzIG5vIGVxdWl2YWxlbnQgcmV0cnkgdG8gcmVhY2ggYW5kIGNvbnZlcnRpbmcgdGhlIGVycm9yIHdvdWxkIHJlbmFtZSBhXG4mIzQzOyAqIGZhaWx1cmUgcmF0aGVyIHRoYW4gcmVwYWlyIGl0LCBhbmQgRlVTRV9JT0NUTCBhbmQgRlVTRV9QT0xMIGhhbmQgdGhlXG4mIzQzOyAqIHNlcnZlciYjMzk7cyBlcnJubyB0byB1c2Vyc3BhY2UgdmVyYmF0aW0uXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfZml4dXBfc3RhbGVfZXJyb3Ioc3RydWN0IGZ1c2VfcmVxICpyZXEpXG4mIzQzO3tcbiYjNDM7XHRpZiAocmVxLVx1MDAzZW91dC5oLmVycm9yICE9IC1FTk9FTlQpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdHN3aXRjaCAocmVxLVx1MDAzZWluLmgub3Bjb2RlKSB7XG4mIzQzO1x0Y2FzZSBGVVNFX09QRU46XG4mIzQzO1x0Y2FzZSBGVVNFX09QRU5ESVI6XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogQW4gb3BlbiBzYXlzIEVPUEVOU1RBTEUsIGFuZCBwYXRoX29wZW5hdCgpIGRlY2lkZXMgd2hhdCB0aGVcbiYjNDM7XHRcdCAqIHdhbGsgaW4gcHJvZ3Jlc3Mgc2hvdWxkIG1ha2Ugb2YgaXQ6IEVDSElMRCB1bmRlciBMT09LVVBfUkNVXG4mIzQzO1x0XHQgKiBzbyBpdCBkcm9wcyB0byBSRUYtd2FsaywgRVNUQUxFIG90aGVyd2lzZSBzbyB0aGUgbmFtZSBpc1xuJiM0MztcdFx0ICogcmVzb2x2ZWQgYWdhaW4gdW5kZXIgTE9PS1VQX1JFVkFMLiBOYW1pbmcgRVNUQUxFIGhlcmUgd291bGRcbiYjNDM7XHRcdCAqIHRha2UgdGhlIHNlY29uZCBpbiBib3RoIGNhc2VzIGFuZCBza2lwIGEgY2hlYXBlciByZXRyeS5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0cmVxLVx1MDAzZW91dC5oLmVycm9yID0gLUVPUEVOU1RBTEU7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRjYXNlIEZVU0VfR0VUQVRUUjpcbiYjNDM7XHRjYXNlIEZVU0VfU0VUQVRUUjpcbiYjNDM7XHRjYXNlIEZVU0VfUkVBRExJTks6XG4mIzQzO1x0Y2FzZSBGVVNFX1NUQVRGUzpcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBOb3RoaW5nIHRyYW5zbGF0ZXMgRU9QRU5TVEFMRSBvdXRzaWRlIHRoZSBvcGVuIHBhdGgsIHNvXG4mIzQzO1x0XHQgKiB0aGVzZSBzYXkgRVNUQUxFIGRpcmVjdGx5LCB3aGljaCByZXRyeV9lc3RhbGUoKSBhbnN3ZXJzLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRyZXEtXHUwMDNlb3V0LmguZXJyb3IgPSAtRVNUQUxFO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuIC8qIFdvcmsgZnVuY3Rpb24gZm9yIHJlcXVlc3QgY29tcGxldGlvbiAqL1xuIHN0YXRpYyB2b2lkIHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlKHN0cnVjdCBmdXNlX3JlcSAqcmVxLFxuIFx0XHRcdFx0ICAgICAgIHN0cnVjdCB2aXJ0aW9fZnNfdnEgKmZzdnEpXG5AQCAtODEwLDYgJiM0Mzs4NzAsOCBAQCBzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZShzdHJ1Y3QgZnVzZV9yZXEgKnJlcSxcbiBcbiBcdGNsZWFyX2JpdChGUl9TRU5ULCBcdTAwMjZyZXEtXHUwMDNlZmxhZ3MpO1xuIFxuJiM0MztcdHZpcnRpb19mc19maXh1cF9zdGFsZV9lcnJvcihyZXEpO1xuJiM0MztcbiBcdGZ1c2VfcmVxdWVzdF9lbmQocmVxKTtcbiBcdHNwaW5fbG9jayhcdTAwMjZmc3ZxLVx1MDAzZWxvY2spO1xuIFx0ZGVjX2luX2ZsaWdodF9yZXEoZnN2cSk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uZ2l0aWdub3JlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uZ2l0aWdub3JlXG5pbmRleCBmYjUxNjAzZmU0MTk4Li45Y2IzMDQ4MTI4ZDViIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uZ2l0aWdub3JlXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlLy5naXRpZ25vcmVcbkBAIC0xLDQgJiM0MzsxLDYgQEBcbiAjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiYjNDM7ZnVzZV9hY2xfY2FjaGVfdGVzdFxuIGZ1c2VfbW50XG4mIzQzO2Z1c2VfZXN0YWxlX3Rlc3RcbiBmdXNlY3RsX3Rlc3RcbiB3cml0ZV9leHRlbmRfZW9mX3Rlc3RcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9NYWtlZmlsZVxuaW5kZXggOTVhMWVlOTQ3Y2E3Ni4uZjU2NGNiMzdiM2E1YiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvTWFrZWZpbGVcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvTWFrZWZpbGVcbkBAIC02LDExICYjNDM7NiwxMiBAQCBURVNUX0dFTl9QUk9HUyA6PSBmdXNlY3RsX3Rlc3RcbiBURVNUX0dFTl9QUk9HUyAmIzQzOz0gd3JpdGVfZXh0ZW5kX2VvZl90ZXN0XG4gVEVTVF9HRU5fRklMRVMgOj0gZnVzZV9tbnRcbiBcbi0jIGZ1c2VfYWNsX2NhY2hlX3Rlc3QgcmVxdWlyZXMgbGliZnVzZTM7IGFkZCBpdCBvbmx5IHdoZW4gdGhlIGxpYnJhcnkgaXMgcHJlc2VudC5cbi1BQ0xfQ0ZMQUdTIDo9ICQoc2hlbGwgcGtnLWNvbmZpZyBmdXNlMyAtLWNmbGFncyAyXHUwMDNlL2Rldi9udWxsKVxuLUFDTF9MRExJQlMgOj0gJChzaGVsbCBwa2ctY29uZmlnIGZ1c2UzIC0tbGlicyAyXHUwMDNlL2Rldi9udWxsKVxuLWlmbmVxICgkKEFDTF9DRkxBR1MpLClcbiYjNDM7IyBUaGVzZSB0ZXN0cyByZXF1aXJlIGxpYmZ1c2UzOyBhZGQgdGhlbSBvbmx5IHdoZW4gdGhlIGxpYnJhcnkgaXMgcHJlc2VudC5cbiYjNDM7RlVTRTNfQ0ZMQUdTIDo9ICQoc2hlbGwgcGtnLWNvbmZpZyBmdXNlMyAtLWNmbGFncyAyXHUwMDNlL2Rldi9udWxsKVxuJiM0MztGVVNFM19MRExJQlMgOj0gJChzaGVsbCBwa2ctY29uZmlnIGZ1c2UzIC0tbGlicyAyXHUwMDNlL2Rldi9udWxsKVxuJiM0MztpZm5lcSAoJChGVVNFM19DRkxBR1MpLClcbiBURVNUX0dFTl9QUk9HUyAmIzQzOz0gZnVzZV9hY2xfY2FjaGVfdGVzdFxuJiM0MztURVNUX0dFTl9QUk9HUyAmIzQzOz0gZnVzZV9lc3RhbGVfdGVzdFxuIGVuZGlmXG4gXG4gaW5jbHVkZSAuLi8uLi9saWIubWtcbkBAIC0zMCw1ICYjNDM7MzEsOCBAQCBlbmRpZlxuICQoT1VUUFVUKS9mdXNlX21udDogQ0ZMQUdTICYjNDM7PSAkKFZBUl9DRkxBR1MpXG4gJChPVVRQVVQpL2Z1c2VfbW50OiBMRExJQlMgJiM0Mzs9ICQoVkFSX0xETElCUylcbiBcbi0kKE9VVFBVVCkvZnVzZV9hY2xfY2FjaGVfdGVzdDogQ0ZMQUdTICYjNDM7PSAkKEFDTF9DRkxBR1MpXG4tJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IExETElCUyAmIzQzOz0gJChBQ0xfTERMSUJTKVxuJiM0MzskKE9VVFBVVCkvZnVzZV9hY2xfY2FjaGVfdGVzdDogQ0ZMQUdTICYjNDM7PSAkKEZVU0UzX0NGTEFHUylcbiYjNDM7JChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IExETElCUyAmIzQzOz0gJChGVVNFM19MRExJQlMpXG4mIzQzO1xuJiM0MzskKE9VVFBVVCkvZnVzZV9lc3RhbGVfdGVzdDogQ0ZMQUdTICYjNDM7PSAkKEZVU0UzX0NGTEFHUylcbiYjNDM7JChPVVRQVVQpL2Z1c2VfZXN0YWxlX3Rlc3Q6IExETElCUyAmIzQzOz0gJChGVVNFM19MRExJQlMpXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9mdXNlX2VzdGFsZV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL2Z1c2VfZXN0YWxlX3Rlc3QuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjgyYjg0MmQzYTVmN2Jcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvZnVzZV9lc3RhbGVfdGVzdC5jXG5AQCAtMCwwICYjNDM7MSw0NTAgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LypcbiYjNDM7ICogVGVzdDogYSByZXF1ZXN0IHJlZnVzZWQgZm9yIGFuIGlub2RlIHRoZSBjbGllbnQgc3RpbGwgaG9sZHMgYSByZWZlcmVuY2UgdG9cbiYjNDM7ICpcbiYjNDM7ICogRlVTRV9PUEVOLCBGVVNFX0dFVEFUVFIsIEZVU0VfU0VUQVRUUiwgRlVTRV9SRUFETElOSyBhbmQgRlVTRV9TVEFURlMgY2FycnkgYVxuJiM0MzsgKiBub2RlaWQgcmF0aGVyIHRoYW4gYSBwYXRoLiAgVGhlIGNsaWVudCBvbmx5IHNlbmRzIHRoZW0gZm9yIGFuIGlub2RlIGl0IGhhc1xuJiM0MzsgKiBhbHJlYWR5IGxvb2tlZCB1cCBhbmQgaG9sZHMgYSByZWZlcmVuY2UgdG8sIGFuZCBhIHNlcnZlciBvd2VzIHRoZSBjbGllbnQgdGhhdFxuJiM0MzsgKiBpbm9kZSB1bnRpbCBpdCBpcyBzZW50IEZVU0VfRk9SR0VULiAgQSBzZXJ2ZXIgdGhhdCBsZXRzIHRoZSBpbm9kZSBnbyBlYXJseSxcbiYjNDM7ICogYXMgb25lIGJhY2tpbmcgYSBzaGFyZWQgZGlyZWN0b3J5IGRvZXMgd2hlbiB0aGUgbmFtZSBpcyByZW5hbWVkIG92ZXIsIGFuc3dlcnNcbiYjNDM7ICogd2l0aCBFTk9FTlQuXG4mIzQzOyAqXG4mIzQzOyAqIE9uIGFuIHVuZml4ZWQga2VybmVsIHRoYXQgRU5PRU5UIGlzIHBhc3NlZCBvdXQgdW5jaGFuZ2VkLiAgVGhlIHBhdGggd2FsayBoYXNcbiYjNDM7ICogbm8gcmVhc29uIHRvIGRvdWJ0IGl0IGFuZCB0aGUgY2FsbGVyIGlzIHRvbGQgYSBmaWxlIGlzIG1pc3Npbmcgd2hlbiBpdCBuZXZlclxuJiM0MzsgKiBzdG9wcGVkIGV4aXN0aW5nLiAgQ2FsbGVycyB0aGF0IHJlYWQgYSBtaXNzaW5nIGZpbGUgYXMgYW4gZW1wdHkgb25lIGFjdCBvblxuJiM0MzsgKiB0aGUgZW1wdGluZXNzLlxuJiM0MzsgKlxuJiM0MzsgKiBGaXhlZCAoZnMvZnVzZS9maWxlLmMgYW5kIGZzL2Z1c2UvZGlyLmMpOiBFTk9FTlQgYmVjb21lcyBFU1RBTEUsIHdoaWNoXG4mIzQzOyAqIGRlc2NyaWJlcyB0aGUgaGFuZGxlIHJhdGhlciB0aGFuIHRoZSBuYW1lLiAgZmlsZW5hbWVfbG9va3VwKCkgYW5kXG4mIzQzOyAqIGRvX2ZpbHBfb3BlbigpIGFscmVhZHkgcmV0cnkgd2l0aCBMT09LVVBfUkVWQUwgb24gRVNUQUxFLCBzbyB0aGUgbmFtZSBpc1xuJiM0MzsgKiByZXNvbHZlZCBhZ2FpbiBhbmQgdGhlIGlub2RlIGl0IHJlZmVycyB0byBub3cgaXMgdXNlZC4gIEEgbmFtZSB0aGF0IGhhc1xuJiM0MzsgKiBnZW51aW5lbHkgZ29uZSBhd2F5IGZhaWxzIHRoZSByZXRyaWVkIGxvb2t1cCwgc28gRU5PRU5UIHN0aWxsIHJlYWNoZXMgYVxuJiM0MzsgKiBjYWxsZXIgdGhhdCBkZXNlcnZlcyBpdC5cbiYjNDM7ICpcbiYjNDM7ICogT25seSByZXF1ZXN0cyByZWFjaGFibGUgdGhyb3VnaCBhIHBhdGggd2FsayBhcmUgY292ZXJlZCwgYmVjYXVzZSB0aGUgcmV0cnlcbiYjNDM7ICogaXMgd2hhdCBtYWtlcyBFU1RBTEUgdXNlZnVsIGFuZCB0aGUgd2FsayBpcyB3aGF0IHBlcmZvcm1zIGl0LiAgQW4gb3BlcmF0aW9uXG4mIzQzOyAqIG9uIGEgZGVzY3JpcHRvciBhbHJlYWR5IG9wZW4gaGFzIG5vIGVxdWl2YWxlbnQgcmVjb3ZlcnkuXG4mIzQzOyAqXG4mIzQzOyAqIFRlc3Qgb3V0bGluZTpcbiYjNDM7ICogIDEuIE1vdW50IGEgbWluaW1hbCBGVVNFIGZzIGhvbGRpbmcgb25lIGZpbGUuXG4mIzQzOyAqICAyLiBUaGUgc2VydmVyIHJlZnVzZXMgdGhlIGZpcnN0IHJlcXVlc3Qgb2YgdGhlIGtpbmQgdW5kZXIgdGVzdCBhbmQgYWxsb3dzXG4mIzQzOyAqICAgICBldmVyeSBvbmUgYWZ0ZXIgaXQsIHN0YW5kaW5nIGluIGZvciBhIHNlcnZlciB0aGF0IHJlbGVhc2VkIHRoZSBpbm9kZSBhbmRcbiYjNDM7ICogICAgIGhhcyBzaW5jZSByZXNvbHZlZCB0aGUgbmFtZSBhZ2Fpbi5cbiYjNDM7ICogIDMuIG9wZW5hdCgpIHRoZSBmaWxlLlxuJiM0MzsgKiAgICAgQnVnZ3k6ICBFTk9FTlQgcmVhY2hlcyB0aGUgY2FsbGVyLCBvbmUgb3BlbiB3YXMgYXNrZWQgZm9yLiAgRkFJTC5cbiYjNDM7ICogICAgIEZpeGVkOiAgdGhlIHdhbGsgcmV0cmllcywgdGhlIHNlY29uZCBvcGVuIGlzIGFsbG93ZWQsIHRoZSBkZXNjcmlwdG9yIGlzXG4mIzQzOyAqICAgICAgICAgICAgIHJldHVybmVkLCB0d28gb3BlbnMgd2VyZSBhc2tlZCBmb3IuICBQQVNTLlxuJiM0MzsgKiAgNC4gc3RhdCgpLCBjaG1vZCgpLCByZWFkbGluaygpIGFuZCBzdGF0ZnMoKSBieSBuYW1lLCB3aGljaCBhcmUgdGhlIHNhbWVcbiYjNDM7ICogICAgIHJlY292ZXJ5IHRocm91Z2ggRlVTRV9HRVRBVFRSLCBGVVNFX1NFVEFUVFIsIEZVU0VfUkVBRExJTksgYW5kXG4mIzQzOyAqICAgICBGVVNFX1NUQVRGUy4gIEVhY2ggaXMgcmVhY2hlZCB0aHJvdWdoIGEgcGF0aCB3YWxrLCB3aGljaCBpcyB3aGF0IG1ha2VzXG4mIzQzOyAqICAgICB0aGUgcmV0cnkgYXZhaWxhYmxlLlxuJiM0MzsgKiAgNS4gT3BlbiBhIG5hbWUgdGhlIHNlcnZlciBkb2VzIG5vdCBoYXZlIGF0IGFsbC5cbiYjNDM7ICogICAgIEJvdGg6ICAgRU5PRU5ULCBiZWNhdXNlIHRoZSBsb29rdXAgZmFpbHMgcmF0aGVyIHRoYW4gdGhlIG9wZW4sIGFuZCBhXG4mIzQzOyAqICAgICAgICAgICAgIGZpbGUgdGhhdCBpcyBhYnNlbnQgbXVzdCBzdGlsbCBsb29rIGFic2VudC5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFXG4mIzQzOyNkZWZpbmUgRlVTRV9VU0VfVkVSU0lPTiAzNFxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZXJybm8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2Z1c2VfbG93bGV2ZWwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9saW1pdHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NwdGhyZWFkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRib29sLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3N0YXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdHZmcy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy92ZnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Li4vLi4va3NlbGZ0ZXN0X2hhcm5lc3MuaFwmIzM0O1xuJiM0MztcbiYjNDM7I2RlZmluZSBGSUxFX05BTUVcdFwmIzM0O2hlbGRcJiMzNDtcbiYjNDM7I2RlZmluZSBMSU5LX05BTUVcdFwmIzM0O2hlbGQtbGlua1wmIzM0O1xuJiM0MzsjZGVmaW5lIEFCU0VOVF9OQU1FXHRcJiMzNDtuby1zdWNoLWZpbGVcJiMzNDtcbiYjNDM7I2RlZmluZSBGSUxFX0lOT1x0MlxuJiM0MzsjZGVmaW5lIExJTktfSU5PXHQzXG4mIzQzOyNkZWZpbmUgQ09OVEVOVFNcdFwmIzM0O3ByZXNlbnRcXG5cJiMzNDtcbiYjNDM7I2RlZmluZSBMSU5LX1RBUkdFVFx0RklMRV9OQU1FXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBXaGljaCByZXF1ZXN0IHRoZSBzZXJ2ZXIgcmVmdXNlcywgYW5kIGhvdyBtYW55IHRpbWVzLiAgU2hhcmVkIHdpdGggdGhlXG4mIzQzOyAqIGRhZW1vbiB0aHJlYWQ7IG9uZSB0ZXN0IHJ1bnMgYXQgYSB0aW1lLCBzbyBwbGFpbiBpbnRzLlxuJiM0MzsgKlxuJiM0MzsgKiBFdmVyeSBvbmUgb2YgdGhlc2UgbmFtZXMgYW4gaW5vZGUgYnkgbm9kZWlkIHJhdGhlciB0aGFuIGJ5IG5hbWUsIHNvIGFcbiYjNDM7ICogcmVmdXNhbCBvZiBhbnkgb2YgdGhlbSBpcyBkZXNjcmliaW5nIGEgaGFuZGxlIHJhdGhlciB0aGFuIGEgbWlzc2luZyBmaWxlLlxuJiM0MzsgKiBGVVNFX0xPT0tVUCBpcyBkZWxpYmVyYXRlbHkgYWJzZW50OiBpdCBjYXJyaWVzIGEgbmFtZSwgc28gaXRzIEVOT0VOVCBpcyBhblxuJiM0MzsgKiBhbnN3ZXIgcmF0aGVyIHRoYW4gYSBmYXVsdCwgYW5kIGFic2VudF9uYW1lX3N0aWxsX3JlcG9ydHNfYWJzZW50IGNvdmVycyBpdC5cbiYjNDM7ICovXG4mIzQzO2VudW0gcmVmdXNlX3doYXQge1xuJiM0MztcdFJFRlVTRV9OT1RISU5HLFxuJiM0MztcdFJFRlVTRV9PUEVOLFxuJiM0MztcdFJFRlVTRV9HRVRBVFRSLFxuJiM0MztcdFJFRlVTRV9TRVRBVFRSLFxuJiM0MztcdFJFRlVTRV9SRUFETElOSyxcbiYjNDM7XHRSRUZVU0VfU1RBVEZTLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCB7XG4mIzQzO1x0ZW51bSByZWZ1c2Vfd2hhdCB3aGF0O1xuJiM0MztcdGludCByZWZ1c2Fsc19sZWZ0O1xuJiM0MztcdGludCBvcGVuc19zZWVuO1xuJiM0MztcdGludCBnZXRhdHRyc19zZWVuO1xuJiM0MztcdGludCBzZXRhdHRyc19zZWVuO1xuJiM0MztcdGludCByZWFkbGlua3Nfc2VlbjtcbiYjNDM7XHRpbnQgc3RhdGZzc19zZWVuO1xuJiM0Mzt9IGdfZHM7XG4mIzQzO1xuJiM0MzsvKiBUcnVlIG9uY2UsIGZvciB0aGUgcmVxdWVzdCB1bmRlciB0ZXN0LCBhbmQgdGhlbiBuZXZlciBhZ2Fpbi4gKi9cbiYjNDM7c3RhdGljIGJvb2wgcmVmdXNlX25vdyhlbnVtIHJlZnVzZV93aGF0IHdoYXQpXG4mIzQzO3tcbiYjNDM7XHRpZiAoZ19kcy53aGF0ICE9IHdoYXQgfHwgZ19kcy5yZWZ1c2Fsc19sZWZ0IFx1MDAzYz0gMClcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRnX2RzLnJlZnVzYWxzX2xlZnQtLTtcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgZmlsbF9hdHRyKGZ1c2VfaW5vX3QgaW5vLCBzdHJ1Y3Qgc3RhdCAqc3QpXG4mIzQzO3tcbiYjNDM7XHRtZW1zZXQoc3QsIDAsIHNpemVvZigqc3QpKTtcbiYjNDM7XHRzdC1cdTAwM2VzdF9pbm8gPSBpbm87XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBPd25lZCBieSB3aG9ldmVyIHJ1bnMgdGhlIHRlc3QsIHNvIHRoYXQgY2htb2QoKSBpcyBhIHJlcXVlc3QgdGhlXG4mIzQzO1x0ICoga2VybmVsIHdpbGwgY2FycnkgdGhyb3VnaCB0byB0aGUgc2VydmVyIHJhdGhlciB0aGFuIHJlZnVzZSBpdHNlbGYuXG4mIzQzO1x0ICovXG4mIzQzO1x0c3QtXHUwMDNlc3RfdWlkID0gZ2V0dWlkKCk7XG4mIzQzO1x0c3QtXHUwMDNlc3RfZ2lkID0gZ2V0Z2lkKCk7XG4mIzQzO1x0aWYgKGlubyA9PSBGVVNFX1JPT1RfSUQpIHtcbiYjNDM7XHRcdHN0LVx1MDAzZXN0X21vZGUgPSBTX0lGRElSIHwgMDc1NTtcbiYjNDM7XHRcdHN0LVx1MDAzZXN0X25saW5rID0gMjtcbiYjNDM7XHR9IGVsc2UgaWYgKGlubyA9PSBMSU5LX0lOTykge1xuJiM0MztcdFx0c3QtXHUwMDNlc3RfbW9kZSA9IFNfSUZMTksgfCAwNzc3O1xuJiM0MztcdFx0c3QtXHUwMDNlc3RfbmxpbmsgPSAxO1xuJiM0MztcdFx0c3QtXHUwMDNlc3Rfc2l6ZSA9IHNpemVvZihMSU5LX1RBUkdFVCkgLSAxO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRzdC1cdTAwM2VzdF9tb2RlID0gU19JRlJFRyB8IDA2NDQ7XG4mIzQzO1x0XHRzdC1cdTAwM2VzdF9ubGluayA9IDE7XG4mIzQzO1x0XHRzdC1cdTAwM2VzdF9zaXplID0gc2l6ZW9mKENPTlRFTlRTKSAtIDE7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0X2xvb2t1cChmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZnVzZV9lbnRyeV9wYXJhbSBlO1xuJiM0MztcdGZ1c2VfaW5vX3QgaW5vO1xuJiM0MztcbiYjNDM7XHRpZiAocGFyZW50ICE9IEZVU0VfUk9PVF9JRClcbiYjNDM7XHRcdGlubyA9IDA7XG4mIzQzO1x0ZWxzZSBpZiAoIXN0cmNtcChuYW1lLCBGSUxFX05BTUUpKVxuJiM0MztcdFx0aW5vID0gRklMRV9JTk87XG4mIzQzO1x0ZWxzZSBpZiAoIXN0cmNtcChuYW1lLCBMSU5LX05BTUUpKVxuJiM0MztcdFx0aW5vID0gTElOS19JTk87XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0aW5vID0gMDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFpbm8pIHtcbiYjNDM7XHRcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1lbXNldChcdTAwMjZlLCAwLCBzaXplb2YoZSkpO1xuJiM0MztcdGUuaW5vID0gaW5vO1xuJiM0MztcdGUuYXR0cl90aW1lb3V0ID0gMDtcbiYjNDM7XHRlLmVudHJ5X3RpbWVvdXQgPSAwO1xuJiM0MztcdGZpbGxfYXR0cihpbm8sIFx1MDAyNmUuYXR0cik7XG4mIzQzO1x0ZnVzZV9yZXBseV9lbnRyeShyZXEsIFx1MDAyNmUpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0X2dldGF0dHIoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgaW5vLFxuJiM0MztcdFx0ICAgICAgc3RydWN0IGZ1c2VfZmlsZV9pbmZvICpmaSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzdGF0IHN0O1xuJiM0MztcbiYjNDM7XHQodm9pZClmaTtcbiYjNDM7XHQvKiBUaGUgcm9vdCBpcyBsZWZ0IGFsb25lOyByZWZ1c2luZyBpdCB3b3VsZCBicmVhayB0aGUgbW91bnQgaXRzZWxmLiAqL1xuJiM0MztcdGlmIChpbm8gPT0gRklMRV9JTk8pIHtcbiYjNDM7XHRcdGdfZHMuZ2V0YXR0cnNfc2VlbiYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRpZiAocmVmdXNlX25vdyhSRUZVU0VfR0VUQVRUUikpIHtcbiYjNDM7XHRcdFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpO1xuJiM0MztcdFx0XHRyZXR1cm47XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdGZpbGxfYXR0cihpbm8sIFx1MDAyNnN0KTtcbiYjNDM7XHRmdXNlX3JlcGx5X2F0dHIocmVxLCBcdTAwMjZzdCwgMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRfb3BlbihmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8sIHN0cnVjdCBmdXNlX2ZpbGVfaW5mbyAqZmkpXG4mIzQzO3tcbiYjNDM7XHRpZiAoaW5vICE9IEZJTEVfSU5PKSB7XG4mIzQzO1x0XHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRnX2RzLm9wZW5zX3NlZW4mIzQzOyYjNDM7O1xuJiM0MztcdGlmIChyZWZ1c2Vfbm93KFJFRlVTRV9PUEVOKSkge1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIFRoZSBpbm9kZSBpcyBnb25lIGFzIGZhciBhcyB0aGlzIHNlcnZlciBpcyBjb25jZXJuZWQsIGV2ZW5cbiYjNDM7XHRcdCAqIHRob3VnaCB0aGUgY2xpZW50IGlzIGhvbGRpbmcgYSByZWZlcmVuY2UgdG8gaXQgYW5kIGFza2VkIGJ5XG4mIzQzO1x0XHQgKiBub2RlaWQgcmF0aGVyIHRoYW4gYnkgbmFtZS5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XHRmdXNlX3JlcGx5X29wZW4ocmVxLCBmaSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRfcmVhZChmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8sIHNpemVfdCBzaXplLCBvZmZfdCBvZmYsXG4mIzQzO1x0XHQgICBzdHJ1Y3QgZnVzZV9maWxlX2luZm8gKmZpKVxuJiM0Mzt7XG4mIzQzO1x0c2l6ZV90IGxlbiA9IHNpemVvZihDT05URU5UUykgLSAxO1xuJiM0MztcbiYjNDM7XHQodm9pZClmaTtcbiYjNDM7XHRpZiAoaW5vICE9IEZJTEVfSU5PKSB7XG4mIzQzO1x0XHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcdGlmICgoc2l6ZV90KW9mZiBcdTAwM2U9IGxlbikge1xuJiM0MztcdFx0ZnVzZV9yZXBseV9idWYocmVxLCBOVUxMLCAwKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKG9mZiAmIzQzOyBzaXplIFx1MDAzZSBsZW4pXG4mIzQzO1x0XHRzaXplID0gbGVuIC0gb2ZmO1xuJiM0MztcdGZ1c2VfcmVwbHlfYnVmKHJlcSwgQ09OVEVOVFMgJiM0Mzsgb2ZmLCBzaXplKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdF9zZXRhdHRyKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubywgc3RydWN0IHN0YXQgKmF0dHIsXG4mIzQzO1x0XHQgICAgICBpbnQgdG9fc2V0LCBzdHJ1Y3QgZnVzZV9maWxlX2luZm8gKmZpKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHN0YXQgc3Q7XG4mIzQzO1xuJiM0MztcdCh2b2lkKWF0dHI7XG4mIzQzO1x0KHZvaWQpdG9fc2V0O1xuJiM0MztcdCh2b2lkKWZpO1xuJiM0MztcdGlmIChpbm8gPT0gRklMRV9JTk8pIHtcbiYjNDM7XHRcdGdfZHMuc2V0YXR0cnNfc2VlbiYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRpZiAocmVmdXNlX25vdyhSRUZVU0VfU0VUQVRUUikpIHtcbiYjNDM7XHRcdFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpO1xuJiM0MztcdFx0XHRyZXR1cm47XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdGZpbGxfYXR0cihpbm8sIFx1MDAyNnN0KTtcbiYjNDM7XHRmdXNlX3JlcGx5X2F0dHIocmVxLCBcdTAwMjZzdCwgMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRfcmVhZGxpbmsoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgaW5vKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKGlubyAhPSBMSU5LX0lOTykge1xuJiM0MztcdFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFSU5WQUwpO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Z19kcy5yZWFkbGlua3Nfc2VlbiYjNDM7JiM0Mzs7XG4mIzQzO1x0aWYgKHJlZnVzZV9ub3coUkVGVVNFX1JFQURMSU5LKSkge1xuJiM0MztcdFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XHRmdXNlX3JlcGx5X3JlYWRsaW5rKHJlcSwgTElOS19UQVJHRVQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0X3N0YXRmcyhmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8pXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgc3RhdHZmcyBzZnM7XG4mIzQzO1xuJiM0MztcdCh2b2lkKWlubztcbiYjNDM7XHRnX2RzLnN0YXRmc3Nfc2VlbiYjNDM7JiM0Mzs7XG4mIzQzO1x0aWYgKHJlZnVzZV9ub3coUkVGVVNFX1NUQVRGUykpIHtcbiYjNDM7XHRcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1lbXNldChcdTAwMjZzZnMsIDAsIHNpemVvZihzZnMpKTtcbiYjNDM7XHRzZnMuZl9ic2l6ZSA9IDUxMjtcbiYjNDM7XHRzZnMuZl9mcnNpemUgPSA1MTI7XG4mIzQzO1x0c2ZzLmZfbmFtZW1heCA9IE5BTUVfTUFYO1xuJiM0MztcdGZ1c2VfcmVwbHlfc3RhdGZzKHJlcSwgXHUwMDI2c2ZzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBmdXNlX2xvd2xldmVsX29wcyBmc19vcHMgPSB7XG4mIzQzO1x0Lmxvb2t1cFx0XHQ9IHRfbG9va3VwLFxuJiM0MztcdC5nZXRhdHRyXHQ9IHRfZ2V0YXR0cixcbiYjNDM7XHQuc2V0YXR0clx0PSB0X3NldGF0dHIsXG4mIzQzO1x0LnJlYWRsaW5rXHQ9IHRfcmVhZGxpbmssXG4mIzQzO1x0LnN0YXRmc1x0XHQ9IHRfc3RhdGZzLFxuJiM0MztcdC5vcGVuXHRcdD0gdF9vcGVuLFxuJiM0MztcdC5yZWFkXHRcdD0gdF9yZWFkLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKnJ1bl9kYWVtb24odm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0ZnVzZV9zZXNzaW9uX2xvb3AoKHN0cnVjdCBmdXNlX3Nlc3Npb24gKilhcmcpO1xuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiAtLS0tIGtzZWxmdGVzdCBoYXJuZXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJiM0MztcbiYjNDM7RklYVFVSRShvcGVuX2VzdGFsZSkge1xuJiM0MztcdHN0cnVjdCBmdXNlX3Nlc3Npb24gKnNlO1xuJiM0MztcdGNoYXIgICAgICAgICAgICAgICAgIG1vdW50cG9pbnRbUEFUSF9NQVhdO1xuJiM0MztcdGNoYXIgICAgICAgICAgICAgICAgIGZpbGVfcGF0aFtQQVRIX01BWF07XG4mIzQzO1x0Y2hhciAgICAgICAgICAgICAgICAgbGlua19wYXRoW1BBVEhfTUFYXTtcbiYjNDM7XHRjaGFyICAgICAgICAgICAgICAgICBhYnNlbnRfcGF0aFtQQVRIX01BWF07XG4mIzQzO1x0cHRocmVhZF90ICAgICAgICAgICAgdGhyZWFkO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7RklYVFVSRV9TRVRVUChvcGVuX2VzdGFsZSlcbiYjNDM7e1xuJiM0MztcdGNoYXIgKmZ1c2VfYXJndltdID0geyBcJiMzNDtmdXNlX2VzdGFsZV90ZXN0XCYjMzQ7LCBOVUxMIH07XG4mIzQzO1x0c3RydWN0IGZ1c2VfYXJncyBhcmdzID0gRlVTRV9BUkdTX0lOSVQoMSwgZnVzZV9hcmd2KTtcbiYjNDM7XG4mIzQzO1x0bWVtc2V0KFx1MDAyNmdfZHMsIDAsIHNpemVvZihnX2RzKSk7XG4mIzQzO1x0Z19kcy53aGF0ID0gUkVGVVNFX05PVEhJTkc7XG4mIzQzO1x0Z19kcy5yZWZ1c2Fsc19sZWZ0ID0gMTtcbiYjNDM7XG4mIzQzO1x0c3RyY3B5KHNlbGYtXHUwMDNlbW91bnRwb2ludCwgXCYjMzQ7L3RtcC9vcGVuX2VzdGFsZV90ZXN0X1hYWFhYWFwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFta2R0ZW1wKHNlbGYtXHUwMDNlbW91bnRwb2ludCkpXG4mIzQzO1x0XHRTS0lQKHJldHVybiwgXCYjMzQ7bWtkdGVtcDogJXNcJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKHNlbGYtXHUwMDNlZmlsZV9wYXRoLCBzaXplb2Yoc2VsZi1cdTAwM2VmaWxlX3BhdGgpLFxuJiM0MztcdFx0IFwmIzM0OyVzL1wmIzM0OyBGSUxFX05BTUUsIHNlbGYtXHUwMDNlbW91bnRwb2ludCk7XG4mIzQzO1x0c25wcmludGYoc2VsZi1cdTAwM2VsaW5rX3BhdGgsIHNpemVvZihzZWxmLVx1MDAzZWxpbmtfcGF0aCksXG4mIzQzO1x0XHQgXCYjMzQ7JXMvXCYjMzQ7IExJTktfTkFNRSwgc2VsZi1cdTAwM2Vtb3VudHBvaW50KTtcbiYjNDM7XHRzbnByaW50ZihzZWxmLVx1MDAzZWFic2VudF9wYXRoLCBzaXplb2Yoc2VsZi1cdTAwM2VhYnNlbnRfcGF0aCksXG4mIzQzO1x0XHQgXCYjMzQ7JXMvXCYjMzQ7IEFCU0VOVF9OQU1FLCBzZWxmLVx1MDAzZW1vdW50cG9pbnQpO1xuJiM0MztcbiYjNDM7XHRzZWxmLVx1MDAzZXNlID0gZnVzZV9zZXNzaW9uX25ldyhcdTAwMjZhcmdzLCBcdTAwMjZmc19vcHMsIHNpemVvZihmc19vcHMpLCBOVUxMKTtcbiYjNDM7XHRpZiAoIXNlbGYtXHUwMDNlc2UpIHtcbiYjNDM7XHRcdHJtZGlyKHNlbGYtXHUwMDNlbW91bnRwb2ludCk7XG4mIzQzO1x0XHRTS0lQKHJldHVybiwgXCYjMzQ7ZnVzZV9zZXNzaW9uX25ldyBmYWlsZWRcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGZ1c2Vfc2Vzc2lvbl9tb3VudChzZWxmLVx1MDAzZXNlLCBzZWxmLVx1MDAzZW1vdW50cG9pbnQpKSB7XG4mIzQzO1x0XHRmdXNlX3Nlc3Npb25fZGVzdHJveShzZWxmLVx1MDAzZXNlKTtcbiYjNDM7XHRcdHJtZGlyKHNlbGYtXHUwMDNlbW91bnRwb2ludCk7XG4mIzQzO1x0XHRTS0lQKHJldHVybiwgXCYjMzQ7ZnVzZV9zZXNzaW9uX21vdW50IGZhaWxlZCAobm8gZnVzZXJtb3VudDMgb3Igbm8gcHJpdmlsZWdlcylcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHB0aHJlYWRfY3JlYXRlKFx1MDAyNnNlbGYtXHUwMDNldGhyZWFkLCBOVUxMLCBydW5fZGFlbW9uLCBzZWxmLVx1MDAzZXNlKSkge1xuJiM0MztcdFx0ZnVzZV9zZXNzaW9uX3VubW91bnQoc2VsZi1cdTAwM2VzZSk7XG4mIzQzO1x0XHRmdXNlX3Nlc3Npb25fZGVzdHJveShzZWxmLVx1MDAzZXNlKTtcbiYjNDM7XHRcdHJtZGlyKHNlbGYtXHUwMDNlbW91bnRwb2ludCk7XG4mIzQzO1x0XHRTS0lQKHJldHVybiwgXCYjMzQ7cHRocmVhZF9jcmVhdGU6ICVzXCYjMzQ7LCBzdHJlcnJvcihlcnJubykpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZnVzZV9vcHRfZnJlZV9hcmdzKFx1MDAyNmFyZ3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztGSVhUVVJFX1RFQVJET1dOKG9wZW5fZXN0YWxlKVxuJiM0Mzt7XG4mIzQzO1x0ZnVzZV9zZXNzaW9uX2V4aXQoc2VsZi1cdTAwM2VzZSk7XG4mIzQzO1x0ZnVzZV9zZXNzaW9uX3VubW91bnQoc2VsZi1cdTAwM2VzZSk7XG4mIzQzO1x0cHRocmVhZF9qb2luKHNlbGYtXHUwMDNldGhyZWFkLCBOVUxMKTtcbiYjNDM7XHRmdXNlX3Nlc3Npb25fZGVzdHJveShzZWxmLVx1MDAzZXNlKTtcbiYjNDM7XHRybWRpcihzZWxmLVx1MDAzZW1vdW50cG9pbnQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfb3Blbl9pc19yZXRyaWVkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGZkO1xuJiM0MztcbiYjNDM7XHRnX2RzLndoYXQgPSBSRUZVU0VfT1BFTjtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBvcGVuKHNlbGYtXHUwMDNlZmlsZV9wYXRoLCBPX1JET05MWSk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIHJlZnVzYWwgZGVzY3JpYmVzIGEgaGFuZGxlIHRoZSBzZXJ2ZXIgc2hvdWxkIGhhdmUgaG9ub3VyZWQsIHNvXG4mIzQzO1x0ICogdGhlIHdhbGsgaXMgZW50aXRsZWQgdG8gcmVzb2x2ZSB0aGUgbmFtZSBhZ2FpbiBhbmQgb3BlbiB3aGF0IGl0XG4mIzQzO1x0ICogcmVmZXJzIHRvIG5vdy4gUmVwb3J0aW5nIHRoZSBmaWxlIG1pc3NpbmcgaW5zdGVhZCBlbmRzIHRoZSB3YWxrLlxuJiM0MztcdCAqL1xuJiM0MztcdEFTU0VSVF9HRShmZCwgMCkge1xuJiM0MztcdFx0VEhfTE9HKFwmIzM0O29wZW4gZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgb3BlbiByZXF1ZXN0KHMpXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIHN0cmVycm9yKGVycm5vKSwgZ19kcy5vcGVuc19zZWVuKTtcbiYjNDM7XHR9XG4mIzQzO1x0RVhQRUNUX0VRKDIsIGdfZHMub3BlbnNfc2Vlbik7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfZ2V0YXR0cl9vbl9wYXRoX2lzX3JldHJpZWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgc3RhdCBzdDtcbiYjNDM7XG4mIzQzO1x0Z19kcy53aGF0ID0gUkVGVVNFX0dFVEFUVFI7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogUmVhY2hlZCBieSBuYW1lLCBzbyB0aGUgd2FsayBjYW4gcmVzb2x2ZSBpdCBhZ2FpbiBhbmQgYXNrIGEgc2Vjb25kXG4mIzQzO1x0ICogdGltZSwgdGhlIHNhbWUgcmVjb3ZlcnkgdGhlIG9wZW4gZ2V0cy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRBU1NFUlRfRVEoMCwgc3RhdChzZWxmLVx1MDAzZWZpbGVfcGF0aCwgXHUwMDI2c3QpKSB7XG4mIzQzO1x0XHRUSF9MT0coXCYjMzQ7c3RhdCBmYWlsZWQgd2l0aCAlcyBhZnRlciAlZCBnZXRhdHRyIHJlcXVlc3QocylcJiMzNDssXG4mIzQzO1x0XHQgICAgICAgc3RyZXJyb3IoZXJybm8pLCBnX2RzLmdldGF0dHJzX3NlZW4pO1xuJiM0MztcdH1cbiYjNDM7XHRFWFBFQ1RfR1QoZ19kcy5nZXRhdHRyc19zZWVuLCAxKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX3NldGF0dHJfb25fcGF0aF9pc19yZXRyaWVkKVxuJiM0Mzt7XG4mIzQzO1x0Z19kcy53aGF0ID0gUkVGVVNFX1NFVEFUVFI7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogY2htb2QoKSByZWFjaGVzIHRoZSBpbm9kZSBieSBuYW1lLCBzbyB0aGUgc2FtZSByZXRyeSBhcHBsaWVzOiB0aGVcbiYjNDM7XHQgKiByZWZ1c2FsIGRlc2NyaWJlcyBhIGhhbmRsZSBhbmQgdGhlIHdhbGsgbWF5IHJlc29sdmUgdGhlIG5hbWUgYWdhaW4uXG4mIzQzO1x0ICovXG4mIzQzO1x0QVNTRVJUX0VRKDAsIGNobW9kKHNlbGYtXHUwMDNlZmlsZV9wYXRoLCAwNjAwKSkge1xuJiM0MztcdFx0VEhfTE9HKFwmIzM0O2NobW9kIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHNldGF0dHIgcmVxdWVzdChzKVwmIzM0OyxcbiYjNDM7XHRcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMuc2V0YXR0cnNfc2Vlbik7XG4mIzQzO1x0fVxuJiM0MztcdEVYUEVDVF9HVChnX2RzLnNldGF0dHJzX3NlZW4sIDEpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfcmVhZGxpbmtfb25fcGF0aF9pc19yZXRyaWVkKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBidWZbUEFUSF9NQVhdO1xuJiM0MztcdHNzaXplX3QgbjtcbiYjNDM7XG4mIzQzO1x0Z19kcy53aGF0ID0gUkVGVVNFX1JFQURMSU5LO1xuJiM0MztcbiYjNDM7XHRuID0gcmVhZGxpbmsoc2VsZi1cdTAwM2VsaW5rX3BhdGgsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKTtcbiYjNDM7XHRBU1NFUlRfR0UobiwgMCkge1xuJiM0MztcdFx0VEhfTE9HKFwmIzM0O3JlYWRsaW5rIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHJlYWRsaW5rIHJlcXVlc3QocylcJiMzNDssXG4mIzQzO1x0XHQgICAgICAgc3RyZXJyb3IoZXJybm8pLCBnX2RzLnJlYWRsaW5rc19zZWVuKTtcbiYjNDM7XHR9XG4mIzQzO1x0YnVmW25dID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRFWFBFQ1RfU1RSRVEoTElOS19UQVJHRVQsIGJ1Zik7XG4mIzQzO1x0RVhQRUNUX0dUKGdfZHMucmVhZGxpbmtzX3NlZW4sIDEpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfc3RhdGZzX29uX3BhdGhfaXNfcmV0cmllZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzdGF0ZnMgc2ZzO1xuJiM0MztcbiYjNDM7XHRnX2RzLndoYXQgPSBSRUZVU0VfU1RBVEZTO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIHN0YXRmcygpIGRlc2NyaWJlcyB0aGUgbW91bnQgcmF0aGVyIHRoYW4gdGhlIGZpbGUsIGJ1dCBpdCBpcyBzdGlsbFxuJiM0MztcdCAqIHJlYWNoZWQgdGhyb3VnaCBhIHBhdGggd2Fsaywgc28gYSByZWZ1c2FsIHRoYXQgbmFtZXMgYSBoYW5kbGUgaXNcbiYjNDM7XHQgKiByZXRyaWVkIHRoZSBzYW1lIHdheS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRBU1NFUlRfRVEoMCwgc3RhdGZzKHNlbGYtXHUwMDNlZmlsZV9wYXRoLCBcdTAwMjZzZnMpKSB7XG4mIzQzO1x0XHRUSF9MT0coXCYjMzQ7c3RhdGZzIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHN0YXRmcyByZXF1ZXN0KHMpXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIHN0cmVycm9yKGVycm5vKSwgZ19kcy5zdGF0ZnNzX3NlZW4pO1xuJiM0MztcdH1cbiYjNDM7XHRFWFBFQ1RfR1QoZ19kcy5zdGF0ZnNzX3NlZW4sIDEpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0Yob3Blbl9lc3RhbGUsIGFic2VudF9uYW1lX3N0aWxsX3JlcG9ydHNfYWJzZW50KVxuJiM0Mzt7XG4mIzQzO1x0aW50IGZkO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEhlcmUgaXQgaXMgdGhlIGxvb2t1cCB0aGF0IGZhaWxzIHJhdGhlciB0aGFuIHRoZSBvcGVuLCBzbyBub3RoaW5nIGlzXG4mIzQzO1x0ICogYmVpbmcgZGVzY3JpYmVkIGFzIHN0YWxlIGFuZCB0aGUgY2FsbGVyIG11c3Qgc3RpbGwgYmUgdG9sZCB0aGUgbmFtZVxuJiM0MztcdCAqIGlzIG5vdCB0aGVyZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRmZCA9IG9wZW4oc2VsZi1cdTAwM2VhYnNlbnRfcGF0aCwgT19SRE9OTFkpO1xuJiM0MztcdEFTU0VSVF9MVChmZCwgMCk7XG4mIzQzO1x0RVhQRUNUX0VRKEVOT0VOVCwgZXJybm8pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0hBUk5FU1NfTUFJTlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDAwOjA1PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0ZVU0VfRlMmIzM0OywKICAgICYjMzQ7VklSVElPX0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7ZnVzZV9kb19zZXRhdHRyJiMzNDssCiAgICAmIzM0O2Z1c2Vfb3BlbiYjMzQ7LAogICAgJiMzNDtmdXNlX2Rpcl9vcGVuJiMzNDssCiAgICAmIzM0O2Z1c2VfZG9fZ2V0YXR0ciYjMzQ7LAogICAgJiMzNDtmdXNlX3N0YXRmcyYjMzQ7LAogICAgJiMzNDtmdXNlX3JlYWRsaW5rX2ZvbGlvJiMzNDssCiAgICAmIzM0O3ZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHVwZGF0ZXMgZXJyb3IgaGFuZGxpbmcgZm9yIGxpdmUgbm9kZSBJRHMgaW4gRlVTRSBhbmQgdmlydGlvLWZzIHdoZW4gdGhlIHVzZXIvaG9zdCBzZXJ2ZXIgcmV0dXJucyAtRU5PRU5ULCB0cmFuc2xhdGluZyBpdCB0byAtRVNUQUxFIG9yIC1FT1BFTlNUQUxFIHRvIHRyaWdnZXIgVkZTIHBhdGggbG9va3VwIHJldHJpZXMgKExPT0tVUF9SRVZBTCkuIFRoZXNlIGZ1bmN0aW9uYWwgY2hhbmdlcyBpbXBhY3QgY29yZSBmaWxlIG9wZXJhdGlvbnMgKG9wZW4sIGdldGF0dHIsIHNldGF0dHIsIHJlYWRsaW5rLCBzdGF0ZnMpIGluIEZVU0UgYW5kIHZpcnRpby1mcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGI0Y2NhMzRiNmZlZTk0ODYzYjFiZTIwMzkyMDkzOGUxZjRhZjliZTQKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIEF1ZyAyOCAwMDowNTozMCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZGlyLmMgYi9mcy9mdXNlL2Rpci5jCmluZGV4IGU0OWI0ZTg3NGIxNWYuLjIxN2EwMzk5OTA1MDcgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZGlyLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZnVzZS9kaXIuYwpAQCAtMTUzMiw2ICYjNDM7MTUzMiw4IEBAIHN0YXRpYyBpbnQgZnVzZV9kb19nZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJaWYgKHN0YXQpCiAJCQkJZnVzZV9maWxsYXR0cihpZG1hcCwgaW5vZGUsICZhbXA7b3V0YXJnLmF0dHIsIHN0YXQpOwogCQl9CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQllcnIgPSBmdXNlX3N0YWxlX2lub2RlX2VycihlcnIpOwogCX0KIAlyZXR1cm4gZXJyOwogfQpAQCAtMTg0OCw2ICYjNDM7MTg1MCw3IEBAIHN0YXRpYyBpbnQgZnVzZV9yZWFkbGlua19mb2xpbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKQogCiAJZnVzZV9pbnZhbGlkYXRlX2F0aW1lKGlub2RlKTsKIAomIzQzOwlyZXMgPSBmdXNlX3N0YWxlX2lub2RlX2VycihyZXMpOwogCWlmIChyZXMgJmx0OyAwKQogCQlyZXR1cm4gcmVzOwogCkBAIC0xOTEwLDYgJiM0MzsxOTEzLDEyIEBAIHN0YXRpYyBpbnQgZnVzZV9kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIAkJcmV0dXJuIGVycjsKIAogCWVyciA9IGZ1c2VfZG9fb3BlbihmbSwgZ2V0X25vZGVfaWQoaW5vZGUpLCBmaWxlLCB0cnVlKTsKJiM0MzsJLyoKJiM0MzsJICogQXMgaW4gZnVzZV9vcGVuX2NvbW1vbigpOiBhIHBhdGggd2FsayBzdGFuZHMgYmVoaW5kIHRoaXMgb3BlbiwKJiM0MzsJICogc28gdGhlIHJlZnVzYWwgaXMgRU9QRU5TVEFMRSBmb3IgcGF0aF9vcGVuYXQoKSB0byBhbnN3ZXIuCiYjNDM7CSAqLwomIzQzOwlpZiAoZXJyID09IC1FTk9FTlQpCiYjNDM7CQllcnIgPSAtRU9QRU5TVEFMRTsKIAlpZiAoIWVycikgewogCQlzdHJ1Y3QgZnVzZV9maWxlICpmZiA9IGZpbGUtJmd0O3ByaXZhdGVfZGF0YTsKIApAQCAtMjI0OSw2ICYjNDM7MjI1OCw3IEBAIGludCBmdXNlX2RvX3NldGF0dHIoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAlpZiAoZXJyKSB7CiAJCWlmIChlcnIgPT0gLUVJTlRSKQogCQkJZnVzZV9pbnZhbGlkYXRlX2F0dHIoaW5vZGUpOwomIzQzOwkJZXJyID0gZnVzZV9zdGFsZV9pbm9kZV9lcnIoZXJyKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZmlsZS5jIGIvZnMvZnVzZS9maWxlLmMKaW5kZXggOGQ2MTM1YTYxMDhhNC4uMzA4YjE1YzMwZjM0ZCAxMDA2NDQKLS0tIGEvZnMvZnVzZS9maWxlLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZnVzZS9maWxlLmMKQEAgLTI3OSw2ICYjNDM7Mjc5LDE3IEBAIHN0YXRpYyBpbnQgZnVzZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogCQlmdXNlX3NldF9ub3dyaXRlKGlub2RlKTsKIAogCWVyciA9IGZ1c2VfZG9fb3BlbihmbSwgZ2V0X25vZGVfaWQoaW5vZGUpLCBmaWxlLCBmYWxzZSk7CiYjNDM7CS8qCiYjNDM7CSAqIFRoaXMgb3BlbiByZWFjaGVkIHRoZSBzZXJ2ZXIgdGhyb3VnaCBhIHBhdGggd2Fsaywgc28gYSByZWZ1c2FsCiYjNDM7CSAqIGZvciB0aGUgbGl2ZSBub2RlaWQgaXMgcmVwb3J0ZWQgYXMgRU9QRU5TVEFMRSByYXRoZXIgdGhhbiB0aGUKJiM0MzsJICogRVNUQUxFIHRoZSBub2RlaWQtb25seSByZXF1ZXN0cyBzYXk6IHBhdGhfb3BlbmF0KCkgcGlja3MgdGhlCiYjNDM7CSAqIGNoZWFwZXN0IHJldHJ5IGZvciB0aGUgd2FsayBpbiBwcm9ncmVzcywgRUNISUxEIHVuZGVyIExPT0tVUF9SQ1UKJiM0MzsJICogYW5kIEVTVEFMRSBvdGhlcndpc2UuIGZ1c2VfZmlsZV9vcGVuKCkgaXMgbGVmdCBhbG9uZSBiZWNhdXNlCiYjNDM7CSAqIGZ1c2VfcHJpdl9pb2N0bF9wcmVwYXJlKCkgcmVhY2hlcyBpdCB0byBzZXJ2ZSBGU19JT0NfR0VURkxBR1MsCiYjNDM7CSAqIHdpdGggbm8gb3BlbiBiZWhpbmQgaXQgdG8gdHJhbnNsYXRlIHRoZSBpbnRlcm5hbCBlcnJuby4KJiM0MzsJICovCiYjNDM7CWlmIChlcnIgPT0gLUVOT0VOVCkKJiM0MzsJCWVyciA9IC1FT1BFTlNUQUxFOwogCWlmICghZXJyKSB7CiAJCWZmID0gZmlsZS0mZ3Q7cHJpdmF0ZV9kYXRhOwogCQllcnIgPSBmdXNlX2ZpbmlzaF9vcGVuKGlub2RlLCBmaWxlKTsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZnVzZV9pLmggYi9mcy9mdXNlL2Z1c2VfaS5oCmluZGV4IGM4ZDRjNWYzYWY3ZTguLmU2YjI1OTdkNmRkNmYgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZnVzZV9pLmgKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZnVzZS9mdXNlX2kuaApAQCAtMTI1MCw2ICYjNDM7MTI1MCwyNSBAQCB2b2lkIGZ1c2VfaW5vZGVfdW5jYWNoZWRfaW9fZW5kKHN0cnVjdCBmdXNlX2lub2RlICpmaSk7CiBpbnQgZnVzZV9maWxlX2lvX29wZW4oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogdm9pZCBmdXNlX2ZpbGVfaW9fcmVsZWFzZShzdHJ1Y3QgZnVzZV9maWxlICpmZiwgc3RydWN0IGlub2RlICppbm9kZSk7CiAKJiM0MzsvKgomIzQzOyAqIFJlcG9ydCBhIHJlcXVlc3QgcmVmdXNlZCBmb3IgYSBsaXZlIG5vZGVpZCBhcyBzdGFsZS4KJiM0MzsgKgomIzQzOyAqIEEgcmVxdWVzdCB0aGF0IG5hbWVzIGEgbm9kZWlkIGFuZCBub3RoaW5nIGVsc2UgaXMgb25seSBzZW50IGZvciBhbgomIzQzOyAqIGlub2RlIHRoZSBjbGllbnQgaGFzIGxvb2tlZCB1cCBhbmQgaG9sZHMgYSByZWZlcmVuY2UgdG8sIGFuZCB0aGUKJiM0MzsgKiBzZXJ2ZXIgb3dlcyB0aGUgY2xpZW50IHRoYXQgaW5vZGUgdW50aWwgaXQgaXMgc2VudCBGVVNFX0ZPUkdFVC4KJiM0MzsgKiBFTk9FTlQgZnJvbSB0aGUgc2VydmVyIGRlc2NyaWJlcyB0aGUgaW5vZGUgaXRzZWxmIHJhdGhlciB0aGFuIGEgbmFtZQomIzQzOyAqIHRoYXQgaGFzIGdvbmUgYXdheS4gUmVwb3J0IHRoZSBoYW5kbGUgYXMgc3RhbGUsIHdoaWNoIHRoZSBjYWxsZXIKJiM0MzsgKiBhbnN3ZXJzIGJ5IHJlc29sdmluZyB0aGUgbmFtZSBhZ2FpbiB1bmRlciBMT09LVVBfUkVWQUwgYW5kIGFjdGluZyBvbgomIzQzOyAqIHdoYXRldmVyIGl0IHJlZmVycyB0byBub3cuIEEgbmFtZSB0aGF0IHJlYWxseSBoYXMgZ29uZSBmYWlscyB0aGF0CiYjNDM7ICogc2Vjb25kIGxvb2t1cCBhbmQgdGhlIGNhbGxlciBzdGlsbCBzZWVzIEVOT0VOVC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGludCBmdXNlX3N0YWxlX2lub2RlX2VycihpbnQgZXJyKQomIzQzO3sKJiM0MzsJaWYgKGVyciA9PSAtRU5PRU5UKQomIzQzOwkJcmV0dXJuIC1FU1RBTEU7CiYjNDM7CXJldHVybiBlcnI7CiYjNDM7fQomIzQzOwogLyogZmlsZS5jICovCiBzdHJ1Y3QgZnVzZV9maWxlICpmdXNlX2ZpbGVfb3BlbihzdHJ1Y3QgZnVzZV9tb3VudCAqZm0sIHU2NCBub2RlaWQsCiAJCQkJIHVuc2lnbmVkIGludCBvcGVuX2ZsYWdzLCBib29sIGlzZGlyKTsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvaW5vZGUuYyBiL2ZzL2Z1c2UvaW5vZGUuYwppbmRleCBlOTU1MmJlMzYzN2JjLi5jZGUwYTUzMzUwODk3IDEwMDY0NAotLS0gYS9mcy9mdXNlL2lub2RlLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZnVzZS9pbm9kZS5jCkBAIC02NjYsNyAmIzQzOzY2Niw3IEBAIHN0YXRpYyBpbnQgZnVzZV9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogCWVyciA9IGZ1c2Vfc2ltcGxlX3JlcXVlc3QoZm0sICZhbXA7YXJncyk7CiAJaWYgKCFlcnIpCiAJCWNvbnZlcnRfZnVzZV9zdGF0ZnMoYnVmLCAmYW1wO291dGFyZy5zdCk7Ci0JcmV0dXJuIGVycjsKJiM0MzsJcmV0dXJuIGZ1c2Vfc3RhbGVfaW5vZGVfZXJyKGVycik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZnVzZV9zeW5jX2J1Y2tldCAqZnVzZV9zeW5jX2J1Y2tldF9hbGxvYyh2b2lkKQpkaWZmIC0tZ2l0IGEvZnMvZnVzZS92aXJ0aW9fZnMuYyBiL2ZzL2Z1c2UvdmlydGlvX2ZzLmMKaW5kZXggZjE1ZTUxNmViY2I1Yy4uN2IwM2JmODdjMmFlOCAxMDA2NDQKLS0tIGEvZnMvZnVzZS92aXJ0aW9fZnMuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9mdXNlL3ZpcnRpb19mcy5jCkBAIC03ODAsNiAmIzQzOzc4MCw2NiBAQCBzdGF0aWMgYm9vbCB2aXJ0aW9fZnNfdmVyaWZ5X3Jlc3BvbnNlKHN0cnVjdCBmdXNlX3JlcSAqcmVxLCB1bnNpZ25lZCBpbnQgbGVuKQogCXJldHVybiB0cnVlOwogfQogCiYjNDM7LyoKJiM0MzsgKiBSZXBvcnQgYSByZXF1ZXN0IHJlZnVzZWQgZm9yIGEgbGl2ZSBub2RlaWQgYXMgc3RhbGUuCiYjNDM7ICoKJiM0MzsgKiBUaGVzZSByZXF1ZXN0cyBjYXJyeSBhIG5vZGVpZCBhbmQgbm8gbmFtZSwgc28gdGhlIGNsaWVudCBvbmx5IHNlbmRzIHRoZW0gZm9yCiYjNDM7ICogYW4gaW5vZGUgaXQgaGFzIGFscmVhZHkgbG9va2VkIHVwIGFuZCBob2xkcyBhIHJlZmVyZW5jZSB0bywgYW5kIGEgc2VydmVyIG93ZXMKJiM0MzsgKiB0aGUgY2xpZW50IHRoYXQgaW5vZGUgdW50aWwgaXQgaXMgc2VudCBGVVNFX0ZPUkdFVC4gQSBzZXJ2ZXIgYW5zd2VyaW5nIHdpdGgKJiM0MzsgKiBFTk9FTlQgaXMgZGVzY3JpYmluZyBhIGhhbmRsZSBpdCB3YXMgb2JsaWdlZCB0byBob25vdXIgcmF0aGVyIHRoYW4gYSBuYW1lCiYjNDM7ICogdGhhdCBoYXMgZ29uZSBhd2F5LCBhbmQgdGhlIGNhbGxlciBoYXMgbm8gcmVhc29uIHRvIGRvdWJ0IGl0LgomIzQzOyAqCiYjNDM7ICogU2F5aW5nIHRoZSBoYW5kbGUgaXMgc3RhbGUgaXMgc29tZXRoaW5nIHRoZSBjYWxsZXIga25vd3MgaG93IHRvIGFuc3dlcjogaXQKJiM0MzsgKiByZXBlYXRzIHRoZSBsb29rdXAgdW5kZXIgTE9PS1VQX1JFVkFMIGFuZCBhY3RzIG9uIHdoYXRldmVyIHRoZSBuYW1lIHJlZmVycyB0bwomIzQzOyAqIG5vdy4gQSBuYW1lIHRoYXQgZ2VudWluZWx5IGhhcyBnb25lIGZhaWxzIHRoZSByZXRyaWVkIGxvb2t1cCwgc28gYSBjYWxsZXIKJiM0MzsgKiBzdGlsbCBsZWFybnMgaXQgaXMgZ29uZS4gcmV0cnlfZXN0YWxlKCkgaXMgd2hhdCBkb2VzIHRoaXMsIGFuZCBmcy9uYW1laS5jLAomIzQzOyAqIGZzL29wZW4uYywgZnMvc3RhdC5jLCBmcy9zdGF0ZnMuYywgZnMvdXRpbWVzLmMgYW5kIGZzL3hhdHRyLmMgYWxsIHJlYWNoIGl0LAomIzQzOyAqIHdoaWNoIGlzIHdoYXQgbWFrZXMgdGhlIGNvbnZlcnNpb24gdXNlZnVsIHJhdGhlciB0aGFuIGEgcmVuYW1lIG9mIHRoZSBlcnJvci4KJiM0MzsgKgomIzQzOyAqIEEgcmVxdWVzdCB0aGF0IG5hbWVzIHNvbWV0aGluZyB3aGljaCBjYW4gaXRzZWxmIGJlIGFic2VudCBpcyBsZWZ0IGFsb25lLAomIzQzOyAqIGJlY2F1c2UgRU5PRU5UIGlzIHRoZW4gYW1iaWd1b3VzIGFuZCBpcyBmcmVxdWVudGx5IHRoZSBhbnN3ZXIgdGhlIGNhbGxlcgomIzQzOyAqIGFza2VkIGZvci4gRlVTRV9MT09LVVAgcmVwb3J0cyBhIG1pc3NpbmcgbmFtZSBpbiBhIGxpdmluZyBkaXJlY3RvcnkgYW5kIHRoZQomIzQzOyAqIGRpcmVjdG9yeSBvcGVyYXRpb25zIGNhcnJ5IGEgcGFyZW50IG5vZGVpZCBiZXNpZGUgb25lLCBzbyBuZWl0aGVyIGNhbiBiZQomIzQzOyAqIHJlYWQgYXMgYSBzdGF0ZW1lbnQgYWJvdXQgdGhlIGlub2RlLiBUaGUgZXh0ZW5kZWQgYXR0cmlidXRlIHJlcXVlc3RzIGJlbG9uZwomIzQzOyAqIHdpdGggdGhlbTogdGhleSBjYXJyeSBhbiBhdHRyaWJ1dGUgbmFtZSwgYW5kIHdoaWxlIGEgc2VydmVyIHNob3VsZCByZXBvcnQgYQomIzQzOyAqIG1pc3NpbmcgYXR0cmlidXRlIGFzIEVOT0RBVEEsIG9uZSB0aGF0IGFuc3dlcnMgRU5PRU5UIGluc3RlYWQgd291bGQgaGF2ZSBhCiYjNDM7ICogY29ycmVjdCByZXBseSB0dXJuZWQgaW50byBhIHJldHJ5IHRoYXQgY2Fubm90IHN1Y2NlZWQuCiYjNDM7ICoKJiM0MzsgKiBSZXF1ZXN0cyBhZ2FpbnN0IGFuIGFscmVhZHkgb3BlbiBkZXNjcmlwdG9yIGFyZSBhbHNvIGxlZnQgYWxvbmUsIHNpbmNlIHRoZXJlCiYjNDM7ICogaXMgbm8gZXF1aXZhbGVudCByZXRyeSB0byByZWFjaCBhbmQgY29udmVydGluZyB0aGUgZXJyb3Igd291bGQgcmVuYW1lIGEKJiM0MzsgKiBmYWlsdXJlIHJhdGhlciB0aGFuIHJlcGFpciBpdCwgYW5kIEZVU0VfSU9DVEwgYW5kIEZVU0VfUE9MTCBoYW5kIHRoZQomIzQzOyAqIHNlcnZlciYjMzk7cyBlcnJubyB0byB1c2Vyc3BhY2UgdmVyYmF0aW0uCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgdmlydGlvX2ZzX2ZpeHVwX3N0YWxlX2Vycm9yKHN0cnVjdCBmdXNlX3JlcSAqcmVxKQomIzQzO3sKJiM0MzsJaWYgKHJlcS0mZ3Q7b3V0LmguZXJyb3IgIT0gLUVOT0VOVCkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJc3dpdGNoIChyZXEtJmd0O2luLmgub3Bjb2RlKSB7CiYjNDM7CWNhc2UgRlVTRV9PUEVOOgomIzQzOwljYXNlIEZVU0VfT1BFTkRJUjoKJiM0MzsJCS8qCiYjNDM7CQkgKiBBbiBvcGVuIHNheXMgRU9QRU5TVEFMRSwgYW5kIHBhdGhfb3BlbmF0KCkgZGVjaWRlcyB3aGF0IHRoZQomIzQzOwkJICogd2FsayBpbiBwcm9ncmVzcyBzaG91bGQgbWFrZSBvZiBpdDogRUNISUxEIHVuZGVyIExPT0tVUF9SQ1UKJiM0MzsJCSAqIHNvIGl0IGRyb3BzIHRvIFJFRi13YWxrLCBFU1RBTEUgb3RoZXJ3aXNlIHNvIHRoZSBuYW1lIGlzCiYjNDM7CQkgKiByZXNvbHZlZCBhZ2FpbiB1bmRlciBMT09LVVBfUkVWQUwuIE5hbWluZyBFU1RBTEUgaGVyZSB3b3VsZAomIzQzOwkJICogdGFrZSB0aGUgc2Vjb25kIGluIGJvdGggY2FzZXMgYW5kIHNraXAgYSBjaGVhcGVyIHJldHJ5LgomIzQzOwkJICovCiYjNDM7CQlyZXEtJmd0O291dC5oLmVycm9yID0gLUVPUEVOU1RBTEU7CiYjNDM7CQlicmVhazsKJiM0MzsJY2FzZSBGVVNFX0dFVEFUVFI6CiYjNDM7CWNhc2UgRlVTRV9TRVRBVFRSOgomIzQzOwljYXNlIEZVU0VfUkVBRExJTks6CiYjNDM7CWNhc2UgRlVTRV9TVEFURlM6CiYjNDM7CQkvKgomIzQzOwkJICogTm90aGluZyB0cmFuc2xhdGVzIEVPUEVOU1RBTEUgb3V0c2lkZSB0aGUgb3BlbiBwYXRoLCBzbwomIzQzOwkJICogdGhlc2Ugc2F5IEVTVEFMRSBkaXJlY3RseSwgd2hpY2ggcmV0cnlfZXN0YWxlKCkgYW5zd2Vycy4KJiM0MzsJCSAqLwomIzQzOwkJcmVxLSZndDtvdXQuaC5lcnJvciA9IC1FU1RBTEU7CiYjNDM7CQlicmVhazsKJiM0MzsJfQomIzQzO30KJiM0MzsKIC8qIFdvcmsgZnVuY3Rpb24gZm9yIHJlcXVlc3QgY29tcGxldGlvbiAqLwogc3RhdGljIHZvaWQgdmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGUoc3RydWN0IGZ1c2VfcmVxICpyZXEsCiAJCQkJICAgICAgIHN0cnVjdCB2aXJ0aW9fZnNfdnEgKmZzdnEpCkBAIC04MTAsNiAmIzQzOzg3MCw4IEBAIHN0YXRpYyB2b2lkIHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlKHN0cnVjdCBmdXNlX3JlcSAqcmVxLAogCiAJY2xlYXJfYml0KEZSX1NFTlQsICZhbXA7cmVxLSZndDtmbGFncyk7CiAKJiM0MzsJdmlydGlvX2ZzX2ZpeHVwX3N0YWxlX2Vycm9yKHJlcSk7CiYjNDM7CiAJZnVzZV9yZXF1ZXN0X2VuZChyZXEpOwogCXNwaW5fbG9jaygmYW1wO2ZzdnEtJmd0O2xvY2spOwogCWRlY19pbl9mbGlnaHRfcmVxKGZzdnEpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uZ2l0aWdub3JlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uZ2l0aWdub3JlCmluZGV4IGZiNTE2MDNmZTQxOTguLjljYjMwNDgxMjhkNWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZQomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlLy5naXRpZ25vcmUKQEAgLTEsNCAmIzQzOzEsNiBAQAogIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5CiYjNDM7ZnVzZV9hY2xfY2FjaGVfdGVzdAogZnVzZV9tbnQKJiM0MztmdXNlX2VzdGFsZV90ZXN0CiBmdXNlY3RsX3Rlc3QKIHdyaXRlX2V4dGVuZF9lb2ZfdGVzdApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvTWFrZWZpbGUKaW5kZXggOTVhMWVlOTQ3Y2E3Ni4uZjU2NGNiMzdiM2E1YiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL01ha2VmaWxlCkBAIC02LDExICYjNDM7NiwxMiBAQCBURVNUX0dFTl9QUk9HUyA6PSBmdXNlY3RsX3Rlc3QKIFRFU1RfR0VOX1BST0dTICYjNDM7PSB3cml0ZV9leHRlbmRfZW9mX3Rlc3QKIFRFU1RfR0VOX0ZJTEVTIDo9IGZ1c2VfbW50CiAKLSMgZnVzZV9hY2xfY2FjaGVfdGVzdCByZXF1aXJlcyBsaWJmdXNlMzsgYWRkIGl0IG9ubHkgd2hlbiB0aGUgbGlicmFyeSBpcyBwcmVzZW50LgotQUNMX0NGTEFHUyA6PSAkKHNoZWxsIHBrZy1jb25maWcgZnVzZTMgLS1jZmxhZ3MgMiZndDsvZGV2L251bGwpCi1BQ0xfTERMSUJTIDo9ICQoc2hlbGwgcGtnLWNvbmZpZyBmdXNlMyAtLWxpYnMgMiZndDsvZGV2L251bGwpCi1pZm5lcSAoJChBQ0xfQ0ZMQUdTKSwpCiYjNDM7IyBUaGVzZSB0ZXN0cyByZXF1aXJlIGxpYmZ1c2UzOyBhZGQgdGhlbSBvbmx5IHdoZW4gdGhlIGxpYnJhcnkgaXMgcHJlc2VudC4KJiM0MztGVVNFM19DRkxBR1MgOj0gJChzaGVsbCBwa2ctY29uZmlnIGZ1c2UzIC0tY2ZsYWdzIDImZ3Q7L2Rldi9udWxsKQomIzQzO0ZVU0UzX0xETElCUyA6PSAkKHNoZWxsIHBrZy1jb25maWcgZnVzZTMgLS1saWJzIDImZ3Q7L2Rldi9udWxsKQomIzQzO2lmbmVxICgkKEZVU0UzX0NGTEFHUyksKQogVEVTVF9HRU5fUFJPR1MgJiM0Mzs9IGZ1c2VfYWNsX2NhY2hlX3Rlc3QKJiM0MztURVNUX0dFTl9QUk9HUyAmIzQzOz0gZnVzZV9lc3RhbGVfdGVzdAogZW5kaWYKIAogaW5jbHVkZSAuLi8uLi9saWIubWsKQEAgLTMwLDUgJiM0MzszMSw4IEBAIGVuZGlmCiAkKE9VVFBVVCkvZnVzZV9tbnQ6IENGTEFHUyAmIzQzOz0gJChWQVJfQ0ZMQUdTKQogJChPVVRQVVQpL2Z1c2VfbW50OiBMRExJQlMgJiM0Mzs9ICQoVkFSX0xETElCUykKIAotJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IENGTEFHUyAmIzQzOz0gJChBQ0xfQ0ZMQUdTKQotJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IExETElCUyAmIzQzOz0gJChBQ0xfTERMSUJTKQomIzQzOyQoT1VUUFVUKS9mdXNlX2FjbF9jYWNoZV90ZXN0OiBDRkxBR1MgJiM0Mzs9ICQoRlVTRTNfQ0ZMQUdTKQomIzQzOyQoT1VUUFVUKS9mdXNlX2FjbF9jYWNoZV90ZXN0OiBMRExJQlMgJiM0Mzs9ICQoRlVTRTNfTERMSUJTKQomIzQzOwomIzQzOyQoT1VUUFVUKS9mdXNlX2VzdGFsZV90ZXN0OiBDRkxBR1MgJiM0Mzs9ICQoRlVTRTNfQ0ZMQUdTKQomIzQzOyQoT1VUUFVUKS9mdXNlX2VzdGFsZV90ZXN0OiBMRExJQlMgJiM0Mzs9ICQoRlVTRTNfTERMSUJTKQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9mdXNlX2VzdGFsZV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL2Z1c2VfZXN0YWxlX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi44MmI4NDJkM2E1ZjdiCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9mdXNlX2VzdGFsZV90ZXN0LmMKQEAgLTAsMCAmIzQzOzEsNDUwIEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKgomIzQzOyAqIFRlc3Q6IGEgcmVxdWVzdCByZWZ1c2VkIGZvciBhbiBpbm9kZSB0aGUgY2xpZW50IHN0aWxsIGhvbGRzIGEgcmVmZXJlbmNlIHRvCiYjNDM7ICoKJiM0MzsgKiBGVVNFX09QRU4sIEZVU0VfR0VUQVRUUiwgRlVTRV9TRVRBVFRSLCBGVVNFX1JFQURMSU5LIGFuZCBGVVNFX1NUQVRGUyBjYXJyeSBhCiYjNDM7ICogbm9kZWlkIHJhdGhlciB0aGFuIGEgcGF0aC4gIFRoZSBjbGllbnQgb25seSBzZW5kcyB0aGVtIGZvciBhbiBpbm9kZSBpdCBoYXMKJiM0MzsgKiBhbHJlYWR5IGxvb2tlZCB1cCBhbmQgaG9sZHMgYSByZWZlcmVuY2UgdG8sIGFuZCBhIHNlcnZlciBvd2VzIHRoZSBjbGllbnQgdGhhdAomIzQzOyAqIGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuICBBIHNlcnZlciB0aGF0IGxldHMgdGhlIGlub2RlIGdvIGVhcmx5LAomIzQzOyAqIGFzIG9uZSBiYWNraW5nIGEgc2hhcmVkIGRpcmVjdG9yeSBkb2VzIHdoZW4gdGhlIG5hbWUgaXMgcmVuYW1lZCBvdmVyLCBhbnN3ZXJzCiYjNDM7ICogd2l0aCBFTk9FTlQuCiYjNDM7ICoKJiM0MzsgKiBPbiBhbiB1bmZpeGVkIGtlcm5lbCB0aGF0IEVOT0VOVCBpcyBwYXNzZWQgb3V0IHVuY2hhbmdlZC4gIFRoZSBwYXRoIHdhbGsgaGFzCiYjNDM7ICogbm8gcmVhc29uIHRvIGRvdWJ0IGl0IGFuZCB0aGUgY2FsbGVyIGlzIHRvbGQgYSBmaWxlIGlzIG1pc3Npbmcgd2hlbiBpdCBuZXZlcgomIzQzOyAqIHN0b3BwZWQgZXhpc3RpbmcuICBDYWxsZXJzIHRoYXQgcmVhZCBhIG1pc3NpbmcgZmlsZSBhcyBhbiBlbXB0eSBvbmUgYWN0IG9uCiYjNDM7ICogdGhlIGVtcHRpbmVzcy4KJiM0MzsgKgomIzQzOyAqIEZpeGVkIChmcy9mdXNlL2ZpbGUuYyBhbmQgZnMvZnVzZS9kaXIuYyk6IEVOT0VOVCBiZWNvbWVzIEVTVEFMRSwgd2hpY2gKJiM0MzsgKiBkZXNjcmliZXMgdGhlIGhhbmRsZSByYXRoZXIgdGhhbiB0aGUgbmFtZS4gIGZpbGVuYW1lX2xvb2t1cCgpIGFuZAomIzQzOyAqIGRvX2ZpbHBfb3BlbigpIGFscmVhZHkgcmV0cnkgd2l0aCBMT09LVVBfUkVWQUwgb24gRVNUQUxFLCBzbyB0aGUgbmFtZSBpcwomIzQzOyAqIHJlc29sdmVkIGFnYWluIGFuZCB0aGUgaW5vZGUgaXQgcmVmZXJzIHRvIG5vdyBpcyB1c2VkLiAgQSBuYW1lIHRoYXQgaGFzCiYjNDM7ICogZ2VudWluZWx5IGdvbmUgYXdheSBmYWlscyB0aGUgcmV0cmllZCBsb29rdXAsIHNvIEVOT0VOVCBzdGlsbCByZWFjaGVzIGEKJiM0MzsgKiBjYWxsZXIgdGhhdCBkZXNlcnZlcyBpdC4KJiM0MzsgKgomIzQzOyAqIE9ubHkgcmVxdWVzdHMgcmVhY2hhYmxlIHRocm91Z2ggYSBwYXRoIHdhbGsgYXJlIGNvdmVyZWQsIGJlY2F1c2UgdGhlIHJldHJ5CiYjNDM7ICogaXMgd2hhdCBtYWtlcyBFU1RBTEUgdXNlZnVsIGFuZCB0aGUgd2FsayBpcyB3aGF0IHBlcmZvcm1zIGl0LiAgQW4gb3BlcmF0aW9uCiYjNDM7ICogb24gYSBkZXNjcmlwdG9yIGFscmVhZHkgb3BlbiBoYXMgbm8gZXF1aXZhbGVudCByZWNvdmVyeS4KJiM0MzsgKgomIzQzOyAqIFRlc3Qgb3V0bGluZToKJiM0MzsgKiAgMS4gTW91bnQgYSBtaW5pbWFsIEZVU0UgZnMgaG9sZGluZyBvbmUgZmlsZS4KJiM0MzsgKiAgMi4gVGhlIHNlcnZlciByZWZ1c2VzIHRoZSBmaXJzdCByZXF1ZXN0IG9mIHRoZSBraW5kIHVuZGVyIHRlc3QgYW5kIGFsbG93cwomIzQzOyAqICAgICBldmVyeSBvbmUgYWZ0ZXIgaXQsIHN0YW5kaW5nIGluIGZvciBhIHNlcnZlciB0aGF0IHJlbGVhc2VkIHRoZSBpbm9kZSBhbmQKJiM0MzsgKiAgICAgaGFzIHNpbmNlIHJlc29sdmVkIHRoZSBuYW1lIGFnYWluLgomIzQzOyAqICAzLiBvcGVuYXQoKSB0aGUgZmlsZS4KJiM0MzsgKiAgICAgQnVnZ3k6ICBFTk9FTlQgcmVhY2hlcyB0aGUgY2FsbGVyLCBvbmUgb3BlbiB3YXMgYXNrZWQgZm9yLiAgRkFJTC4KJiM0MzsgKiAgICAgRml4ZWQ6ICB0aGUgd2FsayByZXRyaWVzLCB0aGUgc2Vjb25kIG9wZW4gaXMgYWxsb3dlZCwgdGhlIGRlc2NyaXB0b3IgaXMKJiM0MzsgKiAgICAgICAgICAgICByZXR1cm5lZCwgdHdvIG9wZW5zIHdlcmUgYXNrZWQgZm9yLiAgUEFTUy4KJiM0MzsgKiAgNC4gc3RhdCgpLCBjaG1vZCgpLCByZWFkbGluaygpIGFuZCBzdGF0ZnMoKSBieSBuYW1lLCB3aGljaCBhcmUgdGhlIHNhbWUKJiM0MzsgKiAgICAgcmVjb3ZlcnkgdGhyb3VnaCBGVVNFX0dFVEFUVFIsIEZVU0VfU0VUQVRUUiwgRlVTRV9SRUFETElOSyBhbmQKJiM0MzsgKiAgICAgRlVTRV9TVEFURlMuICBFYWNoIGlzIHJlYWNoZWQgdGhyb3VnaCBhIHBhdGggd2Fsaywgd2hpY2ggaXMgd2hhdCBtYWtlcwomIzQzOyAqICAgICB0aGUgcmV0cnkgYXZhaWxhYmxlLgomIzQzOyAqICA1LiBPcGVuIGEgbmFtZSB0aGUgc2VydmVyIGRvZXMgbm90IGhhdmUgYXQgYWxsLgomIzQzOyAqICAgICBCb3RoOiAgIEVOT0VOVCwgYmVjYXVzZSB0aGUgbG9va3VwIGZhaWxzIHJhdGhlciB0aGFuIHRoZSBvcGVuLCBhbmQgYQomIzQzOyAqICAgICAgICAgICAgIGZpbGUgdGhhdCBpcyBhYnNlbnQgbXVzdCBzdGlsbCBsb29rIGFic2VudC4KJiM0MzsgKi8KJiM0MzsKJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFCiYjNDM7I2RlZmluZSBGVVNFX1VTRV9WRVJTSU9OIDM0CiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2Vycm5vLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2Z1c2VfbG93bGV2ZWwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3B0aHJlYWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGJvb2wuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0dmZzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy92ZnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDsuLi8uLi9rc2VsZnRlc3RfaGFybmVzcy5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIEZJTEVfTkFNRQkmIzM0O2hlbGQmIzM0OwomIzQzOyNkZWZpbmUgTElOS19OQU1FCSYjMzQ7aGVsZC1saW5rJiMzNDsKJiM0MzsjZGVmaW5lIEFCU0VOVF9OQU1FCSYjMzQ7bm8tc3VjaC1maWxlJiMzNDsKJiM0MzsjZGVmaW5lIEZJTEVfSU5PCTIKJiM0MzsjZGVmaW5lIExJTktfSU5PCTMKJiM0MzsjZGVmaW5lIENPTlRFTlRTCSYjMzQ7cHJlc2VudFxuJiMzNDsKJiM0MzsjZGVmaW5lIExJTktfVEFSR0VUCUZJTEVfTkFNRQomIzQzOwomIzQzOy8qCiYjNDM7ICogV2hpY2ggcmVxdWVzdCB0aGUgc2VydmVyIHJlZnVzZXMsIGFuZCBob3cgbWFueSB0aW1lcy4gIFNoYXJlZCB3aXRoIHRoZQomIzQzOyAqIGRhZW1vbiB0aHJlYWQ7IG9uZSB0ZXN0IHJ1bnMgYXQgYSB0aW1lLCBzbyBwbGFpbiBpbnRzLgomIzQzOyAqCiYjNDM7ICogRXZlcnkgb25lIG9mIHRoZXNlIG5hbWVzIGFuIGlub2RlIGJ5IG5vZGVpZCByYXRoZXIgdGhhbiBieSBuYW1lLCBzbyBhCiYjNDM7ICogcmVmdXNhbCBvZiBhbnkgb2YgdGhlbSBpcyBkZXNjcmliaW5nIGEgaGFuZGxlIHJhdGhlciB0aGFuIGEgbWlzc2luZyBmaWxlLgomIzQzOyAqIEZVU0VfTE9PS1VQIGlzIGRlbGliZXJhdGVseSBhYnNlbnQ6IGl0IGNhcnJpZXMgYSBuYW1lLCBzbyBpdHMgRU5PRU5UIGlzIGFuCiYjNDM7ICogYW5zd2VyIHJhdGhlciB0aGFuIGEgZmF1bHQsIGFuZCBhYnNlbnRfbmFtZV9zdGlsbF9yZXBvcnRzX2Fic2VudCBjb3ZlcnMgaXQuCiYjNDM7ICovCiYjNDM7ZW51bSByZWZ1c2Vfd2hhdCB7CiYjNDM7CVJFRlVTRV9OT1RISU5HLAomIzQzOwlSRUZVU0VfT1BFTiwKJiM0MzsJUkVGVVNFX0dFVEFUVFIsCiYjNDM7CVJFRlVTRV9TRVRBVFRSLAomIzQzOwlSRUZVU0VfUkVBRExJTkssCiYjNDM7CVJFRlVTRV9TVEFURlMsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IHsKJiM0MzsJZW51bSByZWZ1c2Vfd2hhdCB3aGF0OwomIzQzOwlpbnQgcmVmdXNhbHNfbGVmdDsKJiM0MzsJaW50IG9wZW5zX3NlZW47CiYjNDM7CWludCBnZXRhdHRyc19zZWVuOwomIzQzOwlpbnQgc2V0YXR0cnNfc2VlbjsKJiM0MzsJaW50IHJlYWRsaW5rc19zZWVuOwomIzQzOwlpbnQgc3RhdGZzc19zZWVuOwomIzQzO30gZ19kczsKJiM0MzsKJiM0MzsvKiBUcnVlIG9uY2UsIGZvciB0aGUgcmVxdWVzdCB1bmRlciB0ZXN0LCBhbmQgdGhlbiBuZXZlciBhZ2Fpbi4gKi8KJiM0MztzdGF0aWMgYm9vbCByZWZ1c2Vfbm93KGVudW0gcmVmdXNlX3doYXQgd2hhdCkKJiM0Mzt7CiYjNDM7CWlmIChnX2RzLndoYXQgIT0gd2hhdCB8fCBnX2RzLnJlZnVzYWxzX2xlZnQgJmx0Oz0gMCkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJZ19kcy5yZWZ1c2Fsc19sZWZ0LS07CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBmaWxsX2F0dHIoZnVzZV9pbm9fdCBpbm8sIHN0cnVjdCBzdGF0ICpzdCkKJiM0Mzt7CiYjNDM7CW1lbXNldChzdCwgMCwgc2l6ZW9mKCpzdCkpOwomIzQzOwlzdC0mZ3Q7c3RfaW5vID0gaW5vOwomIzQzOwkvKgomIzQzOwkgKiBPd25lZCBieSB3aG9ldmVyIHJ1bnMgdGhlIHRlc3QsIHNvIHRoYXQgY2htb2QoKSBpcyBhIHJlcXVlc3QgdGhlCiYjNDM7CSAqIGtlcm5lbCB3aWxsIGNhcnJ5IHRocm91Z2ggdG8gdGhlIHNlcnZlciByYXRoZXIgdGhhbiByZWZ1c2UgaXRzZWxmLgomIzQzOwkgKi8KJiM0MzsJc3QtJmd0O3N0X3VpZCA9IGdldHVpZCgpOwomIzQzOwlzdC0mZ3Q7c3RfZ2lkID0gZ2V0Z2lkKCk7CiYjNDM7CWlmIChpbm8gPT0gRlVTRV9ST09UX0lEKSB7CiYjNDM7CQlzdC0mZ3Q7c3RfbW9kZSA9IFNfSUZESVIgfCAwNzU1OwomIzQzOwkJc3QtJmd0O3N0X25saW5rID0gMjsKJiM0MzsJfSBlbHNlIGlmIChpbm8gPT0gTElOS19JTk8pIHsKJiM0MzsJCXN0LSZndDtzdF9tb2RlID0gU19JRkxOSyB8IDA3Nzc7CiYjNDM7CQlzdC0mZ3Q7c3RfbmxpbmsgPSAxOwomIzQzOwkJc3QtJmd0O3N0X3NpemUgPSBzaXplb2YoTElOS19UQVJHRVQpIC0gMTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXN0LSZndDtzdF9tb2RlID0gU19JRlJFRyB8IDA2NDQ7CiYjNDM7CQlzdC0mZ3Q7c3RfbmxpbmsgPSAxOwomIzQzOwkJc3QtJmd0O3N0X3NpemUgPSBzaXplb2YoQ09OVEVOVFMpIC0gMTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0X2xvb2t1cChmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZnVzZV9lbnRyeV9wYXJhbSBlOwomIzQzOwlmdXNlX2lub190IGlubzsKJiM0MzsKJiM0MzsJaWYgKHBhcmVudCAhPSBGVVNFX1JPT1RfSUQpCiYjNDM7CQlpbm8gPSAwOwomIzQzOwllbHNlIGlmICghc3RyY21wKG5hbWUsIEZJTEVfTkFNRSkpCiYjNDM7CQlpbm8gPSBGSUxFX0lOTzsKJiM0MzsJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCBMSU5LX05BTUUpKQomIzQzOwkJaW5vID0gTElOS19JTk87CiYjNDM7CWVsc2UKJiM0MzsJCWlubyA9IDA7CiYjNDM7CiYjNDM7CWlmICghaW5vKSB7CiYjNDM7CQlmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJbWVtc2V0KCZhbXA7ZSwgMCwgc2l6ZW9mKGUpKTsKJiM0MzsJZS5pbm8gPSBpbm87CiYjNDM7CWUuYXR0cl90aW1lb3V0ID0gMDsKJiM0MzsJZS5lbnRyeV90aW1lb3V0ID0gMDsKJiM0MzsJZmlsbF9hdHRyKGlubywgJmFtcDtlLmF0dHIpOwomIzQzOwlmdXNlX3JlcGx5X2VudHJ5KHJlcSwgJmFtcDtlKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdF9nZXRhdHRyKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubywKJiM0MzsJCSAgICAgIHN0cnVjdCBmdXNlX2ZpbGVfaW5mbyAqZmkpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc3RhdCBzdDsKJiM0MzsKJiM0MzsJKHZvaWQpZmk7CiYjNDM7CS8qIFRoZSByb290IGlzIGxlZnQgYWxvbmU7IHJlZnVzaW5nIGl0IHdvdWxkIGJyZWFrIHRoZSBtb3VudCBpdHNlbGYuICovCiYjNDM7CWlmIChpbm8gPT0gRklMRV9JTk8pIHsKJiM0MzsJCWdfZHMuZ2V0YXR0cnNfc2VlbiYjNDM7JiM0Mzs7CiYjNDM7CQlpZiAocmVmdXNlX25vdyhSRUZVU0VfR0VUQVRUUikpIHsKJiM0MzsJCQlmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7CiYjNDM7CQkJcmV0dXJuOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CWZpbGxfYXR0cihpbm8sICZhbXA7c3QpOwomIzQzOwlmdXNlX3JlcGx5X2F0dHIocmVxLCAmYW1wO3N0LCAwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdF9vcGVuKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubywgc3RydWN0IGZ1c2VfZmlsZV9pbmZvICpmaSkKJiM0Mzt7CiYjNDM7CWlmIChpbm8gIT0gRklMRV9JTk8pIHsKJiM0MzsJCWZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwomIzQzOwlnX2RzLm9wZW5zX3NlZW4mIzQzOyYjNDM7OwomIzQzOwlpZiAocmVmdXNlX25vdyhSRUZVU0VfT1BFTikpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBUaGUgaW5vZGUgaXMgZ29uZSBhcyBmYXIgYXMgdGhpcyBzZXJ2ZXIgaXMgY29uY2VybmVkLCBldmVuCiYjNDM7CQkgKiB0aG91Z2ggdGhlIGNsaWVudCBpcyBob2xkaW5nIGEgcmVmZXJlbmNlIHRvIGl0IGFuZCBhc2tlZCBieQomIzQzOwkJICogbm9kZWlkIHJhdGhlciB0aGFuIGJ5IG5hbWUuCiYjNDM7CQkgKi8KJiM0MzsJCWZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwlmdXNlX3JlcGx5X29wZW4ocmVxLCBmaSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRfcmVhZChmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8sIHNpemVfdCBzaXplLCBvZmZfdCBvZmYsCiYjNDM7CQkgICBzdHJ1Y3QgZnVzZV9maWxlX2luZm8gKmZpKQomIzQzO3sKJiM0MzsJc2l6ZV90IGxlbiA9IHNpemVvZihDT05URU5UUykgLSAxOwomIzQzOwomIzQzOwkodm9pZClmaTsKJiM0MzsJaWYgKGlubyAhPSBGSUxFX0lOTykgewomIzQzOwkJZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CWlmICgoc2l6ZV90KW9mZiAmZ3Q7PSBsZW4pIHsKJiM0MzsJCWZ1c2VfcmVwbHlfYnVmKHJlcSwgTlVMTCwgMCk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsJaWYgKG9mZiAmIzQzOyBzaXplICZndDsgbGVuKQomIzQzOwkJc2l6ZSA9IGxlbiAtIG9mZjsKJiM0MzsJZnVzZV9yZXBseV9idWYocmVxLCBDT05URU5UUyAmIzQzOyBvZmYsIHNpemUpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0X3NldGF0dHIoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgaW5vLCBzdHJ1Y3Qgc3RhdCAqYXR0ciwKJiM0MzsJCSAgICAgIGludCB0b19zZXQsIHN0cnVjdCBmdXNlX2ZpbGVfaW5mbyAqZmkpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc3RhdCBzdDsKJiM0MzsKJiM0MzsJKHZvaWQpYXR0cjsKJiM0MzsJKHZvaWQpdG9fc2V0OwomIzQzOwkodm9pZClmaTsKJiM0MzsJaWYgKGlubyA9PSBGSUxFX0lOTykgewomIzQzOwkJZ19kcy5zZXRhdHRyc19zZWVuJiM0MzsmIzQzOzsKJiM0MzsJCWlmIChyZWZ1c2Vfbm93KFJFRlVTRV9TRVRBVFRSKSkgewomIzQzOwkJCWZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTsKJiM0MzsJCQlyZXR1cm47CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJZmlsbF9hdHRyKGlubywgJmFtcDtzdCk7CiYjNDM7CWZ1c2VfcmVwbHlfYXR0cihyZXEsICZhbXA7c3QsIDApOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0X3JlYWRsaW5rKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubykKJiM0Mzt7CiYjNDM7CWlmIChpbm8gIT0gTElOS19JTk8pIHsKJiM0MzsJCWZ1c2VfcmVwbHlfZXJyKHJlcSwgRUlOVkFMKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwomIzQzOwlnX2RzLnJlYWRsaW5rc19zZWVuJiM0MzsmIzQzOzsKJiM0MzsJaWYgKHJlZnVzZV9ub3coUkVGVVNFX1JFQURMSU5LKSkgewomIzQzOwkJZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CWZ1c2VfcmVwbHlfcmVhZGxpbmsocmVxLCBMSU5LX1RBUkdFVCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRfc3RhdGZzKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzdGF0dmZzIHNmczsKJiM0MzsKJiM0MzsJKHZvaWQpaW5vOwomIzQzOwlnX2RzLnN0YXRmc3Nfc2VlbiYjNDM7JiM0Mzs7CiYjNDM7CWlmIChyZWZ1c2Vfbm93KFJFRlVTRV9TVEFURlMpKSB7CiYjNDM7CQlmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJbWVtc2V0KCZhbXA7c2ZzLCAwLCBzaXplb2Yoc2ZzKSk7CiYjNDM7CXNmcy5mX2JzaXplID0gNTEyOwomIzQzOwlzZnMuZl9mcnNpemUgPSA1MTI7CiYjNDM7CXNmcy5mX25hbWVtYXggPSBOQU1FX01BWDsKJiM0MzsJZnVzZV9yZXBseV9zdGF0ZnMocmVxLCAmYW1wO3Nmcyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgZnVzZV9sb3dsZXZlbF9vcHMgZnNfb3BzID0gewomIzQzOwkubG9va3VwCQk9IHRfbG9va3VwLAomIzQzOwkuZ2V0YXR0cgk9IHRfZ2V0YXR0ciwKJiM0MzsJLnNldGF0dHIJPSB0X3NldGF0dHIsCiYjNDM7CS5yZWFkbGluawk9IHRfcmVhZGxpbmssCiYjNDM7CS5zdGF0ZnMJCT0gdF9zdGF0ZnMsCiYjNDM7CS5vcGVuCQk9IHRfb3BlbiwKJiM0MzsJLnJlYWQJCT0gdF9yZWFkLAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKnJ1bl9kYWVtb24odm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJZnVzZV9zZXNzaW9uX2xvb3AoKHN0cnVjdCBmdXNlX3Nlc3Npb24gKilhcmcpOwomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLS0tLSBrc2VsZnRlc3QgaGFybmVzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KJiM0MzsKJiM0MztGSVhUVVJFKG9wZW5fZXN0YWxlKSB7CiYjNDM7CXN0cnVjdCBmdXNlX3Nlc3Npb24gKnNlOwomIzQzOwljaGFyICAgICAgICAgICAgICAgICBtb3VudHBvaW50W1BBVEhfTUFYXTsKJiM0MzsJY2hhciAgICAgICAgICAgICAgICAgZmlsZV9wYXRoW1BBVEhfTUFYXTsKJiM0MzsJY2hhciAgICAgICAgICAgICAgICAgbGlua19wYXRoW1BBVEhfTUFYXTsKJiM0MzsJY2hhciAgICAgICAgICAgICAgICAgYWJzZW50X3BhdGhbUEFUSF9NQVhdOwomIzQzOwlwdGhyZWFkX3QgICAgICAgICAgICB0aHJlYWQ7CiYjNDM7fTsKJiM0MzsKJiM0MztGSVhUVVJFX1NFVFVQKG9wZW5fZXN0YWxlKQomIzQzO3sKJiM0MzsJY2hhciAqZnVzZV9hcmd2W10gPSB7ICYjMzQ7ZnVzZV9lc3RhbGVfdGVzdCYjMzQ7LCBOVUxMIH07CiYjNDM7CXN0cnVjdCBmdXNlX2FyZ3MgYXJncyA9IEZVU0VfQVJHU19JTklUKDEsIGZ1c2VfYXJndik7CiYjNDM7CiYjNDM7CW1lbXNldCgmYW1wO2dfZHMsIDAsIHNpemVvZihnX2RzKSk7CiYjNDM7CWdfZHMud2hhdCA9IFJFRlVTRV9OT1RISU5HOwomIzQzOwlnX2RzLnJlZnVzYWxzX2xlZnQgPSAxOwomIzQzOwomIzQzOwlzdHJjcHkoc2VsZi0mZ3Q7bW91bnRwb2ludCwgJiMzNDsvdG1wL29wZW5fZXN0YWxlX3Rlc3RfWFhYWFhYJiMzNDspOwomIzQzOwlpZiAoIW1rZHRlbXAoc2VsZi0mZ3Q7bW91bnRwb2ludCkpCiYjNDM7CQlTS0lQKHJldHVybiwgJiMzNDtta2R0ZW1wOiAlcyYjMzQ7LCBzdHJlcnJvcihlcnJubykpOwomIzQzOwomIzQzOwlzbnByaW50ZihzZWxmLSZndDtmaWxlX3BhdGgsIHNpemVvZihzZWxmLSZndDtmaWxlX3BhdGgpLAomIzQzOwkJICYjMzQ7JXMvJiMzNDsgRklMRV9OQU1FLCBzZWxmLSZndDttb3VudHBvaW50KTsKJiM0MzsJc25wcmludGYoc2VsZi0mZ3Q7bGlua19wYXRoLCBzaXplb2Yoc2VsZi0mZ3Q7bGlua19wYXRoKSwKJiM0MzsJCSAmIzM0OyVzLyYjMzQ7IExJTktfTkFNRSwgc2VsZi0mZ3Q7bW91bnRwb2ludCk7CiYjNDM7CXNucHJpbnRmKHNlbGYtJmd0O2Fic2VudF9wYXRoLCBzaXplb2Yoc2VsZi0mZ3Q7YWJzZW50X3BhdGgpLAomIzQzOwkJICYjMzQ7JXMvJiMzNDsgQUJTRU5UX05BTUUsIHNlbGYtJmd0O21vdW50cG9pbnQpOwomIzQzOwomIzQzOwlzZWxmLSZndDtzZSA9IGZ1c2Vfc2Vzc2lvbl9uZXcoJmFtcDthcmdzLCAmYW1wO2ZzX29wcywgc2l6ZW9mKGZzX29wcyksIE5VTEwpOwomIzQzOwlpZiAoIXNlbGYtJmd0O3NlKSB7CiYjNDM7CQlybWRpcihzZWxmLSZndDttb3VudHBvaW50KTsKJiM0MzsJCVNLSVAocmV0dXJuLCAmIzM0O2Z1c2Vfc2Vzc2lvbl9uZXcgZmFpbGVkJiMzNDspOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChmdXNlX3Nlc3Npb25fbW91bnQoc2VsZi0mZ3Q7c2UsIHNlbGYtJmd0O21vdW50cG9pbnQpKSB7CiYjNDM7CQlmdXNlX3Nlc3Npb25fZGVzdHJveShzZWxmLSZndDtzZSk7CiYjNDM7CQlybWRpcihzZWxmLSZndDttb3VudHBvaW50KTsKJiM0MzsJCVNLSVAocmV0dXJuLCAmIzM0O2Z1c2Vfc2Vzc2lvbl9tb3VudCBmYWlsZWQgKG5vIGZ1c2VybW91bnQzIG9yIG5vIHByaXZpbGVnZXMpJiMzNDspOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChwdGhyZWFkX2NyZWF0ZSgmYW1wO3NlbGYtJmd0O3RocmVhZCwgTlVMTCwgcnVuX2RhZW1vbiwgc2VsZi0mZ3Q7c2UpKSB7CiYjNDM7CQlmdXNlX3Nlc3Npb25fdW5tb3VudChzZWxmLSZndDtzZSk7CiYjNDM7CQlmdXNlX3Nlc3Npb25fZGVzdHJveShzZWxmLSZndDtzZSk7CiYjNDM7CQlybWRpcihzZWxmLSZndDttb3VudHBvaW50KTsKJiM0MzsJCVNLSVAocmV0dXJuLCAmIzM0O3B0aHJlYWRfY3JlYXRlOiAlcyYjMzQ7LCBzdHJlcnJvcihlcnJubykpOwomIzQzOwl9CiYjNDM7CiYjNDM7CWZ1c2Vfb3B0X2ZyZWVfYXJncygmYW1wO2FyZ3MpOwomIzQzO30KJiM0MzsKJiM0MztGSVhUVVJFX1RFQVJET1dOKG9wZW5fZXN0YWxlKQomIzQzO3sKJiM0MzsJZnVzZV9zZXNzaW9uX2V4aXQoc2VsZi0mZ3Q7c2UpOwomIzQzOwlmdXNlX3Nlc3Npb25fdW5tb3VudChzZWxmLSZndDtzZSk7CiYjNDM7CXB0aHJlYWRfam9pbihzZWxmLSZndDt0aHJlYWQsIE5VTEwpOwomIzQzOwlmdXNlX3Nlc3Npb25fZGVzdHJveShzZWxmLSZndDtzZSk7CiYjNDM7CXJtZGlyKHNlbGYtJmd0O21vdW50cG9pbnQpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfb3Blbl9pc19yZXRyaWVkKQomIzQzO3sKJiM0MzsJaW50IGZkOwomIzQzOwomIzQzOwlnX2RzLndoYXQgPSBSRUZVU0VfT1BFTjsKJiM0MzsKJiM0MzsJZmQgPSBvcGVuKHNlbGYtJmd0O2ZpbGVfcGF0aCwgT19SRE9OTFkpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgcmVmdXNhbCBkZXNjcmliZXMgYSBoYW5kbGUgdGhlIHNlcnZlciBzaG91bGQgaGF2ZSBob25vdXJlZCwgc28KJiM0MzsJICogdGhlIHdhbGsgaXMgZW50aXRsZWQgdG8gcmVzb2x2ZSB0aGUgbmFtZSBhZ2FpbiBhbmQgb3BlbiB3aGF0IGl0CiYjNDM7CSAqIHJlZmVycyB0byBub3cuIFJlcG9ydGluZyB0aGUgZmlsZSBtaXNzaW5nIGluc3RlYWQgZW5kcyB0aGUgd2Fsay4KJiM0MzsJICovCiYjNDM7CUFTU0VSVF9HRShmZCwgMCkgewomIzQzOwkJVEhfTE9HKCYjMzQ7b3BlbiBmYWlsZWQgd2l0aCAlcyBhZnRlciAlZCBvcGVuIHJlcXVlc3QocykmIzM0OywKJiM0MzsJCSAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMub3BlbnNfc2Vlbik7CiYjNDM7CX0KJiM0MzsJRVhQRUNUX0VRKDIsIGdfZHMub3BlbnNfc2Vlbik7CiYjNDM7CWNsb3NlKGZkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX2dldGF0dHJfb25fcGF0aF9pc19yZXRyaWVkKQomIzQzO3sKJiM0MzsJc3RydWN0IHN0YXQgc3Q7CiYjNDM7CiYjNDM7CWdfZHMud2hhdCA9IFJFRlVTRV9HRVRBVFRSOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBSZWFjaGVkIGJ5IG5hbWUsIHNvIHRoZSB3YWxrIGNhbiByZXNvbHZlIGl0IGFnYWluIGFuZCBhc2sgYSBzZWNvbmQKJiM0MzsJICogdGltZSwgdGhlIHNhbWUgcmVjb3ZlcnkgdGhlIG9wZW4gZ2V0cy4KJiM0MzsJICovCiYjNDM7CUFTU0VSVF9FUSgwLCBzdGF0KHNlbGYtJmd0O2ZpbGVfcGF0aCwgJmFtcDtzdCkpIHsKJiM0MzsJCVRIX0xPRygmIzM0O3N0YXQgZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgZ2V0YXR0ciByZXF1ZXN0KHMpJiMzNDssCiYjNDM7CQkgICAgICAgc3RyZXJyb3IoZXJybm8pLCBnX2RzLmdldGF0dHJzX3NlZW4pOwomIzQzOwl9CiYjNDM7CUVYUEVDVF9HVChnX2RzLmdldGF0dHJzX3NlZW4sIDEpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfc2V0YXR0cl9vbl9wYXRoX2lzX3JldHJpZWQpCiYjNDM7ewomIzQzOwlnX2RzLndoYXQgPSBSRUZVU0VfU0VUQVRUUjsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogY2htb2QoKSByZWFjaGVzIHRoZSBpbm9kZSBieSBuYW1lLCBzbyB0aGUgc2FtZSByZXRyeSBhcHBsaWVzOiB0aGUKJiM0MzsJICogcmVmdXNhbCBkZXNjcmliZXMgYSBoYW5kbGUgYW5kIHRoZSB3YWxrIG1heSByZXNvbHZlIHRoZSBuYW1lIGFnYWluLgomIzQzOwkgKi8KJiM0MzsJQVNTRVJUX0VRKDAsIGNobW9kKHNlbGYtJmd0O2ZpbGVfcGF0aCwgMDYwMCkpIHsKJiM0MzsJCVRIX0xPRygmIzM0O2NobW9kIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHNldGF0dHIgcmVxdWVzdChzKSYjMzQ7LAomIzQzOwkJICAgICAgIHN0cmVycm9yKGVycm5vKSwgZ19kcy5zZXRhdHRyc19zZWVuKTsKJiM0MzsJfQomIzQzOwlFWFBFQ1RfR1QoZ19kcy5zZXRhdHRyc19zZWVuLCAxKTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX3JlYWRsaW5rX29uX3BhdGhfaXNfcmV0cmllZCkKJiM0Mzt7CiYjNDM7CWNoYXIgYnVmW1BBVEhfTUFYXTsKJiM0MzsJc3NpemVfdCBuOwomIzQzOwomIzQzOwlnX2RzLndoYXQgPSBSRUZVU0VfUkVBRExJTks7CiYjNDM7CiYjNDM7CW4gPSByZWFkbGluayhzZWxmLSZndDtsaW5rX3BhdGgsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKTsKJiM0MzsJQVNTRVJUX0dFKG4sIDApIHsKJiM0MzsJCVRIX0xPRygmIzM0O3JlYWRsaW5rIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHJlYWRsaW5rIHJlcXVlc3QocykmIzM0OywKJiM0MzsJCSAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMucmVhZGxpbmtzX3NlZW4pOwomIzQzOwl9CiYjNDM7CWJ1ZltuXSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJRVhQRUNUX1NUUkVRKExJTktfVEFSR0VULCBidWYpOwomIzQzOwlFWFBFQ1RfR1QoZ19kcy5yZWFkbGlua3Nfc2VlbiwgMSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihvcGVuX2VzdGFsZSwgcmVmdXNlZF9zdGF0ZnNfb25fcGF0aF9pc19yZXRyaWVkKQomIzQzO3sKJiM0MzsJc3RydWN0IHN0YXRmcyBzZnM7CiYjNDM7CiYjNDM7CWdfZHMud2hhdCA9IFJFRlVTRV9TVEFURlM7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIHN0YXRmcygpIGRlc2NyaWJlcyB0aGUgbW91bnQgcmF0aGVyIHRoYW4gdGhlIGZpbGUsIGJ1dCBpdCBpcyBzdGlsbAomIzQzOwkgKiByZWFjaGVkIHRocm91Z2ggYSBwYXRoIHdhbGssIHNvIGEgcmVmdXNhbCB0aGF0IG5hbWVzIGEgaGFuZGxlIGlzCiYjNDM7CSAqIHJldHJpZWQgdGhlIHNhbWUgd2F5LgomIzQzOwkgKi8KJiM0MzsJQVNTRVJUX0VRKDAsIHN0YXRmcyhzZWxmLSZndDtmaWxlX3BhdGgsICZhbXA7c2ZzKSkgewomIzQzOwkJVEhfTE9HKCYjMzQ7c3RhdGZzIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHN0YXRmcyByZXF1ZXN0KHMpJiMzNDssCiYjNDM7CQkgICAgICAgc3RyZXJyb3IoZXJybm8pLCBnX2RzLnN0YXRmc3Nfc2Vlbik7CiYjNDM7CX0KJiM0MzsJRVhQRUNUX0dUKGdfZHMuc3RhdGZzc19zZWVuLCAxKTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKG9wZW5fZXN0YWxlLCBhYnNlbnRfbmFtZV9zdGlsbF9yZXBvcnRzX2Fic2VudCkKJiM0Mzt7CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogSGVyZSBpdCBpcyB0aGUgbG9va3VwIHRoYXQgZmFpbHMgcmF0aGVyIHRoYW4gdGhlIG9wZW4sIHNvIG5vdGhpbmcgaXMKJiM0MzsJICogYmVpbmcgZGVzY3JpYmVkIGFzIHN0YWxlIGFuZCB0aGUgY2FsbGVyIG11c3Qgc3RpbGwgYmUgdG9sZCB0aGUgbmFtZQomIzQzOwkgKiBpcyBub3QgdGhlcmUuCiYjNDM7CSAqLwomIzQzOwlmZCA9IG9wZW4oc2VsZi0mZ3Q7YWJzZW50X3BhdGgsIE9fUkRPTkxZKTsKJiM0MzsJQVNTRVJUX0xUKGZkLCAwKTsKJiM0MzsJRVhQRUNUX0VRKEVOT0VOVCwgZXJybm8pOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0hBUk5FU1NfTUFJTgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAwMDowNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDEzMgoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDE0NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhpcyBQYXRjaCBTZXJpZXMgZm9yIEZ1enppbmcgUG90ZW50aWFsKioKCk9rYXksIHNvIHRoZSB0YXNrIGF0IGhhbmQgaXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgTGludXgga2VybmVsIHBhdGNoIHNlcmllcyBtZXJpdHMgZnV6emluZyBhdHRlbnRpb24uIEFuZCBpZiBpdCBkb2VzLCB0aGUgbmV4dCBzdGVwIGlzIHRvIHBpbnBvaW50IHRoZSBjcnVjaWFsIGBGb2N1c1N5bWJvbHNgIGFuZCBgRW5hYmxlQ29uZmlnc2AgdGhhdCB3aWxsIG1ha2UgZnV6emluZyBtb3N0IGVmZmVjdGl2ZS4gTGV0JiMzOTtzIGRpZyBpbi4gVGhlIGluaXRpYWwgZ2xhbmNlIGF0IHRoZSBwYXRjaCByZXZlYWxzIGl0cyBzY29wZTogaXQmIzM5O3MgcGxheWluZyBpbiB0aGUgYGZzL2Z1c2VgIGRpcmVjdG9yeSwgdG91Y2hpbmcgYGRpci5jYCwgYGZpbGUuY2AsIGBmdXNlX2kuaGAsIGBpbm9kZS5jYCwgYW5kIGB2aXJ0aW9fZnMuY2AsIHBsdXMgYSBjaHVuayBvZiB0aGUgc2VsZi10ZXN0cyBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uLi5gLiBUaGlzIHRlbGxzIG1lIHdlJiMzOTtyZSBsb29raW5nIGF0IHBvdGVudGlhbGx5IHNlbnNpdGl2ZSBmaWxlc3lzdGVtIGludGVyYWN0aW9ucyB3aXRoaW4gdGhlIEZVU0UgKEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlKSBjb250ZXh0LCB3aGljaCBpcyBkZWZpbml0ZWx5IHNvbWV0aGluZyBJIHdhbnQgdG8gdGFrZSBhIGNsb3NlciBsb29rIGF0LgoKTm93LCBpdCYjMzk7cyB0aW1lIHRvIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzOiBJJiMzOTtsbCBzdGFydCBieSBleGFtaW5pbmcgdGhlIHJlbGV2YW50IGBLY29uZmlnYCBmaWxlcy4gVGhhdCYjMzk7cyB0aGUgZ28tdG8gZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGRlcGVuZGVuY2llcyBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zIGF0IHBsYXkuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzIHRvIHVzZSBteSBncmVwcGVyIG9yIHBlcmhhcHMgYSBxdWljayBgcmVhZC1maWxlYCB0byBnZXQgYSBoYW5kbGUgb24gd2hhdCYjMzk7cyBhdmFpbGFibGUgYW5kIGNvbmRpdGlvbmFsIG9uIHRoaXMgc2VjdGlvbiBvZiBjb2RlLiBUaGUgYWltIGlzIHRvIHVuZGVyc3RhbmQgd2hhdCBidWlsZCBmbGFncyBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSByZWxldmFudCBhbmQgaG93IHRoZXkgbWlnaHQgaW5mbHVlbmNlIHRoZSBhdHRhY2sgc3VyZmFjZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAwMDowNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtGVVNFX0ZTJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZnVzZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9mdXNlL0tjb25maWctMS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbmZzL2Z1c2UvS2NvbmZpZzoyOmNvbmZpZyBGVVNFX0ZTXG5mcy9mdXNlL0tjb25maWctMy1cdHRyaXN0YXRlIFwmIzM0O0ZVU0UgKEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlKSBzdXBwb3J0XCYjMzQ7XG4tLVxuZnMvZnVzZS9LY29uZmlnPTIyPWNvbmZpZyBDVVNFXG5mcy9mdXNlL0tjb25maWctMjMtXHR0cmlzdGF0ZSBcJiMzNDtDaGFyYWN0ZXIgZGV2aWNlIGluIFVzZXJzcGFjZSBzdXBwb3J0XCYjMzQ7XG5mcy9mdXNlL0tjb25maWc6MjQ6XHRkZXBlbmRzIG9uIEZVU0VfRlNcbmZzL2Z1c2UvS2NvbmZpZy0yNS1cdGhlbHBcbi0tXG5mcy9mdXNlL0tjb25maWc9MzI9Y29uZmlnIFZJUlRJT19GU1xuZnMvZnVzZS9LY29uZmlnLTMzLVx0dHJpc3RhdGUgXCYjMzQ7VmlydGlvIEZpbGVzeXN0ZW1cJiMzNDtcbmZzL2Z1c2UvS2NvbmZpZzozNDpcdGRlcGVuZHMgb24gRlVTRV9GU1xuZnMvZnVzZS9LY29uZmlnLTM1LVx0c2VsZWN0IFZJUlRJT1xuLS1cbmZzL2Z1c2UvS2NvbmZpZz01Nz1jb25maWcgRlVTRV9QQVNTVEhST1VHSFxuLS1cbmZzL2Z1c2UvS2NvbmZpZy01OS1cdGRlZmF1bHQgeVxuZnMvZnVzZS9LY29uZmlnOjYwOlx0ZGVwZW5kcyBvbiBGVVNFX0ZTXG5mcy9mdXNlL0tjb25maWctNjEtXHRzZWxlY3QgRlNfU1RBQ0tcbi0tXG5mcy9mdXNlL0tjb25maWc9Njg9Y29uZmlnIEZVU0VfSU9fVVJJTkdcbi0tXG5mcy9mdXNlL0tjb25maWctNzAtXHRkZWZhdWx0IHlcbmZzL2Z1c2UvS2NvbmZpZzo3MTpcdGRlcGVuZHMgb24gRlVTRV9GU1xuZnMvZnVzZS9LY29uZmlnLTcyLVx0ZGVwZW5kcyBvbiBJT19VUklOR1xuLS1cbmZzL2Z1c2UvTWFrZWZpbGU9Nz1jY2ZsYWdzLXkgPSAtSSQoc3JjKVxuZnMvZnVzZS9NYWtlZmlsZS04LVxuZnMvZnVzZS9NYWtlZmlsZTo5Om9iai0kKENPTkZJR19GVVNFX0ZTKSAmIzQzOz0gZnVzZS5vXG5mcy9mdXNlL01ha2VmaWxlLTEwLW9iai0kKENPTkZJR19DVVNFKSAmIzQzOz0gY3VzZS5vXG4tLVxuZnMvZnVzZS9kaXIuYz0xOTQ2PXN0YXRpYyBpbnQgZnVzZV9kaXJfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCxcbi0tXG5mcy9mdXNlL2Rpci5jLTE5NTktXHRpbm9kZV9sb2NrKGlub2RlKTtcbmZzL2Z1c2UvZGlyLmM6MTk2MDpcdGVyciA9IGZ1c2VfZnN5bmNfY29tbW9uKGZpbGUsIHN0YXJ0LCBlbmQsIGRhdGFzeW5jLCBGVVNFX0ZTWU5DRElSKTtcbmZzL2Z1c2UvZGlyLmMtMTk2MS1cdGlmIChlcnIgPT0gLUVOT1NZUykge1xuLS1cbmZzL2Z1c2UvZmlsZS5jPTUzMT1pbnQgZnVzZV9mc3luY19jb21tb24oc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCxcbi0tXG5mcy9mdXNlL2ZpbGUuYy01NDEtXHRpbmFyZy5maCA9IGZmLVx1MDAzZWZoO1xuZnMvZnVzZS9maWxlLmM6NTQyOlx0aW5hcmcuZnN5bmNfZmxhZ3MgPSBkYXRhc3luYyA/IEZVU0VfRlNZTkNfRkRBVEFTWU5DIDogMDtcbmZzL2Z1c2UvZmlsZS5jLTU0My1cdGFyZ3Mub3Bjb2RlID0gb3Bjb2RlO1xuLS1cbmZzL2Z1c2UvZmlsZS5jPTU1MT1zdGF0aWMgaW50IGZ1c2VfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCxcbi0tXG5mcy9mdXNlL2ZpbGUuYy01ODktXG5mcy9mdXNlL2ZpbGUuYzo1OTA6XHRlcnIgPSBmdXNlX2ZzeW5jX2NvbW1vbihmaWxlLCBzdGFydCwgZW5kLCBkYXRhc3luYywgRlVTRV9GU1lOQyk7XG5mcy9mdXNlL2ZpbGUuYy01OTEtXHRpZiAoZXJyID09IC1FTk9TWVMpIHtcbi0tXG5mcy9mdXNlL2Z1c2VfdHJhY2UuaC0yNy1cdEVNKCBGVVNFX1JFTEVBU0UsXHRcdFwmIzM0O0ZVU0VfUkVMRUFTRVwmIzM0OylcdFx0XFxcbmZzL2Z1c2UvZnVzZV90cmFjZS5oOjI4Olx0RU0oIEZVU0VfRlNZTkMsXHRcdFx0XCYjMzQ7RlVTRV9GU1lOQ1wmIzM0OylcdFx0XFxcbmZzL2Z1c2UvZnVzZV90cmFjZS5oLTI5LVx0RU0oIEZVU0VfU0VUWEFUVFIsXHRcdFwmIzM0O0ZVU0VfU0VUWEFUVFJcJiMzNDspXHRcXFxuLS1cbmZzL2Z1c2UvZnVzZV90cmFjZS5oLTM3LVx0RU0oIEZVU0VfUkVMRUFTRURJUixcdFx0XCYjMzQ7RlVTRV9SRUxFQVNFRElSXCYjMzQ7KVx0XFxcbmZzL2Z1c2UvZnVzZV90cmFjZS5oOjM4Olx0RU0oIEZVU0VfRlNZTkNESVIsXHRcdFwmIzM0O0ZVU0VfRlNZTkNESVJcJiMzNDspXHRcXFxuZnMvZnVzZS9mdXNlX3RyYWNlLmgtMzktXHRFTSggRlVTRV9HRVRMSyxcdFx0XHRcJiMzNDtGVVNFX0dFVExLXCYjMzQ7KVx0XHRcXFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDAwOjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExNjE2CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gdGhlIEZVU0UgS2VybmVsIE1vZHVsZSBDb25maWd1cmF0aW9uKioKClJpZ2h0LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gTGV0JiMzOTtzIHNlZSB3aGF0JiMzOTtzIGFjdHVhbGx5IGdvaW5nIG9uIHdpdGggdGhlIEZVU0Uga2VybmVsIG1vZHVsZSBidWlsZCBhbmQgY29uZmlndXJhdGlvbi4gTXkgaW5pdGlhbCBzdGVwIGlzIGFsd2F5cyB0byBnbyBzdHJhaWdodCB0byB0aGUgc291cmNlLiBJJiMzOTttIHRoaW5raW5nIEkmIzM5O2xsIHN0YXJ0IGJ5IGNoZWNraW5nIHRoZSBgZnMvZnVzZS9LY29uZmlnYCBmaWxlLiBUaGF0JiMzOTtzIHdoZXJlIGFsbCB0aGUgYnVpbGQtdGltZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIEZVU0Ugc2hvdWxkIGJlIGRlZmluZWQg4oCTIHRoaW5ncyBsaWtlIHdoZXRoZXIgaXQmIzM5O3MgYnVpbHQtaW4sIGEgbW9kdWxlLCBmZWF0dXJlcyB0byBlbmFibGUgb3IgZGlzYWJsZSwgYW5kIHNvIG9uLiBVbmRlcnN0YW5kaW5nIHRoZSBLY29uZmlnIG9wdGlvbnMgaXMgZnVuZGFtZW50YWwgdG8gY29uZmlndXJpbmcgdGhlIEZVU0UgbW9kdWxlIGFwcHJvcHJpYXRlbHkgZm9yIGEgc3BlY2lmaWMgZW52aXJvbm1lbnQgb3IgdXNlIGNhc2UuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHdoaWNoIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSBhbmQgd2hhdCB0aGV5JiMzOTtyZSBzZXQgdG8uIFRoZW4sIHdpdGggdGhhdCB1bmRlcnN0YW5kaW5nLCBJJiMzOTtsbCBtb3ZlIG9uIHRvIGBmcy9mdXNlL01ha2VmaWxlYC4gVGhlIE1ha2VmaWxlIHdpbGwgc2hvdyBtZSB0aGUgYnVpbGQgcHJvY2VzcyBpdHNlbGY6IHRoZSBkZXBlbmRlbmNpZXMsIHRoZSBzb3VyY2UgZmlsZXMgaW5jbHVkZWQsIGNvbXBpbGVyIGZsYWdzLCBhbmQgdGhlIG92ZXJhbGwgc3RydWN0dXJlIG9mIGhvdyBGVVNFIGlzIGNvbXBpbGVkIGFuZCBsaW5rZWQgaW50byB0aGUga2VybmVsLiBCeSBleGFtaW5pbmcgYm90aCBvZiB0aGVzZSBmaWxlcywgSSBzaG91bGQgZ2V0IGEgY2xlYXIgcGljdHVyZSBvZiBob3cgRlVTRSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkLCBpdHMgY29tcGlsYXRpb24gcHJvY2VzcywgYW5kIHRoZSBmbGV4aWJpbGl0eSBvZmZlcmVkIHRvIGFuIGVuZC11c2VyIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAwMDowNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2Z1c2UvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNzUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuICAgMjpcdGNvbmZpZyBGVVNFX0ZTXG4gICAzOlx0XHR0cmlzdGF0ZSBcJiMzNDtGVVNFIChGaWxlc3lzdGVtIGluIFVzZXJzcGFjZSkgc3VwcG9ydFwmIzM0O1xuICAgNDpcdFx0c2VsZWN0IEZTX1BPU0lYX0FDTFxuICAgNTpcdFx0c2VsZWN0IEZTX0lPTUFQXG4gICA2Olx0XHRoZWxwXG4gICA3Olx0XHQgIFdpdGggRlVTRSBpdCBpcyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgYSBmdWxseSBmdW5jdGlvbmFsIGZpbGVzeXN0ZW1cbiAgIDg6XHRcdCAgaW4gYSB1c2Vyc3BhY2UgcHJvZ3JhbS5cbiAgIDk6XHRcbiAgMTA6XHRcdCAgVGhlcmUmIzM5O3MgYWxzbyBhIGNvbXBhbmlvbiBsaWJyYXJ5OiBsaWJmdXNlMi4gIFRoaXMgbGlicmFyeSBpcyBhdmFpbGFibGVcbiAgMTE6XHRcdCAgZnJvbSB0aGUgRlVTRSBob21lcGFnZTpcbiAgMTI6XHRcdCAgXHUwMDNjaHR0cHM6Ly9naXRodWIuY29tL2xpYmZ1c2UvXHUwMDNlXG4gIDEzOlx0XHQgIGFsdGhvdWdoIGNoYW5jZXMgYXJlIHlvdXIgZGlzdHJpYnV0aW9uIGFscmVhZHkgaGFzIHRoYXQgbGlicmFyeVxuICAxNDpcdFx0ICBpbnN0YWxsZWQgaWYgeW91JiMzOTt2ZSBpbnN0YWxsZWQgdGhlIFwmIzM0O2Z1c2VcJiMzNDsgcGFja2FnZSBpdHNlbGYuXG4gIDE1Olx0XG4gIDE2Olx0XHQgIFNlZSBcdTAwM2NmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZnVzZS9mdXNlLnJzdFx1MDAzZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgMTc6XHRcdCAgU2VlIFx1MDAzY2ZpbGU6RG9jdW1lbnRhdGlvbi9DaGFuZ2VzXHUwMDNlIGZvciBuZWVkZWQgbGlicmFyeS91dGlsaXR5IHZlcnNpb24uXG4gIDE4Olx0XG4gIDE5Olx0XHQgIElmIHlvdSB3YW50IHRvIGRldmVsb3AgYSB1c2Vyc3BhY2UgRlMsIG9yIGlmIHlvdSB3YW50IHRvIHVzZVxuICAyMDpcdFx0ICBhIGZpbGVzeXN0ZW0gYmFzZWQgb24gRlVTRSwgYW5zd2VyIFkgb3IgTS5cbiAgMjE6XHRcbiAgMjI6XHRjb25maWcgQ1VTRVxuICAyMzpcdFx0dHJpc3RhdGUgXCYjMzQ7Q2hhcmFjdGVyIGRldmljZSBpbiBVc2Vyc3BhY2Ugc3VwcG9ydFwmIzM0O1xuICAyNDpcdFx0ZGVwZW5kcyBvbiBGVVNFX0ZTXG4gIDI1Olx0XHRoZWxwXG4gIDI2Olx0XHQgIFRoaXMgRlVTRSBleHRlbnNpb24gYWxsb3dzIGNoYXJhY3RlciBkZXZpY2VzIHRvIGJlXG4gIDI3Olx0XHQgIGltcGxlbWVudGVkIGluIHVzZXJzcGFjZS5cbiAgMjg6XHRcbiAgMjk6XHRcdCAgSWYgeW91IHdhbnQgdG8gZGV2ZWxvcCBvciB1c2UgYSB1c2Vyc3BhY2UgY2hhcmFjdGVyIGRldmljZVxuICAzMDpcdFx0ICBiYXNlZCBvbiBDVVNFLCBhbnN3ZXIgWSBvciBNLlxuICAzMTpcdFxuICAzMjpcdGNvbmZpZyBWSVJUSU9fRlNcbiAgMzM6XHRcdHRyaXN0YXRlIFwmIzM0O1ZpcnRpbyBGaWxlc3lzdGVtXCYjMzQ7XG4gIDM0Olx0XHRkZXBlbmRzIG9uIEZVU0VfRlNcbiAgMzU6XHRcdHNlbGVjdCBWSVJUSU9cbiAgMzY6XHRcdGhlbHBcbiAgMzc6XHRcdCAgVGhlIFZpcnRpbyBGaWxlc3lzdGVtIGFsbG93cyBndWVzdHMgdG8gbW91bnQgZmlsZSBzeXN0ZW1zIGZyb20gdGhlXG4gIDM4Olx0XHQgIGhvc3QuXG4gIDM5Olx0XG4gIDQwOlx0XHQgIElmIHlvdSB3YW50IHRvIHNoYXJlIGZpbGVzIGJldHdlZW4gZ3Vlc3RzIG9yIHdpdGggdGhlIGhvc3QsIGFuc3dlciBZXG4gIDQxOlx0XHQgIG9yIE0uXG4gIDQyOlx0XG4gIDQzOlx0Y29uZmlnIEZVU0VfREFYXG4gIDQ0Olx0XHRib29sIFwmIzM0O1ZpcnRpbyBGaWxlc3lzdGVtIERpcmVjdCBIb3N0IE1lbW9yeSBBY2Nlc3Mgc3VwcG9ydFwmIzM0O1xuICA0NTpcdFx0ZGVmYXVsdCB5XG4gIDQ2Olx0XHRzZWxlY3QgSU5URVJWQUxfVFJFRVxuICA0NzpcdFx0ZGVwZW5kcyBvbiBWSVJUSU9fRlNcbiAgNDg6XHRcdGRlcGVuZHMgb24gRlNfREFYXG4gIDQ5Olx0XHRkZXBlbmRzIG9uIERBWFxuICA1MDpcdFx0aGVscFxuICA1MTpcdFx0ICBUaGlzIGFsbG93cyBieXBhc3NpbmcgZ3Vlc3QgcGFnZSBjYWNoZSBhbmQgYWxsb3dzIG1hcHBpbmcgaG9zdCBwYWdlXG4gIDUyOlx0XHQgIGNhY2hlIGRpcmVjdGx5IGluIGd1ZXN0IGFkZHJlc3Mgc3BhY2UuXG4gIDUzOlx0XG4gIDU0Olx0XHQgIElmIHlvdSB3YW50IHRvIGFsbG93IG1vdW50aW5nIGEgVmlydGlvIEZpbGVzeXN0ZW0gd2l0aCB0aGUgXCYjMzQ7ZGF4XCYjMzQ7XG4gIDU1Olx0XHQgIG9wdGlvbiwgYW5zd2VyIFkuXG4gIDU2Olx0XG4gIDU3Olx0Y29uZmlnIEZVU0VfUEFTU1RIUk9VR0hcbiAgNTg6XHRcdGJvb2wgXCYjMzQ7RlVTRSBwYXNzdGhyb3VnaCBvcGVyYXRpb25zIHN1cHBvcnRcJiMzNDtcbiAgNTk6XHRcdGRlZmF1bHQgeVxuICA2MDpcdFx0ZGVwZW5kcyBvbiBGVVNFX0ZTXG4gIDYxOlx0XHRzZWxlY3QgRlNfU1RBQ0tcbiAgNjI6XHRcdGhlbHBcbiAgNjM6XHRcdCAgVGhpcyBhbGxvd3MgYnlwYXNzaW5nIEZVU0Ugc2VydmVyIGJ5IG1hcHBpbmcgc3BlY2lmaWMgRlVTRSBvcGVyYXRpb25zXG4gIDY0Olx0XHQgIHRvIGJlIHBlcmZvcm1lZCBkaXJlY3RseSBvbiBhIGJhY2tpbmcgZmlsZS5cbiAgNjU6XHRcbiAgNjY6XHRcdCAgSWYgeW91IHdhbnQgdG8gYWxsb3cgcGFzc3Rocm91Z2ggb3BlcmF0aW9ucywgYW5zd2VyIFkuXG4gIDY3Olx0XG4gIDY4Olx0Y29uZmlnIEZVU0VfSU9fVVJJTkdcbiAgNjk6XHRcdGJvb2wgXCYjMzQ7RlVTRSBjb21tdW5pY2F0aW9uIG92ZXIgaW8tdXJpbmdcJiMzNDtcbiAgNzA6XHRcdGRlZmF1bHQgeVxuICA3MTpcdFx0ZGVwZW5kcyBvbiBGVVNFX0ZTXG4gIDcyOlx0XHRkZXBlbmRzIG9uIElPX1VSSU5HXG4gIDczOlx0XHRoZWxwXG4gIDc0Olx0XHQgIFRoaXMgYWxsb3dzIHNlbmRpbmcgRlVTRSByZXF1ZXN0cyBvdmVyIHRoZSBpby11cmluZyBpbnRlcmZhY2UgYW5kXG4gIDc1Olx0ICAgICAgICAgIGFsc28gYWRkcyByZXF1ZXN0IGNvcmUgYWZmaW5pdHkuXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjggMDA6MDU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI5MTEKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAxOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOgoKKipBbmFseXppbmcgdGhlIEZ1c2UgTWFrZWZpbGUgZm9yIEJ1aWxkIENvbmZpZ3VyYXRpb25zKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhlIGBmcy9mdXNlL01ha2VmaWxlYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGJ1aWxkIHByb2Nlc3MgZm9yIHRoZSBGVVNFIG1vZHVsZS4gSSYjMzk7bSBzcGVjaWZpY2FsbHkgaW50ZXJlc3RlZCBpbiBob3cgdGhlIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYWZmZWN0IHdoaWNoIGZpbGVzIGFyZSBjb21waWxlZCBhbmQgbGlua2VkLiBJIHdhbnQgdG8gc2VlIHdoaWNoIHNvdXJjZSBmaWxlcyBnZXQgaW5jbHVkZWQgb3IgZXhjbHVkZWQgYmFzZWQgb24gZGlmZmVyZW50IGtlcm5lbCBjb25maWdzLiBUaGlzIGxldmVsIG9mIGdyYW51bGFyIHVuZGVyc3RhbmRpbmcgaXMgY3JpdGljYWwgZm9yIGRlYnVnZ2luZyBhbmQgb3B0aW1pemF0aW9uLiBBIHRob3JvdWdoIHJldmlldyBvZiB0aGUgTWFrZWZpbGUgaXMgdGhlIGJlc3Qgd2F5IHRvIGdldCB0aGF0IGJpcmQmIzM5O3MtZXllIHZpZXcgb2YgdGhlIGJ1aWxkIHByb2Nlc3MuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjggMDA6MDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9mdXNlL01ha2VmaWxlJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4gICAyOlx0I1xuICAgMzpcdCMgTWFrZWZpbGUgZm9yIHRoZSBGVVNFIGZpbGVzeXN0ZW0uXG4gICA0Olx0I1xuICAgNTpcdFxuICAgNjpcdCMgTmVlZGVkIGZvciB0cmFjZSBldmVudHNcbiAgIDc6XHRjY2ZsYWdzLXkgPSAtSSQoc3JjKVxuICAgODpcdFxuICAgOTpcdG9iai0kKENPTkZJR19GVVNFX0ZTKSAmIzQzOz0gZnVzZS5vXG4gIDEwOlx0b2JqLSQoQ09ORklHX0NVU0UpICYjNDM7PSBjdXNlLm9cbiAgMTE6XHRvYmotJChDT05GSUdfVklSVElPX0ZTKSAmIzQzOz0gdmlydGlvZnMub1xuICAxMjpcdFxuICAxMzpcdGZ1c2UteSA6PSB0cmFjZS5vXHQjIHB1dCB0cmFjZS5vIGZpcnN0IHNvIHdlIHNlZSBmdHJhY2UgZXJyb3JzIHNvb25lclxuICAxNDpcdGZ1c2UteSAmIzQzOz0gZGV2Lm8gZGlyLm8gZmlsZS5vIGlub2RlLm8gY29udHJvbC5vIHhhdHRyLm8gYWNsLm8gcmVhZGRpci5vIGlvY3RsLm8gcmVxX3RpbWVvdXQubyByZXEub1xuICAxNTpcdGZ1c2UteSAmIzQzOz0gcG9sbC5vIG5vdGlmeS5vXG4gIDE2Olx0ZnVzZS15ICYjNDM7PSBpb21vZGUub1xuICAxNzpcdGZ1c2UtJChDT05GSUdfRlVTRV9EQVgpICYjNDM7PSBkYXgub1xuICAxODpcdGZ1c2UtJChDT05GSUdfRlVTRV9QQVNTVEhST1VHSCkgJiM0Mzs9IHBhc3N0aHJvdWdoLm8gYmFja2luZy5vXG4gIDE5Olx0ZnVzZS0kKENPTkZJR19TWVNDVEwpICYjNDM7PSBzeXNjdGwub1xuICAyMDpcdGZ1c2UtJChDT05GSUdfRlVTRV9JT19VUklORykgJiM0Mzs9IGRldl91cmluZy5vXG4gIDIxOlx0XG4gIDIyOlx0dmlydGlvZnMteSA6PSB2aXJ0aW9fZnMub1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDAwOjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzNDY0CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogNzA3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgRlVTRSBQYXRjaDogQSBGdXp6aW5nIE9wcG9ydHVuaXR5KioKCk9rYXksIGxldCYjMzk7cyBicmVhayBkb3duIHRoaXMgcGF0Y2guIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IGl0JiMzOTtzIGZvY3VzaW5nIG9uIGVuaGFuY2luZyBGVVNFIGFuZCB2aXJ0aW8tZnMgZXJyb3IgaGFuZGxpbmcsIHNwZWNpZmljYWxseSBjb25jZXJuaW5nIEVOT0VOVCBlcnJvcnMgd2hlbiBkZWFsaW5nIHdpdGggbGl2ZSBub2RlIElEcy4gSXQgc2VlbXMgbGlrZSB0aGUgY29yZSBpc3N1ZSBpcyBob3cgd2UmIzM5O3JlIGhhbmRsaW5nIHN0YWxlIGlub2RlcywgYWltaW5nIHRvIHByb3ZpZGUgbW9yZSByb2J1c3QgZXJyb3Igc2lnbmFsaW5nLgoKTXkga2V5IGNvbmNlcm4gaXMgaG93IHRoaXMgZXJyb3IgaGFuZGxpbmcgcGVyY29sYXRlcyB1cCB0aHJvdWdoIHRoZSBWRlMuIFRoaXMgcGF0Y2ggaXMgbW9kaWZ5aW5nIHNldmVyYWwga2V5IGFyZWFzOiBgZnMvZnVzZS9kaXIuY2AsIGBmcy9mdXNlL2ZpbGUuY2AsIGBmcy9mdXNlL2Z1c2VfaS5oYCwgYGZzL2Z1c2UvaW5vZGUuY2AsIGFuZCBgZnMvZnVzZS92aXJ0aW9fZnMuY2AuIEl0IGxvb2tzIGxpa2UgRU5PRU5UIGlzIGJlaW5nIGNvbnZlcnRlZCB0byBFU1RBTEUgb3IgRU9QRU5TVEFMRSBpbiBzZXZlcmFsIGNvbnRleHRzOiBgZnVzZV9kb19nZXRhdHRyYCwgYGZ1c2VfcmVhZGxpbmtfZm9saW9gLCBgZnVzZV9kaXJfb3BlbmAsIGBmdXNlX2RvX3NldGF0dHJgLCBgZnVzZV9vcGVuYCwgYW5kIGBmdXNlX3N0YXRmc2AsIHdpdGggc3BlY2lmaWMgaGFuZGxpbmcgaW4gYHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlYC4gVGhlIGFkZGl0aW9uIG9mIG5ldyB0ZXN0cyBpcyBwcm9taXNpbmcsIGJ1dCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY292ZXJhZ2UgYW5kIGZvY3VzLgoKVGhlIHNpZ25pZmljYW50IGNoYW5nZXMgYXJlOgoqICAgSW4gYGZzL2Z1c2UvZGlyLmNgLCBgZnVzZV9kb19nZXRhdHRyYCwgYGZ1c2VfcmVhZGxpbmtfZm9saW9gLCBgZnVzZV9kaXJfb3BlbmAsIGFuZCBgZnVzZV9kb19zZXRhdHRyYC4KKiAgIEluIGBmcy9mdXNlL2ZpbGUuY2AsIGBmdXNlX29wZW5gLgoqICAgQSBuZXcgaGVscGVyIGBmdXNlX3N0YWxlX2lub2RlX2VycigpYCBpbiBgZnMvZnVzZS9mdXNlX2kuaGAuCiogICBJbiBgZnMvZnVzZS9pbm9kZS5jYCwgYGZ1c2Vfc3RhdGZzYC4KKiAgIEluIGBmcy9mdXNlL3ZpcnRpb19mcy5jYCwgYHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlYC4KCk5vdywgZG9lcyB0aGlzIG1lcml0IGZ1enppbmc/IEFic29sdXRlbHksIHllcyEgVGhlIEZVU0UgZXJyb3IgaGFuZGxpbmcgYW5kIHJldHVybiBjb2RlcyAoRVNUQUxFLCBFT1BFTlNUQUxFLCBhbmQgdGhlIEVOT0VOVCByZXRyeSBsb2dpYykgZGlyZWN0bHkgaW1wYWN0IFZGUyBwYXRoIHJlc29sdXRpb24gYW5kIGZpbGUgb3BlcmF0aW9ucyBhY3Jvc3MgdGhlIGJvYXJkLiBPcGVyYXRpb25zIGxpa2Ugb3BlbiwgZ2V0YXR0ciwgc2V0YXR0ciwgc3RhdGZzLCBhbmQgcmVhZGxpbmsgd2lsbCBiZSBkaXJlY3RseSBhZmZlY3RlZCBieSB0aGVzZSBjaGFuZ2VzIHdoZW4gaW50ZXJhY3Rpbmcgd2l0aCB1c2Vyc3BhY2UgRlVTRSBzZXJ2ZXJzIG9yIHZpcnRpby1mcy4gVGhpcyBpcyBhY2Nlc3NpYmxlIGZyb20gcHJldHR5IHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgc3VjaCBhcyBRRU1VIG9yIEdDRS4KCkkgbmVlZCB0byBjb25maXJtIHRoZSBzY29wZSBvZiB0aGlzLiBJJiMzOTttIGZvY3VzaW5nIG9uIHRob3NlIG1vZGlmaWNhdGlvbnM6IGBmdXNlX2RvX3NldGF0dHJgLCBgZnVzZV9kb19nZXRhdHRyYCwgYGZ1c2VfZGlyX29wZW5gLCBgZnVzZV9vcGVuYCwgYGZ1c2VfcmVhZGxpbmtfZm9saW9gLCBgZnVzZV9zdGF0ZnNgLCBhbmQgYHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlYC4gVGhlIG5vbi1zdGF0aWMgbmF0dXJlIG9mIGBmdXNlX2RvX3NldGF0dHJgIGlzIHdvcnRoIGEgZGVlcGVyIGRpdmUuIEkgd2FudCB0byBjaGVjayBpdHMgZGVjbGFyYXRpb25zLCBjYWxsZXJzLCBhbmQgb3ZlcmFsbCB1c2FnZSBhY3Jvc3MgRlVTRSBmaWxlcy4gTGV0JiMzOTtzIGFuYWx5emUgdGhlIGNhbGxlcnMgb2YgdGhlIGBzdGF0aWNgIGZ1bmN0aW9ucyBhcyB3ZWxsLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY2FsbCBjaGFpbnMgYW5kIGhvdyB0aGVzZSBlcnJvciBjb2RlcyBhcmUgcHJvcGFnYXRlZC4gR2l2ZW4gdGhhdCB0aGVzZSBmdW5jdGlvbnMgYXJlIGRlZXBseSBpbnZvbHZlZCB3aXRoIGZpbGUgb3BlcmF0aW9ucywgdGhleSByZXByZXNlbnQgZmVydGlsZSBncm91bmQgZm9yIGZ1enppbmcgdG8gdW5jb3ZlciBwb3RlbnRpYWwgaXNzdWVzLCBlc3BlY2lhbGx5IHJhY2UgY29uZGl0aW9ucyBvciBpbmNvcnJlY3QgZXJyb3IgcHJvcGFnYXRpb24uCgpTbywgbGV0JiMzOTtzIG1hcCBvdXQgdGhlIGZ1bmN0aW9ucy4gSSYjMzk7bGwgbmVlZCB0byBjaGVjayB0aGUgZXhhY3QgZGVjbGFyYXRpb25zLCB3aGVyZSB0aGV5JiMzOTtyZSBkZWZpbmVkLCBhbmQgdGhlIGNhbGxlcnMgb2YgZWFjaC4gQSB0aG9yb3VnaCBhbmFseXNpcyBoZXJlIHdpbGwgcmV2ZWFsIHBvdGVudGlhbCBlbnRyeSBwb2ludHMgZm9yIGZ1enppbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDAwOjA2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2Z1c2VfZG9fc2V0YXR0ciYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2Z1c2UmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZnVzZS9kaXIuYz0yMTE5PWludCBmdXNlX2ZsdXNoX3RpbWVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmdXNlX2ZpbGUgKmZmKVxuLS1cbmZzL2Z1c2UvZGlyLmMtMjE1My0gKi9cbmZzL2Z1c2UvZGlyLmM6MjE1NDppbnQgZnVzZV9kb19zZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksXG5mcy9mdXNlL2Rpci5jLTIxNTUtXHRcdCAgICBzdHJ1Y3QgaWF0dHIgKmF0dHIsIHN0cnVjdCBmaWxlICpmaWxlKVxuLS1cbmZzL2Z1c2UvZGlyLmM9MjMzNj1zdGF0aWMgaW50IGZ1c2Vfc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZW50cnksXG4tLVxuZnMvZnVzZS9kaXIuYy0yMzgyLVxuZnMvZnVzZS9kaXIuYzoyMzgzOlx0cmV0ID0gZnVzZV9kb19zZXRhdHRyKGlkbWFwLCBlbnRyeSwgYXR0ciwgZmlsZSk7XG5mcy9mdXNlL2Rpci5jLTIzODQtXHRpZiAoIXJldCkge1xuLS1cbmZzL2Z1c2UvZmlsZS5jPTI3MTI9c3RhdGljIHZvaWQgZnVzZV9kb190cnVuY2F0ZShzdHJ1Y3QgZmlsZSAqZmlsZSlcbi0tXG5mcy9mdXNlL2ZpbGUuYy0yNzIyLVxuZnMvZnVzZS9maWxlLmM6MjcyMzpcdGZ1c2VfZG9fc2V0YXR0cihmaWxlX21udF9pZG1hcChmaWxlKSwgZmlsZV9kZW50cnkoZmlsZSksIFx1MDAyNmF0dHIsIGZpbGUpO1xuZnMvZnVzZS9maWxlLmMtMjcyNC19XG4tLVxuZnMvZnVzZS9mdXNlX2kuaD0xMTkwPWludCBmdXNlX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKTtcbmZzL2Z1c2UvZnVzZV9pLmgtMTE5MS1cbmZzL2Z1c2UvZnVzZV9pLmg6MTE5MjppbnQgZnVzZV9kb19zZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksXG5mcy9mdXNlL2Z1c2VfaS5oLTExOTMtXHRcdCAgICBzdHJ1Y3QgaWF0dHIgKmF0dHIsIHN0cnVjdCBmaWxlICpmaWxlKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjggMDA6MDY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTUzNzMKCQkJCQkJCW91dHB1dDogNTQKCQkJCQkJCXRob3VnaHRzOiA3NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIGZ1bmN0aW9ucy4KCioqSW5pdGlhbCBDb25zaWRlcmF0aW9ucyBmb3IgRlVTRSBLZXJuZWwgTW9kdWxlIFJldmlldyoqCgpBbHJpZ2h0LCBiZWZvcmUgSSBkaXZlIGluIHRvbyBkZWVwLCBsZXQmIzM5O3MgZXN0YWJsaXNoIG91ciBpbW1lZGlhdGUgcHJpb3JpdGllcy4gTXkgbWluZCBpcyBhbHJlYWR5IHJ1bm5pbmcgdGhyb3VnaCBhIHF1aWNrIGNoZWNrbGlzdCBvZiBjcml0aWNhbCBGVVNFIGZ1bmN0aW9ucyB0aGF0IGRlbWFuZCBteSBhdHRlbnRpb24uIFNwZWNpZmljYWxseSwgSSYjMzk7bSB0aGlua2luZyBhYm91dCBgZnVzZV9vcGVuYCwgYGZ1c2VfZGlyX29wZW5gLCBgZnVzZV9zdGF0ZnNgLCBgZnVzZV9nZXRhdHRyYCwgYW5kIGBmdXNlX3NldGF0dHJgLiBUaGVzZSBhcmUgdGhlIGNvcmUgYnVpbGRpbmcgYmxvY2tzIGZvciBmaWxlIGFjY2VzcywgZGlyZWN0b3J5IHRyYXZlcnNhbCwgZmlsZXN5c3RlbSBzdGF0aXN0aWNzLCBhdHRyaWJ1dGUgcmV0cmlldmFsLCBhbmQgYXR0cmlidXRlIG1vZGlmaWNhdGlvbiwgcmVzcGVjdGl2ZWx5LiBUaGVuIHRoZXJlJiMzOTtzIHRoZSBmb2xpby1zcGVjaWZpYyBoYW5kbGluZywgd2hpY2ggYWxzbyBuZWVkcyBhIGxvb2sgYXQgYGZ1c2VfcmVhZGxpbmtfZm9saW9gLCBhbmQgYGZ1c2Vfc3ltbGlua19yZWFkX2ZvbGlvYCwgYW5kIGZpbmFsbHkgbGV0JiMzOTtzIHRocm93IGluIGB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZWAsIHRvIGVuc3VyZSBhIGNvbXBsZXRlIHBpY3R1cmUuIFdpdGggdGhvc2UgaW4gbWluZCwgSSBuZWVkIHRvIGtub3cgdGhlIGV4YWN0IGRlZmluaXRpb25zIG9mIHRoZXNlIGluIHRoZSBGVVNFIGtlcm5lbCBtb2R1bGUuIExvb2tzIGxpa2UgdGhlIGxvZ2ljYWwgZmlyc3Qgc3RlcCBpcyB0byBpbW1lZGlhdGVseSBwdWxsIHVwIGBmcy9mdXNlL2AgYW5kIGJlZ2luIHRoZSBjb2RlIHJldmlldy4gVGhhdCYjMzk7bGwgYmUgYSBnb29kIHN0YXJ0aW5nIHBvaW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAwMDowNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDteKHN0YXRpYyApPyhpbnR8dm9pZCkgZnVzZV8ob3BlbnxkaXJfb3BlbnxzdGF0ZnN8Z2V0YXR0cnxzZXRhdHRyfHN5bWxpbmtfcmVhZF9mb2xpbykmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9mdXNlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2Z1c2UvZGlyLmM9MTg2Nj1zdGF0aWMgY29uc3QgY2hhciAqZnVzZV9nZXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZnVzZS9kaXIuYy0xOTAyLVxuZnMvZnVzZS9kaXIuYzoxOTAzOnN0YXRpYyBpbnQgZnVzZV9kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcbmZzL2Z1c2UvZGlyLmMtMTkwNC17XG4tLVxuZnMvZnVzZS9kaXIuYz0yMDkyPXZvaWQgZnVzZV9yZWxlYXNlX25vd3JpdGUoc3RydWN0IGlub2RlICppbm9kZSlcbi0tXG5mcy9mdXNlL2Rpci5jLTIxMDAtXG5mcy9mdXNlL2Rpci5jOjIxMDE6c3RhdGljIHZvaWQgZnVzZV9zZXRhdHRyX2ZpbGwoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX2FyZ3MgKmFyZ3MsXG5mcy9mdXNlL2Rpci5jLTIxMDItXHRcdFx0ICAgICAgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9mdXNlL2Rpci5jPTIxNTQ9aW50IGZ1c2VfZG9fc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuLS1cbmZzL2Z1c2UvZGlyLmMtMjMzNS1cbmZzL2Z1c2UvZGlyLmM6MjMzNjpzdGF0aWMgaW50IGZ1c2Vfc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZW50cnksXG5mcy9mdXNlL2Rpci5jLTIzMzctXHRcdFx0c3RydWN0IGlhdHRyICphdHRyKVxuLS1cbmZzL2Z1c2UvZGlyLmMtMjM5OC1cbmZzL2Z1c2UvZGlyLmM6MjM5OTpzdGF0aWMgaW50IGZ1c2VfZ2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCxcbmZzL2Z1c2UvZGlyLmMtMjQwMC1cdFx0XHRjb25zdCBzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IGtzdGF0ICpzdGF0LFxuLS1cbmZzL2Z1c2UvZGlyLmM9MjQ4Mz12b2lkIGZ1c2VfaW5pdF9kaXIoc3RydWN0IGlub2RlICppbm9kZSlcbi0tXG5mcy9mdXNlL2Rpci5jLTI0OTYtXG5mcy9mdXNlL2Rpci5jOjI0OTc6c3RhdGljIGludCBmdXNlX3N5bWxpbmtfcmVhZF9mb2xpbyhzdHJ1Y3QgZmlsZSAqbnVsbCwgc3RydWN0IGZvbGlvICpmb2xpbylcbmZzL2Z1c2UvZGlyLmMtMjQ5OC17XG4tLVxuZnMvZnVzZS9maWxlLmM9MjM3PXN0YXRpYyB2b2lkIGZ1c2VfdHJ1bmNhdGVfdXBkYXRlX2F0dHIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG4tLVxuZnMvZnVzZS9maWxlLmMtMjQ5LVxuZnMvZnVzZS9maWxlLmM6MjUwOnN0YXRpYyBpbnQgZnVzZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxuZnMvZnVzZS9maWxlLmMtMjUxLXtcbi0tXG5mcy9mdXNlL2lub2RlLmM9NjMyPXN0YXRpYyB2b2lkIGNvbnZlcnRfZnVzZV9zdGF0ZnMoc3RydWN0IGtzdGF0ZnMgKnN0YnVmLCBzdHJ1Y3QgZnVzZV9rc3RhdGZzICphdHRyKVxuLS1cbmZzL2Z1c2UvaW5vZGUuYy02NDUtXG5mcy9mdXNlL2lub2RlLmM6NjQ2OnN0YXRpYyBpbnQgZnVzZV9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKVxuZnMvZnVzZS9pbm9kZS5jLTY0Ny17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDAwOjA2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2NDIzCgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIHRoZSBvbmUgdGhpbmtpbmcgaXQ6CgoqKkRpZ2dpbmcgaW50byB2aXJ0aW9fZnMuYyBmb3IgQ29tcGxldGlvbiBIYW5kbGluZyoqCgpPa2F5LCBzbyB3ZSYjMzk7cmUgbG9va2luZyBhdCBjb21wbGV0aW9uIGhhbmRsaW5nIHdpdGhpbiB2aXJ0aW8tZnMuIE15IGluaXRpYWwgZm9jdXMgaXMgZGVmaW5pdGVseSBnb2luZyB0byBiZSBvbiBgdmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGVgLiBUaGF0JiMzOTtzIHdoZXJlIHRoZSBydWJiZXIgbWVldHMgdGhlIHJvYWQsIHdoZXJlIHRoZSBrZXJuZWwgc2lnbmFscyBhIHJlcXVlc3QgaXMgZmluaXNoZWQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgaG93IHRoZSBkYXRhIGdldHMgY2xlYW5lZCB1cCwgaG93IGVycm9ycyBhcmUgcmVwb3J0ZWQgYmFjayAoaWYgYW55KSwgYW5kIGhvdyB0aGUgd2hvbGUgdGhpbmcgdHJhbnNpdGlvbnMgdG8gdGhlIG5leHQgcGhhc2UgaW4gdGhlIHJlcXVlc3QgbGlmZWN5Y2xlLiBJJiMzOTtsbCBsaWtlbHkgYmUgY2hlY2tpbmcgdGhlIHN1cnJvdW5kaW5nIGNvZGUgZm9yIGhvdyB0aGF0IGZ1bmN0aW9uIGlzIGNhbGxlZCBhbmQgd2hlcmUgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBjb21wbGV0ZSB0aGUgcmVxdWVzdCBjb21lcyBmcm9tIGluIHRoZSBmaXJzdCBwbGFjZS4gSeKAmW0gdGhpbmtpbmcgdGhlcmUgbWlnaHQgYmUgc2V2ZXJhbCBjcml0aWNhbCBwb2ludHMgdGhlcmUuIEFuZCBJJiMzOTtsbCBiZSBrZWVwaW5nIGFuIGV5ZSBvdXQgZm9yIGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIG9yIGVkZ2UgY2FzZXMuIFRpbWUgdG8gZGlnIGluIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAwMDowNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2Z1c2UmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZnVzZS92aXJ0aW9fZnMuYz04MTM9c3RhdGljIHZvaWQgdmlydGlvX2ZzX2ZpeHVwX3N0YWxlX2Vycm9yKHN0cnVjdCBmdXNlX3JlcSAqcmVxKVxuLS1cbmZzL2Z1c2UvdmlydGlvX2ZzLmMtODQzLS8qIFdvcmsgZnVuY3Rpb24gZm9yIHJlcXVlc3QgY29tcGxldGlvbiAqL1xuZnMvZnVzZS92aXJ0aW9fZnMuYzo4NDQ6c3RhdGljIHZvaWQgdmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGUoc3RydWN0IGZ1c2VfcmVxICpyZXEsXG5mcy9mdXNlL3ZpcnRpb19mcy5jLTg0NS1cdFx0XHRcdCAgICAgICBzdHJ1Y3QgdmlydGlvX2ZzX3ZxICpmc3ZxKVxuLS1cbmZzL2Z1c2UvdmlydGlvX2ZzLmM9ODgxPXN0YXRpYyB2b2lkIHZpcnRpb19mc19jb21wbGV0ZV9yZXFfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4tLVxuZnMvZnVzZS92aXJ0aW9fZnMuYy04ODUtXG5mcy9mdXNlL3ZpcnRpb19mcy5jOjg4NjpcdHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlKHctXHUwMDNlcmVxLCB3LVx1MDAzZWZzdnEpO1xuZnMvZnVzZS92aXJ0aW9fZnMuYy04ODctXHRrZnJlZSh3KTtcbi0tXG5mcy9mdXNlL3ZpcnRpb19mcy5jPTg5MD1zdGF0aWMgdm9pZCB2aXJ0aW9fZnNfcmVxdWVzdHNfZG9uZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbi0tXG5mcy9mdXNlL3ZpcnRpb19mcy5jLTkzMS1cdFx0fSBlbHNlIHtcbmZzL2Z1c2UvdmlydGlvX2ZzLmM6OTMyOlx0XHRcdHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlKHJlcSwgZnN2cSk7XG5mcy9mdXNlL3ZpcnRpb19mcy5jLTkzMy1cdFx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAwMDowNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzAzMQoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDEwMDkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIEZVU0UvVmlydGlvRlMgU3ltYm9sIFZpc2liaWxpdHkqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgcHJpbWFyeSBjb25jZXJuIGlzIHRoZSB2aXNpYmlsaXR5IG9mIGNlcnRhaW4gRlVTRSBhbmQgVmlydGlvRlMgZnVuY3Rpb25zLCBzcGVjaWZpY2FsbHkgdG8gZGV0ZXJtaW5lIHdoaWNoIG9uZXMgYXJlIGV4cG9zZWQgYXMgcHJvcGVyIHN5bWJvbHMuIFRoZSBnb2FsIGlzIHRvIGlkZW50aWZ5IEFQSSBlbnRyeSBwb2ludHMsIGZhdm9yaW5nIHRob3NlIHRoYXQgYXJlIG5vbi1zdGF0aWMgYW5kIG5vdCBpbmxpbmVkIGJlY2F1c2UgdGhlc2UgYXJlIG1vcmUgbGlrZWx5IHRvIGJlIGFjY2Vzc2libGUgaW4gYSBwcmVkaWN0YWJsZSB3YXkuCgpGaXJzdCwgSSBjb25maXJtZWQgdGhhdCBgZnVzZV9kb19zZXRhdHRyYCBpcyBpbmRlZWQgbm9uLXN0YXRpYywgYSBnb29kIHN0YXJ0LiBUaGVuLCBJIHF1aWNrbHkgc2Nhbm5lZCBvdGhlciBmdW5jdGlvbnMgd2l0aGluIGBmcy9mdXNlL2Rpci5jYCwgYW5kIGBmcy9mdXNlL2ZpbGUuY2AgdG8gaWRlbnRpZnkgb3RoZXIgZnVuY3Rpb25zIG9mIGludGVyZXN0OiBgZnVzZV9vcGVuYCwgYGZ1c2VfZGlyX29wZW5gLCBgZnVzZV9kb19nZXRhdHRyYCwgYGZ1c2Vfc3RhdGZzYCwgYGZ1c2VfcmVhZGxpbmtfZm9saW9gLCBhbmQgYHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlYC4KCkxvb2tpbmcgYXQgdGhlIGRpZmYsIGl0IHNlZW1zIHNldmVyYWwgb2YgdGhlc2UgaGF2ZSBiZWVuIG1vZGlmaWVkOiBgZnVzZV9kb19nZXRhdHRyYCwgYGZ1c2VfcmVhZGxpbmtfZm9saW9gLCBgZnVzZV9kaXJfb3BlbmAsIGBmdXNlX2RvX3NldGF0dHJgIChpbiBgZnMvZnVzZS9kaXIuY2ApIGFuZCBgZnVzZV9vcGVuYCAoaW4gYGZzL2Z1c2UvZmlsZS5jYCkuIEFkZGl0aW9uYWxseSwgYGZ1c2Vfc3RhdGZzYCBpcyBjaGFuZ2VkIGluIGBmcy9mdXNlL2lub2RlLmNgLCBhbmQgdGhlcmUgYXJlIGNoYW5nZXMgaW4gYGZzL2Z1c2UvdmlydGlvX2ZzLmNgIHJlbGF0ZWQgdG8gYHZpcnRpb19mc19maXh1cF9zdGFsZV9lcnJvcmAgYW5kIGB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZWAuIFRoZSBgZnVzZV9zdGFsZV9pbm9kZV9lcnJgIGZ1bmN0aW9uIGlzIGFsc28gbm93IGFuIGlubGluZSBmdW5jdGlvbiBkZWZpbmVkIGluIGBmcy9mdXNlL2Z1c2VfaS5oYC4KCkkgdGhlbiBtYWRlIGEgbm90ZSBvZiB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbiBvcHRpb25zOiBgRlVTRV9GU2AgYW5kIGBWSVJUSU9fRlNgLiBBIHF1aWNrIGNyb3NzLXJlZmVyZW5jZSBvZiB0aGUgS2NvbmZpZyBzaG93ZWQgdGhhdCBgVklSVElPX0ZTYCBkZXBlbmRzIG9uIGBGVVNFX0ZTYCBhbmQgYEZVU0VfRlNgIHNlbGVjdHMgYEZTX1BPU0lYX0FDTGAgYW5kIGBGU19JT01BUGAuCgpOb3csIHRoZSBmb2N1cyBpcyBvbiBhIHN1YnNldCBvZiBzeW1ib2xzOiBgZnVzZV9kb19zZXRhdHRyYCwgYGZ1c2VfZG9fZ2V0YXR0cmAsIGBmdXNlX2Rpcl9vcGVuYCwgYGZ1c2Vfb3BlbmAsIGBmdXNlX3JlYWRsaW5rX2ZvbGlvYCwgYGZ1c2Vfc3RhdGZzYCwgYW5kIGB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZWAuIEkgbmVlZCB0byBkZXRlcm1pbmUgaWYgdGhlc2UgYXJlIGNvbXBpbGVkIGFzIGRpc3RpbmN0IHN5bWJvbHMuCgpgZnVzZV9kb19zZXRhdHRyYCBoYXMgYWxyZWFkeSBiZWVuIGVzdGFibGlzaGVkIGFzIG5vbi1zdGF0aWMuIEhvd2V2ZXIsIGFmdGVyIGNhcmVmdWwgcmV2aWV3LCBpdCBsb29rcyBsaWtlIGBmdXNlX29wZW5gLCBgZnVzZV9kaXJfb3BlbmAsIGFuZCBgZnVzZV9zdGF0ZnNgIGFyZSBzdGF0aWMgZmlsZV9vcGVyYXRpb25zL3N1cGVyX29wZXJhdGlvbnMgY2FsbGJhY2tzLiBUaGlzIGlzIGdvb2QgYmVjYXVzZSBldmVuIHRob3VnaCB0aGV5IGFyZSBzdGF0aWMsIGJlY2F1c2UgdGhlaXIgYWRkcmVzcyBpcyB0YWtlbiBhbmQgYXNzaWduZWQgaW50byBhIHN0cnVjdCBmdW5jdGlvbiBwb2ludGVyLCB0aGV5IGFyZSBub3QgaW5saW5lZC4gYGZ1c2VfZG9fZ2V0YXR0cmAgYW5kIGBmdXNlX3JlYWRsaW5rX2ZvbGlvYCBhcmUgYm90aCBzdGF0aWMgaGVscGVycy4gQW5kIGB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZWAgaXMgc3RhdGljIGFzIHdlbGwuCgpUaGVyZWZvcmUsIGBmdXNlX2RvX3NldGF0dHJgLCBgZnVzZV9vcGVuYCwgYGZ1c2VfZGlyX29wZW5gLCBhbmQgYGZ1c2Vfc3RhdGZzYCBhcmUgdGhlIHNpZ25pZmljYW50IHN5bWJvbHMgdG8gZm9jdXMgb24uIFRoZXkgYXJlICpsaWtlbHkqIHRoZSBwcmltYXJ5IGV4cG9zZWQgQVBJIGVudHJ5IHBvaW50cyBpbiB0aGUgbW9kdWxlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAwMDowNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtmdXNlX29wZW4mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9mdXNlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2Z1c2UvZGV2LmM9NzczPXN0YXRpYyB2b2lkIGZ1c2VfYWRqdXN0X2NvbXBhdChzdHJ1Y3QgZnVzZV9jaGFuICpmY2gsIHN0cnVjdCBmdXNlX2FyZ3MgKmFyZ3MpXG4tLVxuZnMvZnVzZS9kZXYuYy03OTYtXHRcdGNhc2UgRlVTRV9DUkVBVEU6XG5mcy9mdXNlL2Rldi5jOjc5NzpcdFx0XHRhcmdzLVx1MDAzZWluX2FyZ3NbMF0uc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZnVzZV9vcGVuX2luKTtcbmZzL2Z1c2UvZGV2LmMtNzk4LVx0XHRcdGJyZWFrO1xuLS1cbmZzL2Z1c2UvZGlyLmM9ODIzPXN0YXRpYyBpbnQgZnVzZV9jcmVhdGVfb3BlbihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGlub2RlICpkaXIsXG4tLVxuZnMvZnVzZS9kaXIuYy04MzEtXHRzdHJ1Y3QgZnVzZV9jcmVhdGVfaW4gaW5hcmc7XG5mcy9mdXNlL2Rpci5jOjgzMjpcdHN0cnVjdCBmdXNlX29wZW5fb3V0ICpvdXRvcGVucDtcbmZzL2Z1c2UvZGlyLmMtODMzLVx0c3RydWN0IGZ1c2VfZW50cnlfb3V0IG91dGVudHJ5O1xuLS1cbmZzL2Z1c2UvZGlyLmM9MTkwMz1zdGF0aWMgaW50IGZ1c2VfZGlyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG4tLVxuZnMvZnVzZS9kaXIuYy0xOTE2LVx0LypcbmZzL2Z1c2UvZGlyLmM6MTkxNzpcdCAqIEFzIGluIGZ1c2Vfb3Blbl9jb21tb24oKTogYSBwYXRoIHdhbGsgc3RhbmRzIGJlaGluZCB0aGlzIG9wZW4sXG5mcy9mdXNlL2Rpci5jLTE5MTgtXHQgKiBzbyB0aGUgcmVmdXNhbCBpcyBFT1BFTlNUQUxFIGZvciBwYXRoX29wZW5hdCgpIHRvIGFuc3dlci5cbi0tXG5mcy9mdXNlL2ZpbGUuYz0yNT1zdGF0aWMgaW50IGZ1c2Vfc2VuZF9vcGVuKHN0cnVjdCBmdXNlX21vdW50ICpmbSwgdTY0IG5vZGVpZCxcbmZzL2Z1c2UvZmlsZS5jLTI2LVx0XHRcdCAgdW5zaWduZWQgaW50IG9wZW5fZmxhZ3MsIGludCBvcGNvZGUsXG5mcy9mdXNlL2ZpbGUuYzoyNzpcdFx0XHQgIHN0cnVjdCBmdXNlX29wZW5fb3V0ICpvdXRhcmdwKVxuZnMvZnVzZS9maWxlLmMtMjgte1xuZnMvZnVzZS9maWxlLmM6Mjk6XHRzdHJ1Y3QgZnVzZV9vcGVuX2luIGluYXJnO1xuZnMvZnVzZS9maWxlLmMtMzAtXHRGVVNFX0FSR1MoYXJncyk7XG4tLVxuZnMvZnVzZS9maWxlLmM9MTMzPXN0cnVjdCBmdXNlX2ZpbGUgKmZ1c2VfZmlsZV9vcGVuKHN0cnVjdCBmdXNlX21vdW50ICpmbSwgdTY0IG5vZGVpZCxcbi0tXG5mcy9mdXNlL2ZpbGUuYy0xNTgtXHRcdC8qIFN0b3JlIG91dGFyZyBmb3IgZnVzZV9maW5pc2hfb3BlbigpICovXG5mcy9mdXNlL2ZpbGUuYzoxNTk6XHRcdHN0cnVjdCBmdXNlX29wZW5fb3V0ICpvdXRhcmdwID0gXHUwMDI2ZmYtXHUwMDNlYXJncy1cdTAwM2VvcGVuX291dGFyZztcbmZzL2Z1c2UvZmlsZS5jLTE2MC1cdFx0aW50IGVycjtcbi0tXG5mcy9mdXNlL2ZpbGUuYz0yMzc9c3RhdGljIHZvaWQgZnVzZV90cnVuY2F0ZV91cGRhdGVfYXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcbi0tXG5mcy9mdXNlL2ZpbGUuYy0yNDktXG5mcy9mdXNlL2ZpbGUuYzoyNTA6c3RhdGljIGludCBmdXNlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG5mcy9mdXNlL2ZpbGUuYy0yNTEte1xuLS1cbmZzL2Z1c2UvZmlsZS5jPTMwODg9c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnVzZV9maWxlX29wZXJhdGlvbnMgPSB7XG4tLVxuZnMvZnVzZS9maWxlLmMtMzA5Mi1cdC5tbWFwXHRcdD0gZnVzZV9maWxlX21tYXAsXG5mcy9mdXNlL2ZpbGUuYzozMDkzOlx0Lm9wZW5cdFx0PSBmdXNlX29wZW4sXG5mcy9mdXNlL2ZpbGUuYy0zMDk0LVx0LmZsdXNoXHRcdD0gZnVzZV9mbHVzaCxcbi0tXG5mcy9mdXNlL2Z1c2VfaS5oPTMzMz11bmlvbiBmdXNlX2ZpbGVfYXJncyB7XG5mcy9mdXNlL2Z1c2VfaS5oLTMzNC1cdC8qIFVzZWQgZHVyaW5nIG9wZW4oKSAqL1xuZnMvZnVzZS9mdXNlX2kuaDozMzU6XHRzdHJ1Y3QgZnVzZV9vcGVuX291dCBvcGVuX291dGFyZztcbmZzL2Z1c2UvZnVzZV9pLmgtMzM2LVx0LyogVXNlZCBkdXJpbmcgcmVsZWFzZSgpICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDAwOjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5NjM5CgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gYGZ1c2VfZGlyX29wZW5gKioKCk9rYXksIHRpbWUgdG8gZGlzc2VjdCB0aGUgdXNhZ2Ugb2YgYGZ1c2VfZGlyX29wZW5gIHdpdGhpbiBgZnMvZnVzZS9kaXIuY2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyByb2xlIGFuZCBob3cgaXQmIzM5O3MgYmVpbmcgbGV2ZXJhZ2VkIGluIHRoZSBGVVNFIGZpbGVzeXN0ZW0gbGF5ZXIuIEkmIzM5O20gYXNzdW1pbmcgdGhlcmUmIzM5O3Mgc29tZSBpc3N1ZSB0aGF0IHdhcnJhbnRzIGludmVzdGlnYXRpb24sIG9yIHBlcmhhcHMgSSYjMzk7bSBsb29raW5nIHRvIG9wdGltaXplIGRpcmVjdG9yeSBvcGVyYXRpb25zLiBSZWdhcmRsZXNzLCB0aGUgZmlyc3Qgc3RlcCBpcyBhbHdheXMgdG8gZ28gc3RyYWlnaHQgdG8gdGhlIHNvdXJjZSBhbmQgc2VlICpob3cqIHRoaXMgY3J1Y2lhbCBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgYW5kIHdoYXQgY29udGV4dCBpcyBzaGFwaW5nIGl0cyBleGVjdXRpb24uIEkgd2FudCB0byBzZWUgaG93IHRoZSBmdXNlIGRhZW1vbiBpbnRlcmFjdHMgd2l0aCB0aGUga2VybmVsIHNwYWNlLiBLbm93aW5nIHdoZXJlIGl0IGlzIGJlaW5nIGNhbGxlZCBmcm9tIHdpbGwgaGVscCBpbmZvcm0gbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgaW50ZXJhY3Rpb25zIGJldHdlZW4gdXNlcnNwYWNlIGFuZCB0aGUga2VybmVsLCBhbmQgdGhlIHJlc291cmNlcyB0aGF0IGl0IG1heSBiZSBjb25zdW1pbmcuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIHBvdGVudGlhbCBib3R0bGVuZWNrcywgcmFjZSBjb25kaXRpb25zLCBvciBtYXliZSBldmVuIG9wcG9ydHVuaXRpZXMgdG8gcmVkdWNlIHVubmVjZXNzYXJ5IHN5c3RlbSBjYWxscyBvciBpbXByb3ZlIGNhY2hpbmcgc3RyYXRlZ2llcyByZWxhdGVkIHRvIGRpcmVjdG9yeSBoYW5kbGluZyB3aXRoaW4gdGhlIEZVU0UgZnJhbWV3b3JrLiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3Mgd2hhdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjggMDA6MDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZnVzZV9kaXJfb3BlbiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2Z1c2UmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZnVzZS9kaXIuYz0xODY2PXN0YXRpYyBjb25zdCBjaGFyICpmdXNlX2dldF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9mdXNlL2Rpci5jLTE5MDItXG5mcy9mdXNlL2Rpci5jOjE5MDM6c3RhdGljIGludCBmdXNlX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxuZnMvZnVzZS9kaXIuYy0xOTA0LXtcbi0tXG5mcy9mdXNlL2Rpci5jPTI0NDg9c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnVzZV9kaXJfb3BlcmF0aW9ucyA9IHtcbi0tXG5mcy9mdXNlL2Rpci5jLTI0NTEtXHQuaXRlcmF0ZV9zaGFyZWRcdD0gZnVzZV9yZWFkZGlyLFxuZnMvZnVzZS9kaXIuYzoyNDUyOlx0Lm9wZW5cdFx0PSBmdXNlX2Rpcl9vcGVuLFxuZnMvZnVzZS9kaXIuYy0yNDUzLVx0LnJlbGVhc2VcdD0gZnVzZV9kaXJfcmVsZWFzZSxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjggMDA6MDc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjAxMjUKCQkJCQkJCW91dHB1dDogMTg2CgkJCQkJCQl0aG91Z2h0czogNTE2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBGVVNFIGFuZCBWaXJ0aW8tZnMgQ2hhbmdlcyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBJIHNlZSB0aGF0IGBmdXNlX29wZW5gIGlzIGhvb2tlZCB1cCB0byBgZnVzZV9maWxlX29wZXJhdGlvbnMub3BlbmAsIGFuZCBgZnVzZV9kaXJfb3BlbmAgdG8gYGZ1c2VfZGlyX29wZXJhdGlvbnMub3BlbmAuIGBmdXNlX3N0YXRmc2AgaXMgaGFuZGxpbmcgdGhlIGBzdGF0X2ZzYCBzdXBlciBvcGVyYXRpb24uIGBmdXNlX2RvX3NldGF0dHJgIGlzIG5vdyBleHBvc2VkLCBhbmQgSSBzZWUgaXQmIzM5O3MgZGVjbGFyZWQgaW4gYGZ1c2VfaS5oYCwgYWNjZXNzaWJsZSBmcm9tIG91dHNpZGUsIGFuZCBgZnVzZV9kb19nZXRhdHRyYCBpcyBjYWxsZWQgd2l0aGluIGBkaXIuY2AuIEFsc28sIGB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZWAsIGlzIGJlaW5nIGNhbGxlZCBieSB0aGUgdmlydGlvLWZzIGNvbXBsZXRpb24gcm91dGluZXMgaW4gYHZpcnRpb19mcy5jYC4KCkkmIzM5O3ZlIGdvdCBhIGdvb2QgaGFuZGxlIG9uIHdoZXJlIHRoZXNlIGNoYW5nZXMgdG91Y2ggdGhlIGNvZGViYXNlLiBUaGUgbW9kaWZpZWQgZmlsZXMgaW5jbHVkZSBgZnMvZnVzZS9kaXIuY2AsIGBmcy9mdXNlL2ZpbGUuY2AsIGBmcy9mdXNlL2Z1c2VfaS5oYCwgYGZzL2Z1c2UvaW5vZGUuY2AsIGFuZCBvZiBjb3Vyc2UgYGZzL2Z1c2UvdmlydGlvX2ZzLmNgLCBwbHVzIHRoZSBzZWxmdGVzdHMuCgpBcyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgYEZVU0VfRlNgIGFuZCBgVklSVElPX0ZTYCBhcmUgdGhlIG9uZXMgcmVsZXZhbnQgdG8gdGhpcyBjaGFuZ2UuIE5vIG90aGVyIGZpbGVzIGFyZSBtb2RpZmllZCBpbiBrZXJuZWwgc3BhY2UuCgpOb3csIEkmIzM5O3ZlIGdvdCBhIHNvbGlkIGxpc3Qgb2Yga2V5IHN5bWJvbHMgZm9yIGZ1cnRoZXIgYW5hbHlzaXM6IGBmdXNlX2RvX3NldGF0dHJgLCBgZnVzZV9vcGVuYCwgYGZ1c2VfZGlyX29wZW5gLCBgZnVzZV9kb19nZXRhdHRyYCwgYGZ1c2Vfc3RhdGZzYCwgYGZ1c2VfcmVhZGxpbmtfZm9saW9gLCBhbmQgYHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlYC4KCkFuZCBoZXJlIGFyZSB0aGUgcmVsZXZhbnQgY29uZmlncyBJIG5lZWQgdG8gY29uc2lkZXIgZm9yIHRlc3Rpbmc6IGBGVVNFX0ZTYCwgYW5kIGBWSVJUSU9fRlNgLgoKVGhpcyBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcuIFRoZSBwYXRjaCBpcyBhYm91dCBpbXByb3ZpbmcgZXJyb3IgaGFuZGxpbmcgaW4gRlVTRSBhbmQgdmlydGlvLWZzLCBzcGVjaWZpY2FsbHkgd2hlbiBsaXZlIG5vZGUgSUQgcmVxdWVzdHMgZmFpbCB3aXRoIC1FTk9FTlQuIEl0JiMzOTtzIHRyYW5zbGF0aW5nIHRob3NlIGVycm9ycyB0byAtRVNUQUxFIChmb3IgZ2V0YXR0ciwgc2V0YXR0ciwgcmVhZGxpbmssIHN0YXRmcykgb3IgLUVPUEVOU1RBTEUgKGZvciBvcGVuL29wZW5kaXIpIHNvIHRoZSBWRlMgbGF5ZXIgY2FuIHJldHJ5IHRoZSBwYXRoIHJlc29sdXRpb24gd2l0aCBMT09LVVBfUkVWQUwuIFRoaXMgdG91Y2hlcyBjb3JlIEZVU0UgYmVoYXZpb3IgYWNyb3NzIHNldmVyYWwgb3BlcmF0aW9ucywgYm90aCBzdGFuZGFyZCBGVVNFIG1vdW50cyBhbmQgdmlydGlvLWZzLiBUZXN0aW5nIHRoaXMgdGhvcm91Z2hseSBpcyBpbXBvcnRhbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDAwOjA3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtGVVNFX0ZTJiMzNDssCiAgICAmIzM0O1ZJUlRJT19GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2Z1c2VfZG9fc2V0YXR0ciYjMzQ7LAogICAgJiMzNDtmdXNlX29wZW4mIzM0OywKICAgICYjMzQ7ZnVzZV9kaXJfb3BlbiYjMzQ7LAogICAgJiMzNDtmdXNlX2RvX2dldGF0dHImIzM0OywKICAgICYjMzQ7ZnVzZV9zdGF0ZnMmIzM0OywKICAgICYjMzQ7ZnVzZV9yZWFkbGlua19mb2xpbyYjMzQ7LAogICAgJiMzNDt2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCB1cGRhdGVzIGVycm9yIGhhbmRsaW5nIGZvciBsaXZlIG5vZGUgSURzIGluIEZVU0UgYW5kIHZpcnRpby1mcyB3aGVuIHRoZSB1c2VyL2hvc3Qgc2VydmVyIHJldHVybnMgLUVOT0VOVCwgdHJhbnNsYXRpbmcgaXQgdG8gLUVTVEFMRSBvciAtRU9QRU5TVEFMRSB0byB0cmlnZ2VyIFZGUyBwYXRoIGxvb2t1cCByZXRyaWVzIChMT09LVVBfUkVWQUwpLiBUaGVzZSBmdW5jdGlvbmFsIGNoYW5nZXMgaW1wYWN0IGNvcmUgZmlsZSBvcGVyYXRpb25zIChvcGVuLCBnZXRhdHRyLCBzZXRhdHRyLCByZWFkbGluaywgc3RhdGZzKSBpbiBGVVNFIGFuZCB2aXJ0aW8tZnMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0ZVU0VfRlMmIzM0OywKICAgICYjMzQ7VklSVElPX0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7ZnVzZV9kb19zZXRhdHRyJiMzNDssCiAgICAmIzM0O2Z1c2Vfb3BlbiYjMzQ7LAogICAgJiMzNDtmdXNlX2Rpcl9vcGVuJiMzNDssCiAgICAmIzM0O2Z1c2VfZG9fZ2V0YXR0ciYjMzQ7LAogICAgJiMzNDtmdXNlX3N0YXRmcyYjMzQ7LAogICAgJiMzNDtmdXNlX3JlYWRsaW5rX2ZvbGlvJiMzNDssCiAgICAmIzM0O3ZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHVwZGF0ZXMgZXJyb3IgaGFuZGxpbmcgZm9yIGxpdmUgbm9kZSBJRHMgaW4gRlVTRSBhbmQgdmlydGlvLWZzIHdoZW4gdGhlIHVzZXIvaG9zdCBzZXJ2ZXIgcmV0dXJucyAtRU5PRU5ULCB0cmFuc2xhdGluZyBpdCB0byAtRVNUQUxFIG9yIC1FT1BFTlNUQUxFIHRvIHRyaWdnZXIgVkZTIHBhdGggbG9va3VwIHJldHJpZXMgKExPT0tVUF9SRVZBTCkuIFRoZXNlIGZ1bmN0aW9uYWwgY2hhbmdlcyBpbXBhY3QgY29yZSBmaWxlIG9wZXJhdGlvbnMgKG9wZW4sIGdldGF0dHIsIHNldGF0dHIsIHJlYWRsaW5rLCBzdGF0ZnMpIGluIEZVU0UgYW5kIHZpcnRpby1mcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjggMDA6MDc8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAwMDowNzwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHNlcmllcyBtb2RpZmllcyBlcnJvciBjb2RlIGhhbmRsaW5nIGluIEZVU0UgYW5kIHZpcnRpby1mcyBieSB0cmFuc2xhdGluZyAtRU5PRU5UIHJlc3BvbnNlcyB0byAtRVNUQUxFIG9yIC1FT1BFTlNUQUxFIGZvciBvcGVyYXRpb25zIHJlZmVyZW5jaW5nIGlub2RlcyBieSBub2RlaWQgKGUuZy4sIEZVU0VfT1BFTiwgRlVTRV9PUEVORElSLCBGVVNFX0dFVEFUVFIsIEZVU0VfU0VUQVRUUiwgRlVTRV9SRUFETElOSywgRlVTRV9TVEFURlMpIHRvIGVuYWJsZSBWRlMgcGF0aCBsb29rdXAgcmV0cmllcyAocmV0cnlfZXN0YWxlKS5cblxuVGhpcyBjaGFuZ2UgcHVyZWx5IGFsdGVycyBpbnRlZ2VyIHJldHVybiB2YWx1ZXMvZXJybm8gY29kZXMgaW4gZXJyb3IgcGF0aHMuIEl0IGRvZXMgbm90IGludHJvZHVjZSBvciBtb2RpZnkgYW55IG1lbW9yeSBhbGxvY2F0aW9ucywgc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucywgYnVmZmVyIGNvcGllcyB0byB1c2Vyc3BhY2UsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3Mgb3IgaW5mb3JtYXRpb24gZGlzY2xvc3VyZSB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4gZGV0ZWN0aW9uLiBBbnkgY29udHJvbCBmbG93IG9yIGZ1bmN0aW9uYWwgcmVncmVzc2lvbiBpc3N1ZXMgYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQgdGVzdGluZyBhbmQgS0FTQU4gYnVpbGRzLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBiNGNjYTM0YjZmZWU5NDg2M2IxYmUyMDM5MjA5MzhlMWY0YWY5YmU0CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBBdWcgMjggMDA6MDU6MzAgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9mcy9mdXNlL2Rpci5jIGIvZnMvZnVzZS9kaXIuYwppbmRleCBlNDliNGU4NzRiMTVmLi4yMTdhMDM5OTkwNTA3IDEwMDY0NAotLS0gYS9mcy9mdXNlL2Rpci5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2Z1c2UvZGlyLmMKQEAgLTE1MzIsNiAmIzQzOzE1MzIsOCBAQCBzdGF0aWMgaW50IGZ1c2VfZG9fZ2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCWlmIChzdGF0KQogCQkJCWZ1c2VfZmlsbGF0dHIoaWRtYXAsIGlub2RlLCAmYW1wO291dGFyZy5hdHRyLCBzdGF0KTsKIAkJfQomIzQzOwl9IGVsc2UgewomIzQzOwkJZXJyID0gZnVzZV9zdGFsZV9pbm9kZV9lcnIoZXJyKTsKIAl9CiAJcmV0dXJuIGVycjsKIH0KQEAgLTE4NDgsNiAmIzQzOzE4NTAsNyBAQCBzdGF0aWMgaW50IGZ1c2VfcmVhZGxpbmtfZm9saW8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZvbGlvICpmb2xpbykKIAogCWZ1c2VfaW52YWxpZGF0ZV9hdGltZShpbm9kZSk7CiAKJiM0MzsJcmVzID0gZnVzZV9zdGFsZV9pbm9kZV9lcnIocmVzKTsKIAlpZiAocmVzICZsdDsgMCkKIAkJcmV0dXJuIHJlczsKIApAQCAtMTkxMCw2ICYjNDM7MTkxMywxMiBAQCBzdGF0aWMgaW50IGZ1c2VfZGlyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiAJCXJldHVybiBlcnI7CiAKIAllcnIgPSBmdXNlX2RvX29wZW4oZm0sIGdldF9ub2RlX2lkKGlub2RlKSwgZmlsZSwgdHJ1ZSk7CiYjNDM7CS8qCiYjNDM7CSAqIEFzIGluIGZ1c2Vfb3Blbl9jb21tb24oKTogYSBwYXRoIHdhbGsgc3RhbmRzIGJlaGluZCB0aGlzIG9wZW4sCiYjNDM7CSAqIHNvIHRoZSByZWZ1c2FsIGlzIEVPUEVOU1RBTEUgZm9yIHBhdGhfb3BlbmF0KCkgdG8gYW5zd2VyLgomIzQzOwkgKi8KJiM0MzsJaWYgKGVyciA9PSAtRU5PRU5UKQomIzQzOwkJZXJyID0gLUVPUEVOU1RBTEU7CiAJaWYgKCFlcnIpIHsKIAkJc3RydWN0IGZ1c2VfZmlsZSAqZmYgPSBmaWxlLSZndDtwcml2YXRlX2RhdGE7CiAKQEAgLTIyNDksNiAmIzQzOzIyNTgsNyBAQCBpbnQgZnVzZV9kb19zZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJaWYgKGVycikgewogCQlpZiAoZXJyID09IC1FSU5UUikKIAkJCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGlub2RlKTsKJiM0MzsJCWVyciA9IGZ1c2Vfc3RhbGVfaW5vZGVfZXJyKGVycik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCmRpZmYgLS1naXQgYS9mcy9mdXNlL2ZpbGUuYyBiL2ZzL2Z1c2UvZmlsZS5jCmluZGV4IDhkNjEzNWE2MTA4YTQuLjMwOGIxNWMzMGYzNGQgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZmlsZS5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2Z1c2UvZmlsZS5jCkBAIC0yNzksNiAmIzQzOzI3OSwxNyBAQCBzdGF0aWMgaW50IGZ1c2Vfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIAkJZnVzZV9zZXRfbm93cml0ZShpbm9kZSk7CiAKIAllcnIgPSBmdXNlX2RvX29wZW4oZm0sIGdldF9ub2RlX2lkKGlub2RlKSwgZmlsZSwgZmFsc2UpOwomIzQzOwkvKgomIzQzOwkgKiBUaGlzIG9wZW4gcmVhY2hlZCB0aGUgc2VydmVyIHRocm91Z2ggYSBwYXRoIHdhbGssIHNvIGEgcmVmdXNhbAomIzQzOwkgKiBmb3IgdGhlIGxpdmUgbm9kZWlkIGlzIHJlcG9ydGVkIGFzIEVPUEVOU1RBTEUgcmF0aGVyIHRoYW4gdGhlCiYjNDM7CSAqIEVTVEFMRSB0aGUgbm9kZWlkLW9ubHkgcmVxdWVzdHMgc2F5OiBwYXRoX29wZW5hdCgpIHBpY2tzIHRoZQomIzQzOwkgKiBjaGVhcGVzdCByZXRyeSBmb3IgdGhlIHdhbGsgaW4gcHJvZ3Jlc3MsIEVDSElMRCB1bmRlciBMT09LVVBfUkNVCiYjNDM7CSAqIGFuZCBFU1RBTEUgb3RoZXJ3aXNlLiBmdXNlX2ZpbGVfb3BlbigpIGlzIGxlZnQgYWxvbmUgYmVjYXVzZQomIzQzOwkgKiBmdXNlX3ByaXZfaW9jdGxfcHJlcGFyZSgpIHJlYWNoZXMgaXQgdG8gc2VydmUgRlNfSU9DX0dFVEZMQUdTLAomIzQzOwkgKiB3aXRoIG5vIG9wZW4gYmVoaW5kIGl0IHRvIHRyYW5zbGF0ZSB0aGUgaW50ZXJuYWwgZXJybm8uCiYjNDM7CSAqLwomIzQzOwlpZiAoZXJyID09IC1FTk9FTlQpCiYjNDM7CQllcnIgPSAtRU9QRU5TVEFMRTsKIAlpZiAoIWVycikgewogCQlmZiA9IGZpbGUtJmd0O3ByaXZhdGVfZGF0YTsKIAkJZXJyID0gZnVzZV9maW5pc2hfb3Blbihpbm9kZSwgZmlsZSk7CmRpZmYgLS1naXQgYS9mcy9mdXNlL2Z1c2VfaS5oIGIvZnMvZnVzZS9mdXNlX2kuaAppbmRleCBjOGQ0YzVmM2FmN2U4Li5lNmIyNTk3ZDZkZDZmIDEwMDY0NAotLS0gYS9mcy9mdXNlL2Z1c2VfaS5oCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2Z1c2UvZnVzZV9pLmgKQEAgLTEyNTAsNiAmIzQzOzEyNTAsMjUgQEAgdm9pZCBmdXNlX2lub2RlX3VuY2FjaGVkX2lvX2VuZChzdHJ1Y3QgZnVzZV9pbm9kZSAqZmkpOwogaW50IGZ1c2VfZmlsZV9pb19vcGVuKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIHZvaWQgZnVzZV9maWxlX2lvX3JlbGVhc2Uoc3RydWN0IGZ1c2VfZmlsZSAqZmYsIHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogCiYjNDM7LyoKJiM0MzsgKiBSZXBvcnQgYSByZXF1ZXN0IHJlZnVzZWQgZm9yIGEgbGl2ZSBub2RlaWQgYXMgc3RhbGUuCiYjNDM7ICoKJiM0MzsgKiBBIHJlcXVlc3QgdGhhdCBuYW1lcyBhIG5vZGVpZCBhbmQgbm90aGluZyBlbHNlIGlzIG9ubHkgc2VudCBmb3IgYW4KJiM0MzsgKiBpbm9kZSB0aGUgY2xpZW50IGhhcyBsb29rZWQgdXAgYW5kIGhvbGRzIGEgcmVmZXJlbmNlIHRvLCBhbmQgdGhlCiYjNDM7ICogc2VydmVyIG93ZXMgdGhlIGNsaWVudCB0aGF0IGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuCiYjNDM7ICogRU5PRU5UIGZyb20gdGhlIHNlcnZlciBkZXNjcmliZXMgdGhlIGlub2RlIGl0c2VsZiByYXRoZXIgdGhhbiBhIG5hbWUKJiM0MzsgKiB0aGF0IGhhcyBnb25lIGF3YXkuIFJlcG9ydCB0aGUgaGFuZGxlIGFzIHN0YWxlLCB3aGljaCB0aGUgY2FsbGVyCiYjNDM7ICogYW5zd2VycyBieSByZXNvbHZpbmcgdGhlIG5hbWUgYWdhaW4gdW5kZXIgTE9PS1VQX1JFVkFMIGFuZCBhY3Rpbmcgb24KJiM0MzsgKiB3aGF0ZXZlciBpdCByZWZlcnMgdG8gbm93LiBBIG5hbWUgdGhhdCByZWFsbHkgaGFzIGdvbmUgZmFpbHMgdGhhdAomIzQzOyAqIHNlY29uZCBsb29rdXAgYW5kIHRoZSBjYWxsZXIgc3RpbGwgc2VlcyBFTk9FTlQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgZnVzZV9zdGFsZV9pbm9kZV9lcnIoaW50IGVycikKJiM0Mzt7CiYjNDM7CWlmIChlcnIgPT0gLUVOT0VOVCkKJiM0MzsJCXJldHVybiAtRVNUQUxFOwomIzQzOwlyZXR1cm4gZXJyOwomIzQzO30KJiM0MzsKIC8qIGZpbGUuYyAqLwogc3RydWN0IGZ1c2VfZmlsZSAqZnVzZV9maWxlX29wZW4oc3RydWN0IGZ1c2VfbW91bnQgKmZtLCB1NjQgbm9kZWlkLAogCQkJCSB1bnNpZ25lZCBpbnQgb3Blbl9mbGFncywgYm9vbCBpc2Rpcik7CmRpZmYgLS1naXQgYS9mcy9mdXNlL2lub2RlLmMgYi9mcy9mdXNlL2lub2RlLmMKaW5kZXggZTk1NTJiZTM2MzdiYy4uY2RlMGE1MzM1MDg5NyAxMDA2NDQKLS0tIGEvZnMvZnVzZS9pbm9kZS5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2Z1c2UvaW5vZGUuYwpAQCAtNjY2LDcgJiM0Mzs2NjYsNyBAQCBzdGF0aWMgaW50IGZ1c2Vfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKIAllcnIgPSBmdXNlX3NpbXBsZV9yZXF1ZXN0KGZtLCAmYW1wO2FyZ3MpOwogCWlmICghZXJyKQogCQljb252ZXJ0X2Z1c2Vfc3RhdGZzKGJ1ZiwgJmFtcDtvdXRhcmcuc3QpOwotCXJldHVybiBlcnI7CiYjNDM7CXJldHVybiBmdXNlX3N0YWxlX2lub2RlX2VycihlcnIpOwogfQogCiBzdGF0aWMgc3RydWN0IGZ1c2Vfc3luY19idWNrZXQgKmZ1c2Vfc3luY19idWNrZXRfYWxsb2Modm9pZCkKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvdmlydGlvX2ZzLmMgYi9mcy9mdXNlL3ZpcnRpb19mcy5jCmluZGV4IGYxNWU1MTZlYmNiNWMuLjdiMDNiZjg3YzJhZTggMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvdmlydGlvX2ZzLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZnVzZS92aXJ0aW9fZnMuYwpAQCAtNzgwLDYgJiM0Mzs3ODAsNjYgQEAgc3RhdGljIGJvb2wgdmlydGlvX2ZzX3ZlcmlmeV9yZXNwb25zZShzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwgdW5zaWduZWQgaW50IGxlbikKIAlyZXR1cm4gdHJ1ZTsKIH0KIAomIzQzOy8qCiYjNDM7ICogUmVwb3J0IGEgcmVxdWVzdCByZWZ1c2VkIGZvciBhIGxpdmUgbm9kZWlkIGFzIHN0YWxlLgomIzQzOyAqCiYjNDM7ICogVGhlc2UgcmVxdWVzdHMgY2FycnkgYSBub2RlaWQgYW5kIG5vIG5hbWUsIHNvIHRoZSBjbGllbnQgb25seSBzZW5kcyB0aGVtIGZvcgomIzQzOyAqIGFuIGlub2RlIGl0IGhhcyBhbHJlYWR5IGxvb2tlZCB1cCBhbmQgaG9sZHMgYSByZWZlcmVuY2UgdG8sIGFuZCBhIHNlcnZlciBvd2VzCiYjNDM7ICogdGhlIGNsaWVudCB0aGF0IGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuIEEgc2VydmVyIGFuc3dlcmluZyB3aXRoCiYjNDM7ICogRU5PRU5UIGlzIGRlc2NyaWJpbmcgYSBoYW5kbGUgaXQgd2FzIG9ibGlnZWQgdG8gaG9ub3VyIHJhdGhlciB0aGFuIGEgbmFtZQomIzQzOyAqIHRoYXQgaGFzIGdvbmUgYXdheSwgYW5kIHRoZSBjYWxsZXIgaGFzIG5vIHJlYXNvbiB0byBkb3VidCBpdC4KJiM0MzsgKgomIzQzOyAqIFNheWluZyB0aGUgaGFuZGxlIGlzIHN0YWxlIGlzIHNvbWV0aGluZyB0aGUgY2FsbGVyIGtub3dzIGhvdyB0byBhbnN3ZXI6IGl0CiYjNDM7ICogcmVwZWF0cyB0aGUgbG9va3VwIHVuZGVyIExPT0tVUF9SRVZBTCBhbmQgYWN0cyBvbiB3aGF0ZXZlciB0aGUgbmFtZSByZWZlcnMgdG8KJiM0MzsgKiBub3cuIEEgbmFtZSB0aGF0IGdlbnVpbmVseSBoYXMgZ29uZSBmYWlscyB0aGUgcmV0cmllZCBsb29rdXAsIHNvIGEgY2FsbGVyCiYjNDM7ICogc3RpbGwgbGVhcm5zIGl0IGlzIGdvbmUuIHJldHJ5X2VzdGFsZSgpIGlzIHdoYXQgZG9lcyB0aGlzLCBhbmQgZnMvbmFtZWkuYywKJiM0MzsgKiBmcy9vcGVuLmMsIGZzL3N0YXQuYywgZnMvc3RhdGZzLmMsIGZzL3V0aW1lcy5jIGFuZCBmcy94YXR0ci5jIGFsbCByZWFjaCBpdCwKJiM0MzsgKiB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZSBjb252ZXJzaW9uIHVzZWZ1bCByYXRoZXIgdGhhbiBhIHJlbmFtZSBvZiB0aGUgZXJyb3IuCiYjNDM7ICoKJiM0MzsgKiBBIHJlcXVlc3QgdGhhdCBuYW1lcyBzb21ldGhpbmcgd2hpY2ggY2FuIGl0c2VsZiBiZSBhYnNlbnQgaXMgbGVmdCBhbG9uZSwKJiM0MzsgKiBiZWNhdXNlIEVOT0VOVCBpcyB0aGVuIGFtYmlndW91cyBhbmQgaXMgZnJlcXVlbnRseSB0aGUgYW5zd2VyIHRoZSBjYWxsZXIKJiM0MzsgKiBhc2tlZCBmb3IuIEZVU0VfTE9PS1VQIHJlcG9ydHMgYSBtaXNzaW5nIG5hbWUgaW4gYSBsaXZpbmcgZGlyZWN0b3J5IGFuZCB0aGUKJiM0MzsgKiBkaXJlY3Rvcnkgb3BlcmF0aW9ucyBjYXJyeSBhIHBhcmVudCBub2RlaWQgYmVzaWRlIG9uZSwgc28gbmVpdGhlciBjYW4gYmUKJiM0MzsgKiByZWFkIGFzIGEgc3RhdGVtZW50IGFib3V0IHRoZSBpbm9kZS4gVGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSByZXF1ZXN0cyBiZWxvbmcKJiM0MzsgKiB3aXRoIHRoZW06IHRoZXkgY2FycnkgYW4gYXR0cmlidXRlIG5hbWUsIGFuZCB3aGlsZSBhIHNlcnZlciBzaG91bGQgcmVwb3J0IGEKJiM0MzsgKiBtaXNzaW5nIGF0dHJpYnV0ZSBhcyBFTk9EQVRBLCBvbmUgdGhhdCBhbnN3ZXJzIEVOT0VOVCBpbnN0ZWFkIHdvdWxkIGhhdmUgYQomIzQzOyAqIGNvcnJlY3QgcmVwbHkgdHVybmVkIGludG8gYSByZXRyeSB0aGF0IGNhbm5vdCBzdWNjZWVkLgomIzQzOyAqCiYjNDM7ICogUmVxdWVzdHMgYWdhaW5zdCBhbiBhbHJlYWR5IG9wZW4gZGVzY3JpcHRvciBhcmUgYWxzbyBsZWZ0IGFsb25lLCBzaW5jZSB0aGVyZQomIzQzOyAqIGlzIG5vIGVxdWl2YWxlbnQgcmV0cnkgdG8gcmVhY2ggYW5kIGNvbnZlcnRpbmcgdGhlIGVycm9yIHdvdWxkIHJlbmFtZSBhCiYjNDM7ICogZmFpbHVyZSByYXRoZXIgdGhhbiByZXBhaXIgaXQsIGFuZCBGVVNFX0lPQ1RMIGFuZCBGVVNFX1BPTEwgaGFuZCB0aGUKJiM0MzsgKiBzZXJ2ZXImIzM5O3MgZXJybm8gdG8gdXNlcnNwYWNlIHZlcmJhdGltLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIHZpcnRpb19mc19maXh1cF9zdGFsZV9lcnJvcihzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKJiM0Mzt7CiYjNDM7CWlmIChyZXEtJmd0O291dC5oLmVycm9yICE9IC1FTk9FTlQpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CXN3aXRjaCAocmVxLSZndDtpbi5oLm9wY29kZSkgewomIzQzOwljYXNlIEZVU0VfT1BFTjoKJiM0MzsJY2FzZSBGVVNFX09QRU5ESVI6CiYjNDM7CQkvKgomIzQzOwkJICogQW4gb3BlbiBzYXlzIEVPUEVOU1RBTEUsIGFuZCBwYXRoX29wZW5hdCgpIGRlY2lkZXMgd2hhdCB0aGUKJiM0MzsJCSAqIHdhbGsgaW4gcHJvZ3Jlc3Mgc2hvdWxkIG1ha2Ugb2YgaXQ6IEVDSElMRCB1bmRlciBMT09LVVBfUkNVCiYjNDM7CQkgKiBzbyBpdCBkcm9wcyB0byBSRUYtd2FsaywgRVNUQUxFIG90aGVyd2lzZSBzbyB0aGUgbmFtZSBpcwomIzQzOwkJICogcmVzb2x2ZWQgYWdhaW4gdW5kZXIgTE9PS1VQX1JFVkFMLiBOYW1pbmcgRVNUQUxFIGhlcmUgd291bGQKJiM0MzsJCSAqIHRha2UgdGhlIHNlY29uZCBpbiBib3RoIGNhc2VzIGFuZCBza2lwIGEgY2hlYXBlciByZXRyeS4KJiM0MzsJCSAqLwomIzQzOwkJcmVxLSZndDtvdXQuaC5lcnJvciA9IC1FT1BFTlNUQUxFOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgRlVTRV9HRVRBVFRSOgomIzQzOwljYXNlIEZVU0VfU0VUQVRUUjoKJiM0MzsJY2FzZSBGVVNFX1JFQURMSU5LOgomIzQzOwljYXNlIEZVU0VfU1RBVEZTOgomIzQzOwkJLyoKJiM0MzsJCSAqIE5vdGhpbmcgdHJhbnNsYXRlcyBFT1BFTlNUQUxFIG91dHNpZGUgdGhlIG9wZW4gcGF0aCwgc28KJiM0MzsJCSAqIHRoZXNlIHNheSBFU1RBTEUgZGlyZWN0bHksIHdoaWNoIHJldHJ5X2VzdGFsZSgpIGFuc3dlcnMuCiYjNDM7CQkgKi8KJiM0MzsJCXJlcS0mZ3Q7b3V0LmguZXJyb3IgPSAtRVNUQUxFOwomIzQzOwkJYnJlYWs7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiAvKiBXb3JrIGZ1bmN0aW9uIGZvciByZXF1ZXN0IGNvbXBsZXRpb24gKi8KIHN0YXRpYyB2b2lkIHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlKHN0cnVjdCBmdXNlX3JlcSAqcmVxLAogCQkJCSAgICAgICBzdHJ1Y3QgdmlydGlvX2ZzX3ZxICpmc3ZxKQpAQCAtODEwLDYgJiM0Mzs4NzAsOCBAQCBzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZShzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwKIAogCWNsZWFyX2JpdChGUl9TRU5ULCAmYW1wO3JlcS0mZ3Q7ZmxhZ3MpOwogCiYjNDM7CXZpcnRpb19mc19maXh1cF9zdGFsZV9lcnJvcihyZXEpOwomIzQzOwogCWZ1c2VfcmVxdWVzdF9lbmQocmVxKTsKIAlzcGluX2xvY2soJmFtcDtmc3ZxLSZndDtsb2NrKTsKIAlkZWNfaW5fZmxpZ2h0X3JlcShmc3ZxKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZQppbmRleCBmYjUxNjAzZmU0MTk4Li45Y2IzMDQ4MTI4ZDViIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlLy5naXRpZ25vcmUKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uZ2l0aWdub3JlCkBAIC0xLDQgJiM0MzsxLDYgQEAKICMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQomIzQzO2Z1c2VfYWNsX2NhY2hlX3Rlc3QKIGZ1c2VfbW50CiYjNDM7ZnVzZV9lc3RhbGVfdGVzdAogZnVzZWN0bF90ZXN0CiB3cml0ZV9leHRlbmRfZW9mX3Rlc3QKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL01ha2VmaWxlCmluZGV4IDk1YTFlZTk0N2NhNzYuLmY1NjRjYjM3YjNhNWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9NYWtlZmlsZQpAQCAtNiwxMSAmIzQzOzYsMTIgQEAgVEVTVF9HRU5fUFJPR1MgOj0gZnVzZWN0bF90ZXN0CiBURVNUX0dFTl9QUk9HUyAmIzQzOz0gd3JpdGVfZXh0ZW5kX2VvZl90ZXN0CiBURVNUX0dFTl9GSUxFUyA6PSBmdXNlX21udAogCi0jIGZ1c2VfYWNsX2NhY2hlX3Rlc3QgcmVxdWlyZXMgbGliZnVzZTM7IGFkZCBpdCBvbmx5IHdoZW4gdGhlIGxpYnJhcnkgaXMgcHJlc2VudC4KLUFDTF9DRkxBR1MgOj0gJChzaGVsbCBwa2ctY29uZmlnIGZ1c2UzIC0tY2ZsYWdzIDImZ3Q7L2Rldi9udWxsKQotQUNMX0xETElCUyA6PSAkKHNoZWxsIHBrZy1jb25maWcgZnVzZTMgLS1saWJzIDImZ3Q7L2Rldi9udWxsKQotaWZuZXEgKCQoQUNMX0NGTEFHUyksKQomIzQzOyMgVGhlc2UgdGVzdHMgcmVxdWlyZSBsaWJmdXNlMzsgYWRkIHRoZW0gb25seSB3aGVuIHRoZSBsaWJyYXJ5IGlzIHByZXNlbnQuCiYjNDM7RlVTRTNfQ0ZMQUdTIDo9ICQoc2hlbGwgcGtnLWNvbmZpZyBmdXNlMyAtLWNmbGFncyAyJmd0Oy9kZXYvbnVsbCkKJiM0MztGVVNFM19MRExJQlMgOj0gJChzaGVsbCBwa2ctY29uZmlnIGZ1c2UzIC0tbGlicyAyJmd0Oy9kZXYvbnVsbCkKJiM0MztpZm5lcSAoJChGVVNFM19DRkxBR1MpLCkKIFRFU1RfR0VOX1BST0dTICYjNDM7PSBmdXNlX2FjbF9jYWNoZV90ZXN0CiYjNDM7VEVTVF9HRU5fUFJPR1MgJiM0Mzs9IGZ1c2VfZXN0YWxlX3Rlc3QKIGVuZGlmCiAKIGluY2x1ZGUgLi4vLi4vbGliLm1rCkBAIC0zMCw1ICYjNDM7MzEsOCBAQCBlbmRpZgogJChPVVRQVVQpL2Z1c2VfbW50OiBDRkxBR1MgJiM0Mzs9ICQoVkFSX0NGTEFHUykKICQoT1VUUFVUKS9mdXNlX21udDogTERMSUJTICYjNDM7PSAkKFZBUl9MRExJQlMpCiAKLSQoT1VUUFVUKS9mdXNlX2FjbF9jYWNoZV90ZXN0OiBDRkxBR1MgJiM0Mzs9ICQoQUNMX0NGTEFHUykKLSQoT1VUUFVUKS9mdXNlX2FjbF9jYWNoZV90ZXN0OiBMRExJQlMgJiM0Mzs9ICQoQUNMX0xETElCUykKJiM0MzskKE9VVFBVVCkvZnVzZV9hY2xfY2FjaGVfdGVzdDogQ0ZMQUdTICYjNDM7PSAkKEZVU0UzX0NGTEFHUykKJiM0MzskKE9VVFBVVCkvZnVzZV9hY2xfY2FjaGVfdGVzdDogTERMSUJTICYjNDM7PSAkKEZVU0UzX0xETElCUykKJiM0MzsKJiM0MzskKE9VVFBVVCkvZnVzZV9lc3RhbGVfdGVzdDogQ0ZMQUdTICYjNDM7PSAkKEZVU0UzX0NGTEFHUykKJiM0MzskKE9VVFBVVCkvZnVzZV9lc3RhbGVfdGVzdDogTERMSUJTICYjNDM7PSAkKEZVU0UzX0xETElCUykKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvZnVzZV9lc3RhbGVfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9mdXNlX2VzdGFsZV90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uODJiODQyZDNhNWY3YgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvZnVzZV9lc3RhbGVfdGVzdC5jCkBAIC0wLDAgJiM0MzsxLDQ1MCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBUZXN0OiBhIHJlcXVlc3QgcmVmdXNlZCBmb3IgYW4gaW5vZGUgdGhlIGNsaWVudCBzdGlsbCBob2xkcyBhIHJlZmVyZW5jZSB0bwomIzQzOyAqCiYjNDM7ICogRlVTRV9PUEVOLCBGVVNFX0dFVEFUVFIsIEZVU0VfU0VUQVRUUiwgRlVTRV9SRUFETElOSyBhbmQgRlVTRV9TVEFURlMgY2FycnkgYQomIzQzOyAqIG5vZGVpZCByYXRoZXIgdGhhbiBhIHBhdGguICBUaGUgY2xpZW50IG9ubHkgc2VuZHMgdGhlbSBmb3IgYW4gaW5vZGUgaXQgaGFzCiYjNDM7ICogYWxyZWFkeSBsb29rZWQgdXAgYW5kIGhvbGRzIGEgcmVmZXJlbmNlIHRvLCBhbmQgYSBzZXJ2ZXIgb3dlcyB0aGUgY2xpZW50IHRoYXQKJiM0MzsgKiBpbm9kZSB1bnRpbCBpdCBpcyBzZW50IEZVU0VfRk9SR0VULiAgQSBzZXJ2ZXIgdGhhdCBsZXRzIHRoZSBpbm9kZSBnbyBlYXJseSwKJiM0MzsgKiBhcyBvbmUgYmFja2luZyBhIHNoYXJlZCBkaXJlY3RvcnkgZG9lcyB3aGVuIHRoZSBuYW1lIGlzIHJlbmFtZWQgb3ZlciwgYW5zd2VycwomIzQzOyAqIHdpdGggRU5PRU5ULgomIzQzOyAqCiYjNDM7ICogT24gYW4gdW5maXhlZCBrZXJuZWwgdGhhdCBFTk9FTlQgaXMgcGFzc2VkIG91dCB1bmNoYW5nZWQuICBUaGUgcGF0aCB3YWxrIGhhcwomIzQzOyAqIG5vIHJlYXNvbiB0byBkb3VidCBpdCBhbmQgdGhlIGNhbGxlciBpcyB0b2xkIGEgZmlsZSBpcyBtaXNzaW5nIHdoZW4gaXQgbmV2ZXIKJiM0MzsgKiBzdG9wcGVkIGV4aXN0aW5nLiAgQ2FsbGVycyB0aGF0IHJlYWQgYSBtaXNzaW5nIGZpbGUgYXMgYW4gZW1wdHkgb25lIGFjdCBvbgomIzQzOyAqIHRoZSBlbXB0aW5lc3MuCiYjNDM7ICoKJiM0MzsgKiBGaXhlZCAoZnMvZnVzZS9maWxlLmMgYW5kIGZzL2Z1c2UvZGlyLmMpOiBFTk9FTlQgYmVjb21lcyBFU1RBTEUsIHdoaWNoCiYjNDM7ICogZGVzY3JpYmVzIHRoZSBoYW5kbGUgcmF0aGVyIHRoYW4gdGhlIG5hbWUuICBmaWxlbmFtZV9sb29rdXAoKSBhbmQKJiM0MzsgKiBkb19maWxwX29wZW4oKSBhbHJlYWR5IHJldHJ5IHdpdGggTE9PS1VQX1JFVkFMIG9uIEVTVEFMRSwgc28gdGhlIG5hbWUgaXMKJiM0MzsgKiByZXNvbHZlZCBhZ2FpbiBhbmQgdGhlIGlub2RlIGl0IHJlZmVycyB0byBub3cgaXMgdXNlZC4gIEEgbmFtZSB0aGF0IGhhcwomIzQzOyAqIGdlbnVpbmVseSBnb25lIGF3YXkgZmFpbHMgdGhlIHJldHJpZWQgbG9va3VwLCBzbyBFTk9FTlQgc3RpbGwgcmVhY2hlcyBhCiYjNDM7ICogY2FsbGVyIHRoYXQgZGVzZXJ2ZXMgaXQuCiYjNDM7ICoKJiM0MzsgKiBPbmx5IHJlcXVlc3RzIHJlYWNoYWJsZSB0aHJvdWdoIGEgcGF0aCB3YWxrIGFyZSBjb3ZlcmVkLCBiZWNhdXNlIHRoZSByZXRyeQomIzQzOyAqIGlzIHdoYXQgbWFrZXMgRVNUQUxFIHVzZWZ1bCBhbmQgdGhlIHdhbGsgaXMgd2hhdCBwZXJmb3JtcyBpdC4gIEFuIG9wZXJhdGlvbgomIzQzOyAqIG9uIGEgZGVzY3JpcHRvciBhbHJlYWR5IG9wZW4gaGFzIG5vIGVxdWl2YWxlbnQgcmVjb3ZlcnkuCiYjNDM7ICoKJiM0MzsgKiBUZXN0IG91dGxpbmU6CiYjNDM7ICogIDEuIE1vdW50IGEgbWluaW1hbCBGVVNFIGZzIGhvbGRpbmcgb25lIGZpbGUuCiYjNDM7ICogIDIuIFRoZSBzZXJ2ZXIgcmVmdXNlcyB0aGUgZmlyc3QgcmVxdWVzdCBvZiB0aGUga2luZCB1bmRlciB0ZXN0IGFuZCBhbGxvd3MKJiM0MzsgKiAgICAgZXZlcnkgb25lIGFmdGVyIGl0LCBzdGFuZGluZyBpbiBmb3IgYSBzZXJ2ZXIgdGhhdCByZWxlYXNlZCB0aGUgaW5vZGUgYW5kCiYjNDM7ICogICAgIGhhcyBzaW5jZSByZXNvbHZlZCB0aGUgbmFtZSBhZ2Fpbi4KJiM0MzsgKiAgMy4gb3BlbmF0KCkgdGhlIGZpbGUuCiYjNDM7ICogICAgIEJ1Z2d5OiAgRU5PRU5UIHJlYWNoZXMgdGhlIGNhbGxlciwgb25lIG9wZW4gd2FzIGFza2VkIGZvci4gIEZBSUwuCiYjNDM7ICogICAgIEZpeGVkOiAgdGhlIHdhbGsgcmV0cmllcywgdGhlIHNlY29uZCBvcGVuIGlzIGFsbG93ZWQsIHRoZSBkZXNjcmlwdG9yIGlzCiYjNDM7ICogICAgICAgICAgICAgcmV0dXJuZWQsIHR3byBvcGVucyB3ZXJlIGFza2VkIGZvci4gIFBBU1MuCiYjNDM7ICogIDQuIHN0YXQoKSwgY2htb2QoKSwgcmVhZGxpbmsoKSBhbmQgc3RhdGZzKCkgYnkgbmFtZSwgd2hpY2ggYXJlIHRoZSBzYW1lCiYjNDM7ICogICAgIHJlY292ZXJ5IHRocm91Z2ggRlVTRV9HRVRBVFRSLCBGVVNFX1NFVEFUVFIsIEZVU0VfUkVBRExJTksgYW5kCiYjNDM7ICogICAgIEZVU0VfU1RBVEZTLiAgRWFjaCBpcyByZWFjaGVkIHRocm91Z2ggYSBwYXRoIHdhbGssIHdoaWNoIGlzIHdoYXQgbWFrZXMKJiM0MzsgKiAgICAgdGhlIHJldHJ5IGF2YWlsYWJsZS4KJiM0MzsgKiAgNS4gT3BlbiBhIG5hbWUgdGhlIHNlcnZlciBkb2VzIG5vdCBoYXZlIGF0IGFsbC4KJiM0MzsgKiAgICAgQm90aDogICBFTk9FTlQsIGJlY2F1c2UgdGhlIGxvb2t1cCBmYWlscyByYXRoZXIgdGhhbiB0aGUgb3BlbiwgYW5kIGEKJiM0MzsgKiAgICAgICAgICAgICBmaWxlIHRoYXQgaXMgYWJzZW50IG11c3Qgc3RpbGwgbG9vayBhYnNlbnQuCiYjNDM7ICovCiYjNDM7CiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRQomIzQzOyNkZWZpbmUgRlVTRV9VU0VfVkVSU0lPTiAzNAomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtlcnJuby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmdXNlX2xvd2xldmVsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2xpbWl0cy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtwdGhyZWFkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRib29sLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc3RhdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc3RhdHZmcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdmZzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3VuaXN0ZC5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7Li4vLi4va3NlbGZ0ZXN0X2hhcm5lc3MuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBGSUxFX05BTUUJJiMzNDtoZWxkJiMzNDsKJiM0MzsjZGVmaW5lIExJTktfTkFNRQkmIzM0O2hlbGQtbGluayYjMzQ7CiYjNDM7I2RlZmluZSBBQlNFTlRfTkFNRQkmIzM0O25vLXN1Y2gtZmlsZSYjMzQ7CiYjNDM7I2RlZmluZSBGSUxFX0lOTwkyCiYjNDM7I2RlZmluZSBMSU5LX0lOTwkzCiYjNDM7I2RlZmluZSBDT05URU5UUwkmIzM0O3ByZXNlbnRcbiYjMzQ7CiYjNDM7I2RlZmluZSBMSU5LX1RBUkdFVAlGSUxFX05BTUUKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFdoaWNoIHJlcXVlc3QgdGhlIHNlcnZlciByZWZ1c2VzLCBhbmQgaG93IG1hbnkgdGltZXMuICBTaGFyZWQgd2l0aCB0aGUKJiM0MzsgKiBkYWVtb24gdGhyZWFkOyBvbmUgdGVzdCBydW5zIGF0IGEgdGltZSwgc28gcGxhaW4gaW50cy4KJiM0MzsgKgomIzQzOyAqIEV2ZXJ5IG9uZSBvZiB0aGVzZSBuYW1lcyBhbiBpbm9kZSBieSBub2RlaWQgcmF0aGVyIHRoYW4gYnkgbmFtZSwgc28gYQomIzQzOyAqIHJlZnVzYWwgb2YgYW55IG9mIHRoZW0gaXMgZGVzY3JpYmluZyBhIGhhbmRsZSByYXRoZXIgdGhhbiBhIG1pc3NpbmcgZmlsZS4KJiM0MzsgKiBGVVNFX0xPT0tVUCBpcyBkZWxpYmVyYXRlbHkgYWJzZW50OiBpdCBjYXJyaWVzIGEgbmFtZSwgc28gaXRzIEVOT0VOVCBpcyBhbgomIzQzOyAqIGFuc3dlciByYXRoZXIgdGhhbiBhIGZhdWx0LCBhbmQgYWJzZW50X25hbWVfc3RpbGxfcmVwb3J0c19hYnNlbnQgY292ZXJzIGl0LgomIzQzOyAqLwomIzQzO2VudW0gcmVmdXNlX3doYXQgewomIzQzOwlSRUZVU0VfTk9USElORywKJiM0MzsJUkVGVVNFX09QRU4sCiYjNDM7CVJFRlVTRV9HRVRBVFRSLAomIzQzOwlSRUZVU0VfU0VUQVRUUiwKJiM0MzsJUkVGVVNFX1JFQURMSU5LLAomIzQzOwlSRUZVU0VfU1RBVEZTLAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCB7CiYjNDM7CWVudW0gcmVmdXNlX3doYXQgd2hhdDsKJiM0MzsJaW50IHJlZnVzYWxzX2xlZnQ7CiYjNDM7CWludCBvcGVuc19zZWVuOwomIzQzOwlpbnQgZ2V0YXR0cnNfc2VlbjsKJiM0MzsJaW50IHNldGF0dHJzX3NlZW47CiYjNDM7CWludCByZWFkbGlua3Nfc2VlbjsKJiM0MzsJaW50IHN0YXRmc3Nfc2VlbjsKJiM0Mzt9IGdfZHM7CiYjNDM7CiYjNDM7LyogVHJ1ZSBvbmNlLCBmb3IgdGhlIHJlcXVlc3QgdW5kZXIgdGVzdCwgYW5kIHRoZW4gbmV2ZXIgYWdhaW4uICovCiYjNDM7c3RhdGljIGJvb2wgcmVmdXNlX25vdyhlbnVtIHJlZnVzZV93aGF0IHdoYXQpCiYjNDM7ewomIzQzOwlpZiAoZ19kcy53aGF0ICE9IHdoYXQgfHwgZ19kcy5yZWZ1c2Fsc19sZWZ0ICZsdDs9IDApCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CWdfZHMucmVmdXNhbHNfbGVmdC0tOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgZmlsbF9hdHRyKGZ1c2VfaW5vX3QgaW5vLCBzdHJ1Y3Qgc3RhdCAqc3QpCiYjNDM7ewomIzQzOwltZW1zZXQoc3QsIDAsIHNpemVvZigqc3QpKTsKJiM0MzsJc3QtJmd0O3N0X2lubyA9IGlubzsKJiM0MzsJLyoKJiM0MzsJICogT3duZWQgYnkgd2hvZXZlciBydW5zIHRoZSB0ZXN0LCBzbyB0aGF0IGNobW9kKCkgaXMgYSByZXF1ZXN0IHRoZQomIzQzOwkgKiBrZXJuZWwgd2lsbCBjYXJyeSB0aHJvdWdoIHRvIHRoZSBzZXJ2ZXIgcmF0aGVyIHRoYW4gcmVmdXNlIGl0c2VsZi4KJiM0MzsJICovCiYjNDM7CXN0LSZndDtzdF91aWQgPSBnZXR1aWQoKTsKJiM0MzsJc3QtJmd0O3N0X2dpZCA9IGdldGdpZCgpOwomIzQzOwlpZiAoaW5vID09IEZVU0VfUk9PVF9JRCkgewomIzQzOwkJc3QtJmd0O3N0X21vZGUgPSBTX0lGRElSIHwgMDc1NTsKJiM0MzsJCXN0LSZndDtzdF9ubGluayA9IDI7CiYjNDM7CX0gZWxzZSBpZiAoaW5vID09IExJTktfSU5PKSB7CiYjNDM7CQlzdC0mZ3Q7c3RfbW9kZSA9IFNfSUZMTksgfCAwNzc3OwomIzQzOwkJc3QtJmd0O3N0X25saW5rID0gMTsKJiM0MzsJCXN0LSZndDtzdF9zaXplID0gc2l6ZW9mKExJTktfVEFSR0VUKSAtIDE7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlzdC0mZ3Q7c3RfbW9kZSA9IFNfSUZSRUcgfCAwNjQ0OwomIzQzOwkJc3QtJmd0O3N0X25saW5rID0gMTsKJiM0MzsJCXN0LSZndDtzdF9zaXplID0gc2l6ZW9mKENPTlRFTlRTKSAtIDE7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdF9sb29rdXAoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgcGFyZW50LCBjb25zdCBjaGFyICpuYW1lKQomIzQzO3sKJiM0MzsJc3RydWN0IGZ1c2VfZW50cnlfcGFyYW0gZTsKJiM0MzsJZnVzZV9pbm9fdCBpbm87CiYjNDM7CiYjNDM7CWlmIChwYXJlbnQgIT0gRlVTRV9ST09UX0lEKQomIzQzOwkJaW5vID0gMDsKJiM0MzsJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCBGSUxFX05BTUUpKQomIzQzOwkJaW5vID0gRklMRV9JTk87CiYjNDM7CWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgTElOS19OQU1FKSkKJiM0MzsJCWlubyA9IExJTktfSU5POwomIzQzOwllbHNlCiYjNDM7CQlpbm8gPSAwOwomIzQzOwomIzQzOwlpZiAoIWlubykgewomIzQzOwkJZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CW1lbXNldCgmYW1wO2UsIDAsIHNpemVvZihlKSk7CiYjNDM7CWUuaW5vID0gaW5vOwomIzQzOwllLmF0dHJfdGltZW91dCA9IDA7CiYjNDM7CWUuZW50cnlfdGltZW91dCA9IDA7CiYjNDM7CWZpbGxfYXR0cihpbm8sICZhbXA7ZS5hdHRyKTsKJiM0MzsJZnVzZV9yZXBseV9lbnRyeShyZXEsICZhbXA7ZSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRfZ2V0YXR0cihmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8sCiYjNDM7CQkgICAgICBzdHJ1Y3QgZnVzZV9maWxlX2luZm8gKmZpKQomIzQzO3sKJiM0MzsJc3RydWN0IHN0YXQgc3Q7CiYjNDM7CiYjNDM7CSh2b2lkKWZpOwomIzQzOwkvKiBUaGUgcm9vdCBpcyBsZWZ0IGFsb25lOyByZWZ1c2luZyBpdCB3b3VsZCBicmVhayB0aGUgbW91bnQgaXRzZWxmLiAqLwomIzQzOwlpZiAoaW5vID09IEZJTEVfSU5PKSB7CiYjNDM7CQlnX2RzLmdldGF0dHJzX3NlZW4mIzQzOyYjNDM7OwomIzQzOwkJaWYgKHJlZnVzZV9ub3coUkVGVVNFX0dFVEFUVFIpKSB7CiYjNDM7CQkJZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpOwomIzQzOwkJCXJldHVybjsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlmaWxsX2F0dHIoaW5vLCAmYW1wO3N0KTsKJiM0MzsJZnVzZV9yZXBseV9hdHRyKHJlcSwgJmFtcDtzdCwgMCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRfb3BlbihmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8sIHN0cnVjdCBmdXNlX2ZpbGVfaW5mbyAqZmkpCiYjNDM7ewomIzQzOwlpZiAoaW5vICE9IEZJTEVfSU5PKSB7CiYjNDM7CQlmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJZ19kcy5vcGVuc19zZWVuJiM0MzsmIzQzOzsKJiM0MzsJaWYgKHJlZnVzZV9ub3coUkVGVVNFX09QRU4pKSB7CiYjNDM7CQkvKgomIzQzOwkJICogVGhlIGlub2RlIGlzIGdvbmUgYXMgZmFyIGFzIHRoaXMgc2VydmVyIGlzIGNvbmNlcm5lZCwgZXZlbgomIzQzOwkJICogdGhvdWdoIHRoZSBjbGllbnQgaXMgaG9sZGluZyBhIHJlZmVyZW5jZSB0byBpdCBhbmQgYXNrZWQgYnkKJiM0MzsJCSAqIG5vZGVpZCByYXRoZXIgdGhhbiBieSBuYW1lLgomIzQzOwkJICovCiYjNDM7CQlmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsJZnVzZV9yZXBseV9vcGVuKHJlcSwgZmkpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0X3JlYWQoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgaW5vLCBzaXplX3Qgc2l6ZSwgb2ZmX3Qgb2ZmLAomIzQzOwkJICAgc3RydWN0IGZ1c2VfZmlsZV9pbmZvICpmaSkKJiM0Mzt7CiYjNDM7CXNpemVfdCBsZW4gPSBzaXplb2YoQ09OVEVOVFMpIC0gMTsKJiM0MzsKJiM0MzsJKHZvaWQpZmk7CiYjNDM7CWlmIChpbm8gIT0gRklMRV9JTk8pIHsKJiM0MzsJCWZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwlpZiAoKHNpemVfdClvZmYgJmd0Oz0gbGVuKSB7CiYjNDM7CQlmdXNlX3JlcGx5X2J1ZihyZXEsIE5VTEwsIDApOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CWlmIChvZmYgJiM0Mzsgc2l6ZSAmZ3Q7IGxlbikKJiM0MzsJCXNpemUgPSBsZW4gLSBvZmY7CiYjNDM7CWZ1c2VfcmVwbHlfYnVmKHJlcSwgQ09OVEVOVFMgJiM0Mzsgb2ZmLCBzaXplKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdF9zZXRhdHRyKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubywgc3RydWN0IHN0YXQgKmF0dHIsCiYjNDM7CQkgICAgICBpbnQgdG9fc2V0LCBzdHJ1Y3QgZnVzZV9maWxlX2luZm8gKmZpKQomIzQzO3sKJiM0MzsJc3RydWN0IHN0YXQgc3Q7CiYjNDM7CiYjNDM7CSh2b2lkKWF0dHI7CiYjNDM7CSh2b2lkKXRvX3NldDsKJiM0MzsJKHZvaWQpZmk7CiYjNDM7CWlmIChpbm8gPT0gRklMRV9JTk8pIHsKJiM0MzsJCWdfZHMuc2V0YXR0cnNfc2VlbiYjNDM7JiM0Mzs7CiYjNDM7CQlpZiAocmVmdXNlX25vdyhSRUZVU0VfU0VUQVRUUikpIHsKJiM0MzsJCQlmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7CiYjNDM7CQkJcmV0dXJuOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CWZpbGxfYXR0cihpbm8sICZhbXA7c3QpOwomIzQzOwlmdXNlX3JlcGx5X2F0dHIocmVxLCAmYW1wO3N0LCAwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdF9yZWFkbGluayhmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8pCiYjNDM7ewomIzQzOwlpZiAoaW5vICE9IExJTktfSU5PKSB7CiYjNDM7CQlmdXNlX3JlcGx5X2VycihyZXEsIEVJTlZBTCk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJZ19kcy5yZWFkbGlua3Nfc2VlbiYjNDM7JiM0Mzs7CiYjNDM7CWlmIChyZWZ1c2Vfbm93KFJFRlVTRV9SRUFETElOSykpIHsKJiM0MzsJCWZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwlmdXNlX3JlcGx5X3JlYWRsaW5rKHJlcSwgTElOS19UQVJHRVQpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0X3N0YXRmcyhmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8pCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc3RhdHZmcyBzZnM7CiYjNDM7CiYjNDM7CSh2b2lkKWlubzsKJiM0MzsJZ19kcy5zdGF0ZnNzX3NlZW4mIzQzOyYjNDM7OwomIzQzOwlpZiAocmVmdXNlX25vdyhSRUZVU0VfU1RBVEZTKSkgewomIzQzOwkJZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CW1lbXNldCgmYW1wO3NmcywgMCwgc2l6ZW9mKHNmcykpOwomIzQzOwlzZnMuZl9ic2l6ZSA9IDUxMjsKJiM0MzsJc2ZzLmZfZnJzaXplID0gNTEyOwomIzQzOwlzZnMuZl9uYW1lbWF4ID0gTkFNRV9NQVg7CiYjNDM7CWZ1c2VfcmVwbHlfc3RhdGZzKHJlcSwgJmFtcDtzZnMpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGZ1c2VfbG93bGV2ZWxfb3BzIGZzX29wcyA9IHsKJiM0MzsJLmxvb2t1cAkJPSB0X2xvb2t1cCwKJiM0MzsJLmdldGF0dHIJPSB0X2dldGF0dHIsCiYjNDM7CS5zZXRhdHRyCT0gdF9zZXRhdHRyLAomIzQzOwkucmVhZGxpbmsJPSB0X3JlYWRsaW5rLAomIzQzOwkuc3RhdGZzCQk9IHRfc3RhdGZzLAomIzQzOwkub3BlbgkJPSB0X29wZW4sCiYjNDM7CS5yZWFkCQk9IHRfcmVhZCwKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyB2b2lkICpydW5fZGFlbW9uKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CWZ1c2Vfc2Vzc2lvbl9sb29wKChzdHJ1Y3QgZnVzZV9zZXNzaW9uICopYXJnKTsKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzOy8qIC0tLS0ga3NlbGZ0ZXN0IGhhcm5lc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiYjNDM7CiYjNDM7RklYVFVSRShvcGVuX2VzdGFsZSkgewomIzQzOwlzdHJ1Y3QgZnVzZV9zZXNzaW9uICpzZTsKJiM0MzsJY2hhciAgICAgICAgICAgICAgICAgbW91bnRwb2ludFtQQVRIX01BWF07CiYjNDM7CWNoYXIgICAgICAgICAgICAgICAgIGZpbGVfcGF0aFtQQVRIX01BWF07CiYjNDM7CWNoYXIgICAgICAgICAgICAgICAgIGxpbmtfcGF0aFtQQVRIX01BWF07CiYjNDM7CWNoYXIgICAgICAgICAgICAgICAgIGFic2VudF9wYXRoW1BBVEhfTUFYXTsKJiM0MzsJcHRocmVhZF90ICAgICAgICAgICAgdGhyZWFkOwomIzQzO307CiYjNDM7CiYjNDM7RklYVFVSRV9TRVRVUChvcGVuX2VzdGFsZSkKJiM0Mzt7CiYjNDM7CWNoYXIgKmZ1c2VfYXJndltdID0geyAmIzM0O2Z1c2VfZXN0YWxlX3Rlc3QmIzM0OywgTlVMTCB9OwomIzQzOwlzdHJ1Y3QgZnVzZV9hcmdzIGFyZ3MgPSBGVVNFX0FSR1NfSU5JVCgxLCBmdXNlX2FyZ3YpOwomIzQzOwomIzQzOwltZW1zZXQoJmFtcDtnX2RzLCAwLCBzaXplb2YoZ19kcykpOwomIzQzOwlnX2RzLndoYXQgPSBSRUZVU0VfTk9USElORzsKJiM0MzsJZ19kcy5yZWZ1c2Fsc19sZWZ0ID0gMTsKJiM0MzsKJiM0MzsJc3RyY3B5KHNlbGYtJmd0O21vdW50cG9pbnQsICYjMzQ7L3RtcC9vcGVuX2VzdGFsZV90ZXN0X1hYWFhYWCYjMzQ7KTsKJiM0MzsJaWYgKCFta2R0ZW1wKHNlbGYtJmd0O21vdW50cG9pbnQpKQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7bWtkdGVtcDogJXMmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsKJiM0MzsJc25wcmludGYoc2VsZi0mZ3Q7ZmlsZV9wYXRoLCBzaXplb2Yoc2VsZi0mZ3Q7ZmlsZV9wYXRoKSwKJiM0MzsJCSAmIzM0OyVzLyYjMzQ7IEZJTEVfTkFNRSwgc2VsZi0mZ3Q7bW91bnRwb2ludCk7CiYjNDM7CXNucHJpbnRmKHNlbGYtJmd0O2xpbmtfcGF0aCwgc2l6ZW9mKHNlbGYtJmd0O2xpbmtfcGF0aCksCiYjNDM7CQkgJiMzNDslcy8mIzM0OyBMSU5LX05BTUUsIHNlbGYtJmd0O21vdW50cG9pbnQpOwomIzQzOwlzbnByaW50ZihzZWxmLSZndDthYnNlbnRfcGF0aCwgc2l6ZW9mKHNlbGYtJmd0O2Fic2VudF9wYXRoKSwKJiM0MzsJCSAmIzM0OyVzLyYjMzQ7IEFCU0VOVF9OQU1FLCBzZWxmLSZndDttb3VudHBvaW50KTsKJiM0MzsKJiM0MzsJc2VsZi0mZ3Q7c2UgPSBmdXNlX3Nlc3Npb25fbmV3KCZhbXA7YXJncywgJmFtcDtmc19vcHMsIHNpemVvZihmc19vcHMpLCBOVUxMKTsKJiM0MzsJaWYgKCFzZWxmLSZndDtzZSkgewomIzQzOwkJcm1kaXIoc2VsZi0mZ3Q7bW91bnRwb2ludCk7CiYjNDM7CQlTS0lQKHJldHVybiwgJiMzNDtmdXNlX3Nlc3Npb25fbmV3IGZhaWxlZCYjMzQ7KTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZnVzZV9zZXNzaW9uX21vdW50KHNlbGYtJmd0O3NlLCBzZWxmLSZndDttb3VudHBvaW50KSkgewomIzQzOwkJZnVzZV9zZXNzaW9uX2Rlc3Ryb3koc2VsZi0mZ3Q7c2UpOwomIzQzOwkJcm1kaXIoc2VsZi0mZ3Q7bW91bnRwb2ludCk7CiYjNDM7CQlTS0lQKHJldHVybiwgJiMzNDtmdXNlX3Nlc3Npb25fbW91bnQgZmFpbGVkIChubyBmdXNlcm1vdW50MyBvciBubyBwcml2aWxlZ2VzKSYjMzQ7KTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAocHRocmVhZF9jcmVhdGUoJmFtcDtzZWxmLSZndDt0aHJlYWQsIE5VTEwsIHJ1bl9kYWVtb24sIHNlbGYtJmd0O3NlKSkgewomIzQzOwkJZnVzZV9zZXNzaW9uX3VubW91bnQoc2VsZi0mZ3Q7c2UpOwomIzQzOwkJZnVzZV9zZXNzaW9uX2Rlc3Ryb3koc2VsZi0mZ3Q7c2UpOwomIzQzOwkJcm1kaXIoc2VsZi0mZ3Q7bW91bnRwb2ludCk7CiYjNDM7CQlTS0lQKHJldHVybiwgJiMzNDtwdGhyZWFkX2NyZWF0ZTogJXMmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJfQomIzQzOwomIzQzOwlmdXNlX29wdF9mcmVlX2FyZ3MoJmFtcDthcmdzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7RklYVFVSRV9URUFSRE9XTihvcGVuX2VzdGFsZSkKJiM0Mzt7CiYjNDM7CWZ1c2Vfc2Vzc2lvbl9leGl0KHNlbGYtJmd0O3NlKTsKJiM0MzsJZnVzZV9zZXNzaW9uX3VubW91bnQoc2VsZi0mZ3Q7c2UpOwomIzQzOwlwdGhyZWFkX2pvaW4oc2VsZi0mZ3Q7dGhyZWFkLCBOVUxMKTsKJiM0MzsJZnVzZV9zZXNzaW9uX2Rlc3Ryb3koc2VsZi0mZ3Q7c2UpOwomIzQzOwlybWRpcihzZWxmLSZndDttb3VudHBvaW50KTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX29wZW5faXNfcmV0cmllZCkKJiM0Mzt7CiYjNDM7CWludCBmZDsKJiM0MzsKJiM0MzsJZ19kcy53aGF0ID0gUkVGVVNFX09QRU47CiYjNDM7CiYjNDM7CWZkID0gb3BlbihzZWxmLSZndDtmaWxlX3BhdGgsIE9fUkRPTkxZKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHJlZnVzYWwgZGVzY3JpYmVzIGEgaGFuZGxlIHRoZSBzZXJ2ZXIgc2hvdWxkIGhhdmUgaG9ub3VyZWQsIHNvCiYjNDM7CSAqIHRoZSB3YWxrIGlzIGVudGl0bGVkIHRvIHJlc29sdmUgdGhlIG5hbWUgYWdhaW4gYW5kIG9wZW4gd2hhdCBpdAomIzQzOwkgKiByZWZlcnMgdG8gbm93LiBSZXBvcnRpbmcgdGhlIGZpbGUgbWlzc2luZyBpbnN0ZWFkIGVuZHMgdGhlIHdhbGsuCiYjNDM7CSAqLwomIzQzOwlBU1NFUlRfR0UoZmQsIDApIHsKJiM0MzsJCVRIX0xPRygmIzM0O29wZW4gZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgb3BlbiByZXF1ZXN0KHMpJiMzNDssCiYjNDM7CQkgICAgICAgc3RyZXJyb3IoZXJybm8pLCBnX2RzLm9wZW5zX3NlZW4pOwomIzQzOwl9CiYjNDM7CUVYUEVDVF9FUSgyLCBnX2RzLm9wZW5zX3NlZW4pOwomIzQzOwljbG9zZShmZCk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihvcGVuX2VzdGFsZSwgcmVmdXNlZF9nZXRhdHRyX29uX3BhdGhfaXNfcmV0cmllZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzdGF0IHN0OwomIzQzOwomIzQzOwlnX2RzLndoYXQgPSBSRUZVU0VfR0VUQVRUUjsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogUmVhY2hlZCBieSBuYW1lLCBzbyB0aGUgd2FsayBjYW4gcmVzb2x2ZSBpdCBhZ2FpbiBhbmQgYXNrIGEgc2Vjb25kCiYjNDM7CSAqIHRpbWUsIHRoZSBzYW1lIHJlY292ZXJ5IHRoZSBvcGVuIGdldHMuCiYjNDM7CSAqLwomIzQzOwlBU1NFUlRfRVEoMCwgc3RhdChzZWxmLSZndDtmaWxlX3BhdGgsICZhbXA7c3QpKSB7CiYjNDM7CQlUSF9MT0coJiMzNDtzdGF0IGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIGdldGF0dHIgcmVxdWVzdChzKSYjMzQ7LAomIzQzOwkJICAgICAgIHN0cmVycm9yKGVycm5vKSwgZ19kcy5nZXRhdHRyc19zZWVuKTsKJiM0MzsJfQomIzQzOwlFWFBFQ1RfR1QoZ19kcy5nZXRhdHRyc19zZWVuLCAxKTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX3NldGF0dHJfb25fcGF0aF9pc19yZXRyaWVkKQomIzQzO3sKJiM0MzsJZ19kcy53aGF0ID0gUkVGVVNFX1NFVEFUVFI7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIGNobW9kKCkgcmVhY2hlcyB0aGUgaW5vZGUgYnkgbmFtZSwgc28gdGhlIHNhbWUgcmV0cnkgYXBwbGllczogdGhlCiYjNDM7CSAqIHJlZnVzYWwgZGVzY3JpYmVzIGEgaGFuZGxlIGFuZCB0aGUgd2FsayBtYXkgcmVzb2x2ZSB0aGUgbmFtZSBhZ2Fpbi4KJiM0MzsJICovCiYjNDM7CUFTU0VSVF9FUSgwLCBjaG1vZChzZWxmLSZndDtmaWxlX3BhdGgsIDA2MDApKSB7CiYjNDM7CQlUSF9MT0coJiMzNDtjaG1vZCBmYWlsZWQgd2l0aCAlcyBhZnRlciAlZCBzZXRhdHRyIHJlcXVlc3QocykmIzM0OywKJiM0MzsJCSAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMuc2V0YXR0cnNfc2Vlbik7CiYjNDM7CX0KJiM0MzsJRVhQRUNUX0dUKGdfZHMuc2V0YXR0cnNfc2VlbiwgMSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihvcGVuX2VzdGFsZSwgcmVmdXNlZF9yZWFkbGlua19vbl9wYXRoX2lzX3JldHJpZWQpCiYjNDM7ewomIzQzOwljaGFyIGJ1ZltQQVRIX01BWF07CiYjNDM7CXNzaXplX3QgbjsKJiM0MzsKJiM0MzsJZ19kcy53aGF0ID0gUkVGVVNFX1JFQURMSU5LOwomIzQzOwomIzQzOwluID0gcmVhZGxpbmsoc2VsZi0mZ3Q7bGlua19wYXRoLCBidWYsIHNpemVvZihidWYpIC0gMSk7CiYjNDM7CUFTU0VSVF9HRShuLCAwKSB7CiYjNDM7CQlUSF9MT0coJiMzNDtyZWFkbGluayBmYWlsZWQgd2l0aCAlcyBhZnRlciAlZCByZWFkbGluayByZXF1ZXN0KHMpJiMzNDssCiYjNDM7CQkgICAgICAgc3RyZXJyb3IoZXJybm8pLCBnX2RzLnJlYWRsaW5rc19zZWVuKTsKJiM0MzsJfQomIzQzOwlidWZbbl0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7CUVYUEVDVF9TVFJFUShMSU5LX1RBUkdFVCwgYnVmKTsKJiM0MzsJRVhQRUNUX0dUKGdfZHMucmVhZGxpbmtzX3NlZW4sIDEpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfc3RhdGZzX29uX3BhdGhfaXNfcmV0cmllZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzdGF0ZnMgc2ZzOwomIzQzOwomIzQzOwlnX2RzLndoYXQgPSBSRUZVU0VfU1RBVEZTOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBzdGF0ZnMoKSBkZXNjcmliZXMgdGhlIG1vdW50IHJhdGhlciB0aGFuIHRoZSBmaWxlLCBidXQgaXQgaXMgc3RpbGwKJiM0MzsJICogcmVhY2hlZCB0aHJvdWdoIGEgcGF0aCB3YWxrLCBzbyBhIHJlZnVzYWwgdGhhdCBuYW1lcyBhIGhhbmRsZSBpcwomIzQzOwkgKiByZXRyaWVkIHRoZSBzYW1lIHdheS4KJiM0MzsJICovCiYjNDM7CUFTU0VSVF9FUSgwLCBzdGF0ZnMoc2VsZi0mZ3Q7ZmlsZV9wYXRoLCAmYW1wO3NmcykpIHsKJiM0MzsJCVRIX0xPRygmIzM0O3N0YXRmcyBmYWlsZWQgd2l0aCAlcyBhZnRlciAlZCBzdGF0ZnMgcmVxdWVzdChzKSYjMzQ7LAomIzQzOwkJICAgICAgIHN0cmVycm9yKGVycm5vKSwgZ19kcy5zdGF0ZnNzX3NlZW4pOwomIzQzOwl9CiYjNDM7CUVYUEVDVF9HVChnX2RzLnN0YXRmc3Nfc2VlbiwgMSk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihvcGVuX2VzdGFsZSwgYWJzZW50X25hbWVfc3RpbGxfcmVwb3J0c19hYnNlbnQpCiYjNDM7ewomIzQzOwlpbnQgZmQ7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEhlcmUgaXQgaXMgdGhlIGxvb2t1cCB0aGF0IGZhaWxzIHJhdGhlciB0aGFuIHRoZSBvcGVuLCBzbyBub3RoaW5nIGlzCiYjNDM7CSAqIGJlaW5nIGRlc2NyaWJlZCBhcyBzdGFsZSBhbmQgdGhlIGNhbGxlciBtdXN0IHN0aWxsIGJlIHRvbGQgdGhlIG5hbWUKJiM0MzsJICogaXMgbm90IHRoZXJlLgomIzQzOwkgKi8KJiM0MzsJZmQgPSBvcGVuKHNlbGYtJmd0O2Fic2VudF9wYXRoLCBPX1JET05MWSk7CiYjNDM7CUFTU0VSVF9MVChmZCwgMCk7CiYjNDM7CUVYUEVDVF9FUShFTk9FTlQsIGVycm5vKTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9IQVJORVNTX01BSU4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDAwOjA3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwMTI5CgkJCQkJCQlvdXRwdXQ6IDE5NQoJCQkJCQkJdGhvdWdodHM6IDEyNDAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHlzaXMgb2YgdGhlIEZVU0UgUGF0Y2ggU2VyaWVzIGFuZCBLTVNBTiBGdXp6aW5nIE5lZWRzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIFRoZSBvYmplY3RpdmUgaXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgRlVTRSBwYXRjaCBzZXJpZXMgd2FycmFudHMgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCBpdCBwcm9iYWJseSBkb2VzbiYjMzk7dCwgYnV0IGxldCYjMzk7cyBjb25maXJtLgoKVGhlIHBhdGNoIGZvY3VzZXMgb24gZXJyb3IgY29kZSB0cmFuc2xhdGlvbiB3aXRoaW4gdGhlIEZVU0Ugc3Vic3lzdGVtLiBTcGVjaWZpY2FsbHksIGl0IGNoYW5nZXMgaG93IGAtRU5PRU5UYCBpcyBoYW5kbGVkLCByZW1hcHBpbmcgaXQgdG8gYC1FU1RBTEVgIG9yIGAtRU9QRU5TVEFMRWAgaW4gdmFyaW91cyBmdW5jdGlvbnMgKGBmdXNlX2RvX2dldGF0dHJgLCBgZnVzZV9yZWFkbGlua19mb2xpb2AsIGBmdXNlX2Rpcl9vcGVuYCwgYGZ1c2VfZG9fc2V0YXR0cmAsIGBmdXNlX29wZW5gLCBgZnVzZV9zdGF0ZnNgLCBhbmQgYHZpcnRpb19mc19maXh1cF9zdGFsZV9lcnJvcmApLiBUaGlzIG1vZGlmaWNhdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRoZSBWRlMgcmV0cnkgbWVjaGFuaXNtIChgcmV0cnlfZXN0YWxlKClgIGFuZCBgcGF0aF9vcGVuYXQoKWApIG1vcmUgZWZmZWN0aXZlIHdoZW4gZGVhbGluZyB3aXRoIHN0YWxlIG5vZGUgSURzLgoKTXkgY29uY2VybnMgd2l0aCBLTVNBTiB0eXBpY2FsbHkgcmV2b2x2ZSBhcm91bmQgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIGluZm9ybWF0aW9uIGxlYWtzLCBhbmQgc2ltaWxhciB2dWxuZXJhYmlsaXRpZXMuIEkgbmVlZCB0byBhc2NlcnRhaW4gaWYgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGFueSBvZiB0aG9zZSByaXNrcy4KCkZpcnN0LCBJIGV4YW1pbmVkIHdoZXRoZXIgdGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IG1lbW9yeSBhbGxvY2F0aW9ucy4gTm8sIGl0IGRvZXNuJiMzOTt0LiBTZWNvbmQsIEkgY2hlY2tlZCBpZiB0aGUgcGF0Y2ggaXMgaW52b2x2ZWQgaW4gYW55IGNvcHkgdG8gdXNlciBzcGFjZSwgY29weSBmcm9tIHVuaW5pdGlhbGl6ZWQgZGF0YSB0byB0aGUga2VybmVsIG9yIHVzZXIgYnVmZmVycy4gVGhlcmUmIzM5O3Mgbm8gaW52b2x2ZW1lbnQuIFRoaXJkLCBJIGluc3BlY3RlZCBpZiB0aGVyZSBpcyBhbnkgc3RydWN0dXJlIHBhZGRpbmcgbW9kaWZpY2F0aW9uIG9yIGNvbnRyb2wgZmxvdyBtb2RpZmljYXRpb25zIHdoaWNoIGNvdWxkIGFsbG93IHJlYWRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZXJlJiMzOTtzIG5vIHN1Y2ggbW9kaWZpY2F0aW9uLiBUaGUgY29yZSBjaGFuZ2UgaXMgc2ltcGx5IHJlbWFwcGluZyBpbnRlZ2VyIGVycm9yIHJldHVybiBjb2Rlcy4KClRvIGJlIGFic29sdXRlbHkgc3VyZSwgSSYjMzk7bGwgZ28gdGhyb3VnaCB0aGUgc3RhbmRhcmQgS01TQU4gcmlzayBhcmVhcyBhZ2FpbjoKCjEuICAqKktlcm5lbCBzdHJ1Y3R1cmVzIHRvIHVzZXJzcGFjZSoqOiBObyBuZXcga2VybmVsIHN0cnVjdHVyZXMgYXJlIGJlaW5nIHNlbnQgdG8gdXNlciBzcGFjZSB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcyBvciBwYWRkaW5nIG1pZ2h0IGJlIGFuIGlzc3VlLgoyLiAgKipDb25kaXRpb25hbCBsb2dpYyBiYXNlZCBvbiB1bmluaXRpYWxpemVkIGRhdGEqKjogVGhlcmUmIzM5O3Mgbm8gYnJhbmNoaW5nIG9yIGNvbmRpdGlvbmFsIGxvZ2ljIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy4KMy4gICoqQ29tcGxleCBkYXRhIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbioqOiBObyBuZXcgYWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgcmVhZCBsYXRlci4KNC4gICoqQm91bmRzIGNoZWNrcyBhbmQgYnVmZmVyIG1hbmlwdWxhdGlvbnMqKjogVGhlcmUgYXJlIG5vIG1vZGlmaWNhdGlvbnMgdG8gYm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgdGhhdCB3b3VsZCBhbGxvdyByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgZnJvbSBleGlzdGluZyBidWZmZXJzLgoKSW4gc2hvcnQsIHRoaXMgaXMgcHJpbWFyaWx5IGEgcmVtYXBwaW5nIG9mIGVycm9yIGNvZGVzIHRvIGVuc3VyZSB0aGUgVkZTIHByb3Blcmx5IHJldHJpZXMgc3RhbGUgaW5vZGVzLiBLTVNBTiBkZXRlY3RzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLiBUaGlzIHBhdGNoIGRvZXNuJiMzOTt0IGludHJvZHVjZSBhbnkgbmV3IG1lbW9yeSBhbGxvY2F0aW9ucywgY29weSBvcGVyYXRpb25zLCBidWZmZXIgbWFuaXB1bGF0aW9ucywgb3IgaW5mb3JtYXRpb24gbGVha3MuIFN0YW5kYXJkIEtBU0FOL3N5emthbGxlciBmdXp6aW5nIHNob3VsZCBiZSBzdWZmaWNpZW50IHRvIGV4ZXJjaXNlIHRoZSBGVVNFIGZpbGVzeXN0ZW0gYmVoYXZpb3IgYW5kIGVycm9yLWhhbmRsaW5nIHBhdGhzIGNvdmVyZWQgYnkgdGhpcyBwYXRjaC4gQSBkZWRpY2F0ZWQgS01TQU4gcnVuIGlzbiYjMzk7dCBuZWNlc3NhcnkgaGVyZS4KCk9rYXksIEkmIzM5O20gY29uZmlkZW50IGluIHRoYXQgY29uY2x1c2lvbi4gTGV0JiMzOTtzIGNhbGwgdGhlIGBzZXQtcmVzdWx0c2AgdG9vbCBhbmQgbWFyayB0aGlzIGFzIG5vdCByZXF1aXJpbmcgS01TQU4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDAwOjA3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHNlcmllcyBtb2RpZmllcyBlcnJvciBjb2RlIGhhbmRsaW5nIGluIEZVU0UgYW5kIHZpcnRpby1mcyBieSB0cmFuc2xhdGluZyAtRU5PRU5UIHJlc3BvbnNlcyB0byAtRVNUQUxFIG9yIC1FT1BFTlNUQUxFIGZvciBvcGVyYXRpb25zIHJlZmVyZW5jaW5nIGlub2RlcyBieSBub2RlaWQgKGUuZy4sIEZVU0VfT1BFTiwgRlVTRV9PUEVORElSLCBGVVNFX0dFVEFUVFIsIEZVU0VfU0VUQVRUUiwgRlVTRV9SRUFETElOSywgRlVTRV9TVEFURlMpIHRvIGVuYWJsZSBWRlMgcGF0aCBsb29rdXAgcmV0cmllcyAocmV0cnlfZXN0YWxlKS5cblxuVGhpcyBjaGFuZ2UgcHVyZWx5IGFsdGVycyBpbnRlZ2VyIHJldHVybiB2YWx1ZXMvZXJybm8gY29kZXMgaW4gZXJyb3IgcGF0aHMuIEl0IGRvZXMgbm90IGludHJvZHVjZSBvciBtb2RpZnkgYW55IG1lbW9yeSBhbGxvY2F0aW9ucywgc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucywgYnVmZmVyIGNvcGllcyB0byB1c2Vyc3BhY2UsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3Mgb3IgaW5mb3JtYXRpb24gZGlzY2xvc3VyZSB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4gZGV0ZWN0aW9uLiBBbnkgY29udHJvbCBmbG93IG9yIGZ1bmN0aW9uYWwgcmVncmVzc2lvbiBpc3N1ZXMgYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQgdGVzdGluZyBhbmQgS0FTQU4gYnVpbGRzLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIG1vZGlmaWVzIGVycm9yIGNvZGUgaGFuZGxpbmcgaW4gRlVTRSBhbmQgdmlydGlvLWZzIGJ5IHRyYW5zbGF0aW5nIC1FTk9FTlQgcmVzcG9uc2VzIHRvIC1FU1RBTEUgb3IgLUVPUEVOU1RBTEUgZm9yIG9wZXJhdGlvbnMgcmVmZXJlbmNpbmcgaW5vZGVzIGJ5IG5vZGVpZCAoZS5nLiwgRlVTRV9PUEVOLCBGVVNFX09QRU5ESVIsIEZVU0VfR0VUQVRUUiwgRlVTRV9TRVRBVFRSLCBGVVNFX1JFQURMSU5LLCBGVVNFX1NUQVRGUykgdG8gZW5hYmxlIFZGUyBwYXRoIGxvb2t1cCByZXRyaWVzIChyZXRyeV9lc3RhbGUpLlxuXG5UaGlzIGNoYW5nZSBwdXJlbHkgYWx0ZXJzIGludGVnZXIgcmV0dXJuIHZhbHVlcy9lcnJubyBjb2RlcyBpbiBlcnJvciBwYXRocy4gSXQgZG9lcyBub3QgaW50cm9kdWNlIG9yIG1vZGlmeSBhbnkgbWVtb3J5IGFsbG9jYXRpb25zLCBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLCBidWZmZXIgY29waWVzIHRvIHVzZXJzcGFjZSwgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2VzcyBvciBpbmZvcm1hdGlvbiBkaXNjbG9zdXJlIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBkZXRlY3Rpb24uIEFueSBjb250cm9sIGZsb3cgb3IgZnVuY3Rpb25hbCByZWdyZXNzaW9uIGlzc3VlcyBhcmUgY292ZXJlZCBieSBzdGFuZGFyZCB0ZXN0aW5nIGFuZCBLQVNBTiBidWlsZHMuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDAwOjA1OjMxLjc5MjkwMjI5OFoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzNDY3Mjc0NzU5NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJGVVNFX0ZTXCIsXG4gICAgXCJWSVJUSU9fRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJmdXNlX2RvX3NldGF0dHJcIixcbiAgICBcImZ1c2Vfb3BlblwiLFxuICAgIFwiZnVzZV9kaXJfb3BlblwiLFxuICAgIFwiZnVzZV9kb19nZXRhdHRyXCIsXG4gICAgXCJmdXNlX3N0YXRmc1wiLFxuICAgIFwiZnVzZV9yZWFkbGlua19mb2xpb1wiLFxuICAgIFwidmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGVcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNlcmllcyBtb2RpZmllcyBlcnJvciBjb2RlIGhhbmRsaW5nIGluIEZVU0UgYW5kIHZpcnRpby1mcyBieSB0cmFuc2xhdGluZyAtRU5PRU5UIHJlc3BvbnNlcyB0byAtRVNUQUxFIG9yIC1FT1BFTlNUQUxFIGZvciBvcGVyYXRpb25zIHJlZmVyZW5jaW5nIGlub2RlcyBieSBub2RlaWQgKGUuZy4sIEZVU0VfT1BFTiwgRlVTRV9PUEVORElSLCBGVVNFX0dFVEFUVFIsIEZVU0VfU0VUQVRUUiwgRlVTRV9SRUFETElOSywgRlVTRV9TVEFURlMpIHRvIGVuYWJsZSBWRlMgcGF0aCBsb29rdXAgcmV0cmllcyAocmV0cnlfZXN0YWxlKS5cXG5cXG5UaGlzIGNoYW5nZSBwdXJlbHkgYWx0ZXJzIGludGVnZXIgcmV0dXJuIHZhbHVlcy9lcnJubyBjb2RlcyBpbiBlcnJvciBwYXRocy4gSXQgZG9lcyBub3QgaW50cm9kdWNlIG9yIG1vZGlmeSBhbnkgbWVtb3J5IGFsbG9jYXRpb25zLCBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLCBidWZmZXIgY29waWVzIHRvIHVzZXJzcGFjZSwgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2VzcyBvciBpbmZvcm1hdGlvbiBkaXNjbG9zdXJlIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBkZXRlY3Rpb24uIEFueSBjb250cm9sIGZsb3cgb3IgZnVuY3Rpb25hbCByZWdyZXNzaW9uIGlzc3VlcyBhcmUgY292ZXJlZCBieSBzdGFuZGFyZCB0ZXN0aW5nIGFuZCBLQVNBTiBidWlsZHMuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggdXBkYXRlcyBlcnJvciBoYW5kbGluZyBmb3IgbGl2ZSBub2RlIElEcyBpbiBGVVNFIGFuZCB2aXJ0aW8tZnMgd2hlbiB0aGUgdXNlci9ob3N0IHNlcnZlciByZXR1cm5zIC1FTk9FTlQsIHRyYW5zbGF0aW5nIGl0IHRvIC1FU1RBTEUgb3IgLUVPUEVOU1RBTEUgdG8gdHJpZ2dlciBWRlMgcGF0aCBsb29rdXAgcmV0cmllcyAoTE9PS1VQX1JFVkFMKS4gVGhlc2UgZnVuY3Rpb25hbCBjaGFuZ2VzIGltcGFjdCBjb3JlIGZpbGUgb3BlcmF0aW9ucyAob3BlbiwgZ2V0YXR0ciwgc2V0YXR0ciwgcmVhZGxpbmssIHN0YXRmcykgaW4gRlVTRSBhbmQgdmlydGlvLWZzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQwMDowNTozMS43OTI5MTAzODhaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUzNTc3MjQwMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGI0Y2NhMzRiNmZlZTk0ODYzYjFiZTIwMzkyMDkzOGUxZjRhZjliZTRcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIEZyaSBBdWcgMjggMDA6MDU6MzAgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvZnMvZnVzZS9kaXIuYyBiL2ZzL2Z1c2UvZGlyLmNcXG5pbmRleCBlNDliNGU4NzRiMTVmLi4yMTdhMDM5OTkwNTA3IDEwMDY0NFxcbi0tLSBhL2ZzL2Z1c2UvZGlyLmNcXG4rKysgYi9mcy9mdXNlL2Rpci5jXFxuQEAgLTE1MzIsNiArMTUzMiw4IEBAIHN0YXRpYyBpbnQgZnVzZV9kb19nZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiBcXHRcXHRcXHRpZiAoc3RhdClcXG4gXFx0XFx0XFx0XFx0ZnVzZV9maWxsYXR0cihpZG1hcCwgaW5vZGUsIFxcdTAwMjZvdXRhcmcuYXR0ciwgc3RhdCk7XFxuIFxcdFxcdH1cXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0ZXJyID0gZnVzZV9zdGFsZV9pbm9kZV9lcnIoZXJyKTtcXG4gXFx0fVxcbiBcXHRyZXR1cm4gZXJyO1xcbiB9XFxuQEAgLTE4NDgsNiArMTg1MCw3IEBAIHN0YXRpYyBpbnQgZnVzZV9yZWFkbGlua19mb2xpbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiBcXG4gXFx0ZnVzZV9pbnZhbGlkYXRlX2F0aW1lKGlub2RlKTtcXG4gXFxuK1xcdHJlcyA9IGZ1c2Vfc3RhbGVfaW5vZGVfZXJyKHJlcyk7XFxuIFxcdGlmIChyZXMgXFx1MDAzYyAwKVxcbiBcXHRcXHRyZXR1cm4gcmVzO1xcbiBcXG5AQCAtMTkxMCw2ICsxOTEzLDEyIEBAIHN0YXRpYyBpbnQgZnVzZV9kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcXG4gXFx0XFx0cmV0dXJuIGVycjtcXG4gXFxuIFxcdGVyciA9IGZ1c2VfZG9fb3BlbihmbSwgZ2V0X25vZGVfaWQoaW5vZGUpLCBmaWxlLCB0cnVlKTtcXG4rXFx0LypcXG4rXFx0ICogQXMgaW4gZnVzZV9vcGVuX2NvbW1vbigpOiBhIHBhdGggd2FsayBzdGFuZHMgYmVoaW5kIHRoaXMgb3BlbixcXG4rXFx0ICogc28gdGhlIHJlZnVzYWwgaXMgRU9QRU5TVEFMRSBmb3IgcGF0aF9vcGVuYXQoKSB0byBhbnN3ZXIuXFxuK1xcdCAqL1xcbitcXHRpZiAoZXJyID09IC1FTk9FTlQpXFxuK1xcdFxcdGVyciA9IC1FT1BFTlNUQUxFO1xcbiBcXHRpZiAoIWVycikge1xcbiBcXHRcXHRzdHJ1Y3QgZnVzZV9maWxlICpmZiA9IGZpbGUtXFx1MDAzZXByaXZhdGVfZGF0YTtcXG4gXFxuQEAgLTIyNDksNiArMjI1OCw3IEBAIGludCBmdXNlX2RvX3NldGF0dHIoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSxcXG4gXFx0aWYgKGVycikge1xcbiBcXHRcXHRpZiAoZXJyID09IC1FSU5UUilcXG4gXFx0XFx0XFx0ZnVzZV9pbnZhbGlkYXRlX2F0dHIoaW5vZGUpO1xcbitcXHRcXHRlcnIgPSBmdXNlX3N0YWxlX2lub2RlX2VycihlcnIpO1xcbiBcXHRcXHRnb3RvIGVycm9yO1xcbiBcXHR9XFxuIFxcbmRpZmYgLS1naXQgYS9mcy9mdXNlL2ZpbGUuYyBiL2ZzL2Z1c2UvZmlsZS5jXFxuaW5kZXggOGQ2MTM1YTYxMDhhNC4uMzA4YjE1YzMwZjM0ZCAxMDA2NDRcXG4tLS0gYS9mcy9mdXNlL2ZpbGUuY1xcbisrKyBiL2ZzL2Z1c2UvZmlsZS5jXFxuQEAgLTI3OSw2ICsyNzksMTcgQEAgc3RhdGljIGludCBmdXNlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXFxuIFxcdFxcdGZ1c2Vfc2V0X25vd3JpdGUoaW5vZGUpO1xcbiBcXG4gXFx0ZXJyID0gZnVzZV9kb19vcGVuKGZtLCBnZXRfbm9kZV9pZChpbm9kZSksIGZpbGUsIGZhbHNlKTtcXG4rXFx0LypcXG4rXFx0ICogVGhpcyBvcGVuIHJlYWNoZWQgdGhlIHNlcnZlciB0aHJvdWdoIGEgcGF0aCB3YWxrLCBzbyBhIHJlZnVzYWxcXG4rXFx0ICogZm9yIHRoZSBsaXZlIG5vZGVpZCBpcyByZXBvcnRlZCBhcyBFT1BFTlNUQUxFIHJhdGhlciB0aGFuIHRoZVxcbitcXHQgKiBFU1RBTEUgdGhlIG5vZGVpZC1vbmx5IHJlcXVlc3RzIHNheTogcGF0aF9vcGVuYXQoKSBwaWNrcyB0aGVcXG4rXFx0ICogY2hlYXBlc3QgcmV0cnkgZm9yIHRoZSB3YWxrIGluIHByb2dyZXNzLCBFQ0hJTEQgdW5kZXIgTE9PS1VQX1JDVVxcbitcXHQgKiBhbmQgRVNUQUxFIG90aGVyd2lzZS4gZnVzZV9maWxlX29wZW4oKSBpcyBsZWZ0IGFsb25lIGJlY2F1c2VcXG4rXFx0ICogZnVzZV9wcml2X2lvY3RsX3ByZXBhcmUoKSByZWFjaGVzIGl0IHRvIHNlcnZlIEZTX0lPQ19HRVRGTEFHUyxcXG4rXFx0ICogd2l0aCBubyBvcGVuIGJlaGluZCBpdCB0byB0cmFuc2xhdGUgdGhlIGludGVybmFsIGVycm5vLlxcbitcXHQgKi9cXG4rXFx0aWYgKGVyciA9PSAtRU5PRU5UKVxcbitcXHRcXHRlcnIgPSAtRU9QRU5TVEFMRTtcXG4gXFx0aWYgKCFlcnIpIHtcXG4gXFx0XFx0ZmYgPSBmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxuIFxcdFxcdGVyciA9IGZ1c2VfZmluaXNoX29wZW4oaW5vZGUsIGZpbGUpO1xcbmRpZmYgLS1naXQgYS9mcy9mdXNlL2Z1c2VfaS5oIGIvZnMvZnVzZS9mdXNlX2kuaFxcbmluZGV4IGM4ZDRjNWYzYWY3ZTguLmU2YjI1OTdkNmRkNmYgMTAwNjQ0XFxuLS0tIGEvZnMvZnVzZS9mdXNlX2kuaFxcbisrKyBiL2ZzL2Z1c2UvZnVzZV9pLmhcXG5AQCAtMTI1MCw2ICsxMjUwLDI1IEBAIHZvaWQgZnVzZV9pbm9kZV91bmNhY2hlZF9pb19lbmQoc3RydWN0IGZ1c2VfaW5vZGUgKmZpKTtcXG4gaW50IGZ1c2VfZmlsZV9pb19vcGVuKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTtcXG4gdm9pZCBmdXNlX2ZpbGVfaW9fcmVsZWFzZShzdHJ1Y3QgZnVzZV9maWxlICpmZiwgc3RydWN0IGlub2RlICppbm9kZSk7XFxuIFxcbisvKlxcbisgKiBSZXBvcnQgYSByZXF1ZXN0IHJlZnVzZWQgZm9yIGEgbGl2ZSBub2RlaWQgYXMgc3RhbGUuXFxuKyAqXFxuKyAqIEEgcmVxdWVzdCB0aGF0IG5hbWVzIGEgbm9kZWlkIGFuZCBub3RoaW5nIGVsc2UgaXMgb25seSBzZW50IGZvciBhblxcbisgKiBpbm9kZSB0aGUgY2xpZW50IGhhcyBsb29rZWQgdXAgYW5kIGhvbGRzIGEgcmVmZXJlbmNlIHRvLCBhbmQgdGhlXFxuKyAqIHNlcnZlciBvd2VzIHRoZSBjbGllbnQgdGhhdCBpbm9kZSB1bnRpbCBpdCBpcyBzZW50IEZVU0VfRk9SR0VULlxcbisgKiBFTk9FTlQgZnJvbSB0aGUgc2VydmVyIGRlc2NyaWJlcyB0aGUgaW5vZGUgaXRzZWxmIHJhdGhlciB0aGFuIGEgbmFtZVxcbisgKiB0aGF0IGhhcyBnb25lIGF3YXkuIFJlcG9ydCB0aGUgaGFuZGxlIGFzIHN0YWxlLCB3aGljaCB0aGUgY2FsbGVyXFxuKyAqIGFuc3dlcnMgYnkgcmVzb2x2aW5nIHRoZSBuYW1lIGFnYWluIHVuZGVyIExPT0tVUF9SRVZBTCBhbmQgYWN0aW5nIG9uXFxuKyAqIHdoYXRldmVyIGl0IHJlZmVycyB0byBub3cuIEEgbmFtZSB0aGF0IHJlYWxseSBoYXMgZ29uZSBmYWlscyB0aGF0XFxuKyAqIHNlY29uZCBsb29rdXAgYW5kIHRoZSBjYWxsZXIgc3RpbGwgc2VlcyBFTk9FTlQuXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBmdXNlX3N0YWxlX2lub2RlX2VycihpbnQgZXJyKVxcbit7XFxuK1xcdGlmIChlcnIgPT0gLUVOT0VOVClcXG4rXFx0XFx0cmV0dXJuIC1FU1RBTEU7XFxuK1xcdHJldHVybiBlcnI7XFxuK31cXG4rXFxuIC8qIGZpbGUuYyAqL1xcbiBzdHJ1Y3QgZnVzZV9maWxlICpmdXNlX2ZpbGVfb3BlbihzdHJ1Y3QgZnVzZV9tb3VudCAqZm0sIHU2NCBub2RlaWQsXFxuIFxcdFxcdFxcdFxcdCB1bnNpZ25lZCBpbnQgb3Blbl9mbGFncywgYm9vbCBpc2Rpcik7XFxuZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvaW5vZGUuYyBiL2ZzL2Z1c2UvaW5vZGUuY1xcbmluZGV4IGU5NTUyYmUzNjM3YmMuLmNkZTBhNTMzNTA4OTcgMTAwNjQ0XFxuLS0tIGEvZnMvZnVzZS9pbm9kZS5jXFxuKysrIGIvZnMvZnVzZS9pbm9kZS5jXFxuQEAgLTY2Niw3ICs2NjYsNyBAQCBzdGF0aWMgaW50IGZ1c2Vfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZilcXG4gXFx0ZXJyID0gZnVzZV9zaW1wbGVfcmVxdWVzdChmbSwgXFx1MDAyNmFyZ3MpO1xcbiBcXHRpZiAoIWVycilcXG4gXFx0XFx0Y29udmVydF9mdXNlX3N0YXRmcyhidWYsIFxcdTAwMjZvdXRhcmcuc3QpO1xcbi1cXHRyZXR1cm4gZXJyO1xcbitcXHRyZXR1cm4gZnVzZV9zdGFsZV9pbm9kZV9lcnIoZXJyKTtcXG4gfVxcbiBcXG4gc3RhdGljIHN0cnVjdCBmdXNlX3N5bmNfYnVja2V0ICpmdXNlX3N5bmNfYnVja2V0X2FsbG9jKHZvaWQpXFxuZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvdmlydGlvX2ZzLmMgYi9mcy9mdXNlL3ZpcnRpb19mcy5jXFxuaW5kZXggZjE1ZTUxNmViY2I1Yy4uN2IwM2JmODdjMmFlOCAxMDA2NDRcXG4tLS0gYS9mcy9mdXNlL3ZpcnRpb19mcy5jXFxuKysrIGIvZnMvZnVzZS92aXJ0aW9fZnMuY1xcbkBAIC03ODAsNiArNzgwLDY2IEBAIHN0YXRpYyBib29sIHZpcnRpb19mc192ZXJpZnlfcmVzcG9uc2Uoc3RydWN0IGZ1c2VfcmVxICpyZXEsIHVuc2lnbmVkIGludCBsZW4pXFxuIFxcdHJldHVybiB0cnVlO1xcbiB9XFxuIFxcbisvKlxcbisgKiBSZXBvcnQgYSByZXF1ZXN0IHJlZnVzZWQgZm9yIGEgbGl2ZSBub2RlaWQgYXMgc3RhbGUuXFxuKyAqXFxuKyAqIFRoZXNlIHJlcXVlc3RzIGNhcnJ5IGEgbm9kZWlkIGFuZCBubyBuYW1lLCBzbyB0aGUgY2xpZW50IG9ubHkgc2VuZHMgdGhlbSBmb3JcXG4rICogYW4gaW5vZGUgaXQgaGFzIGFscmVhZHkgbG9va2VkIHVwIGFuZCBob2xkcyBhIHJlZmVyZW5jZSB0bywgYW5kIGEgc2VydmVyIG93ZXNcXG4rICogdGhlIGNsaWVudCB0aGF0IGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuIEEgc2VydmVyIGFuc3dlcmluZyB3aXRoXFxuKyAqIEVOT0VOVCBpcyBkZXNjcmliaW5nIGEgaGFuZGxlIGl0IHdhcyBvYmxpZ2VkIHRvIGhvbm91ciByYXRoZXIgdGhhbiBhIG5hbWVcXG4rICogdGhhdCBoYXMgZ29uZSBhd2F5LCBhbmQgdGhlIGNhbGxlciBoYXMgbm8gcmVhc29uIHRvIGRvdWJ0IGl0LlxcbisgKlxcbisgKiBTYXlpbmcgdGhlIGhhbmRsZSBpcyBzdGFsZSBpcyBzb21ldGhpbmcgdGhlIGNhbGxlciBrbm93cyBob3cgdG8gYW5zd2VyOiBpdFxcbisgKiByZXBlYXRzIHRoZSBsb29rdXAgdW5kZXIgTE9PS1VQX1JFVkFMIGFuZCBhY3RzIG9uIHdoYXRldmVyIHRoZSBuYW1lIHJlZmVycyB0b1xcbisgKiBub3cuIEEgbmFtZSB0aGF0IGdlbnVpbmVseSBoYXMgZ29uZSBmYWlscyB0aGUgcmV0cmllZCBsb29rdXAsIHNvIGEgY2FsbGVyXFxuKyAqIHN0aWxsIGxlYXJucyBpdCBpcyBnb25lLiByZXRyeV9lc3RhbGUoKSBpcyB3aGF0IGRvZXMgdGhpcywgYW5kIGZzL25hbWVpLmMsXFxuKyAqIGZzL29wZW4uYywgZnMvc3RhdC5jLCBmcy9zdGF0ZnMuYywgZnMvdXRpbWVzLmMgYW5kIGZzL3hhdHRyLmMgYWxsIHJlYWNoIGl0LFxcbisgKiB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZSBjb252ZXJzaW9uIHVzZWZ1bCByYXRoZXIgdGhhbiBhIHJlbmFtZSBvZiB0aGUgZXJyb3IuXFxuKyAqXFxuKyAqIEEgcmVxdWVzdCB0aGF0IG5hbWVzIHNvbWV0aGluZyB3aGljaCBjYW4gaXRzZWxmIGJlIGFic2VudCBpcyBsZWZ0IGFsb25lLFxcbisgKiBiZWNhdXNlIEVOT0VOVCBpcyB0aGVuIGFtYmlndW91cyBhbmQgaXMgZnJlcXVlbnRseSB0aGUgYW5zd2VyIHRoZSBjYWxsZXJcXG4rICogYXNrZWQgZm9yLiBGVVNFX0xPT0tVUCByZXBvcnRzIGEgbWlzc2luZyBuYW1lIGluIGEgbGl2aW5nIGRpcmVjdG9yeSBhbmQgdGhlXFxuKyAqIGRpcmVjdG9yeSBvcGVyYXRpb25zIGNhcnJ5IGEgcGFyZW50IG5vZGVpZCBiZXNpZGUgb25lLCBzbyBuZWl0aGVyIGNhbiBiZVxcbisgKiByZWFkIGFzIGEgc3RhdGVtZW50IGFib3V0IHRoZSBpbm9kZS4gVGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSByZXF1ZXN0cyBiZWxvbmdcXG4rICogd2l0aCB0aGVtOiB0aGV5IGNhcnJ5IGFuIGF0dHJpYnV0ZSBuYW1lLCBhbmQgd2hpbGUgYSBzZXJ2ZXIgc2hvdWxkIHJlcG9ydCBhXFxuKyAqIG1pc3NpbmcgYXR0cmlidXRlIGFzIEVOT0RBVEEsIG9uZSB0aGF0IGFuc3dlcnMgRU5PRU5UIGluc3RlYWQgd291bGQgaGF2ZSBhXFxuKyAqIGNvcnJlY3QgcmVwbHkgdHVybmVkIGludG8gYSByZXRyeSB0aGF0IGNhbm5vdCBzdWNjZWVkLlxcbisgKlxcbisgKiBSZXF1ZXN0cyBhZ2FpbnN0IGFuIGFscmVhZHkgb3BlbiBkZXNjcmlwdG9yIGFyZSBhbHNvIGxlZnQgYWxvbmUsIHNpbmNlIHRoZXJlXFxuKyAqIGlzIG5vIGVxdWl2YWxlbnQgcmV0cnkgdG8gcmVhY2ggYW5kIGNvbnZlcnRpbmcgdGhlIGVycm9yIHdvdWxkIHJlbmFtZSBhXFxuKyAqIGZhaWx1cmUgcmF0aGVyIHRoYW4gcmVwYWlyIGl0LCBhbmQgRlVTRV9JT0NUTCBhbmQgRlVTRV9QT0xMIGhhbmQgdGhlXFxuKyAqIHNlcnZlcidzIGVycm5vIHRvIHVzZXJzcGFjZSB2ZXJiYXRpbS5cXG4rICovXFxuK3N0YXRpYyB2b2lkIHZpcnRpb19mc19maXh1cF9zdGFsZV9lcnJvcihzdHJ1Y3QgZnVzZV9yZXEgKnJlcSlcXG4re1xcbitcXHRpZiAocmVxLVxcdTAwM2VvdXQuaC5lcnJvciAhPSAtRU5PRU5UKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRzd2l0Y2ggKHJlcS1cXHUwMDNlaW4uaC5vcGNvZGUpIHtcXG4rXFx0Y2FzZSBGVVNFX09QRU46XFxuK1xcdGNhc2UgRlVTRV9PUEVORElSOlxcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBBbiBvcGVuIHNheXMgRU9QRU5TVEFMRSwgYW5kIHBhdGhfb3BlbmF0KCkgZGVjaWRlcyB3aGF0IHRoZVxcbitcXHRcXHQgKiB3YWxrIGluIHByb2dyZXNzIHNob3VsZCBtYWtlIG9mIGl0OiBFQ0hJTEQgdW5kZXIgTE9PS1VQX1JDVVxcbitcXHRcXHQgKiBzbyBpdCBkcm9wcyB0byBSRUYtd2FsaywgRVNUQUxFIG90aGVyd2lzZSBzbyB0aGUgbmFtZSBpc1xcbitcXHRcXHQgKiByZXNvbHZlZCBhZ2FpbiB1bmRlciBMT09LVVBfUkVWQUwuIE5hbWluZyBFU1RBTEUgaGVyZSB3b3VsZFxcbitcXHRcXHQgKiB0YWtlIHRoZSBzZWNvbmQgaW4gYm90aCBjYXNlcyBhbmQgc2tpcCBhIGNoZWFwZXIgcmV0cnkuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRyZXEtXFx1MDAzZW91dC5oLmVycm9yID0gLUVPUEVOU1RBTEU7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRjYXNlIEZVU0VfR0VUQVRUUjpcXG4rXFx0Y2FzZSBGVVNFX1NFVEFUVFI6XFxuK1xcdGNhc2UgRlVTRV9SRUFETElOSzpcXG4rXFx0Y2FzZSBGVVNFX1NUQVRGUzpcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogTm90aGluZyB0cmFuc2xhdGVzIEVPUEVOU1RBTEUgb3V0c2lkZSB0aGUgb3BlbiBwYXRoLCBzb1xcbitcXHRcXHQgKiB0aGVzZSBzYXkgRVNUQUxFIGRpcmVjdGx5LCB3aGljaCByZXRyeV9lc3RhbGUoKSBhbnN3ZXJzLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0cmVxLVxcdTAwM2VvdXQuaC5lcnJvciA9IC1FU1RBTEU7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHR9XFxuK31cXG4rXFxuIC8qIFdvcmsgZnVuY3Rpb24gZm9yIHJlcXVlc3QgY29tcGxldGlvbiAqL1xcbiBzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZShzdHJ1Y3QgZnVzZV9yZXEgKnJlcSxcXG4gXFx0XFx0XFx0XFx0ICAgICAgIHN0cnVjdCB2aXJ0aW9fZnNfdnEgKmZzdnEpXFxuQEAgLTgxMCw2ICs4NzAsOCBAQCBzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZShzdHJ1Y3QgZnVzZV9yZXEgKnJlcSxcXG4gXFxuIFxcdGNsZWFyX2JpdChGUl9TRU5ULCBcXHUwMDI2cmVxLVxcdTAwM2VmbGFncyk7XFxuIFxcbitcXHR2aXJ0aW9fZnNfZml4dXBfc3RhbGVfZXJyb3IocmVxKTtcXG4rXFxuIFxcdGZ1c2VfcmVxdWVzdF9lbmQocmVxKTtcXG4gXFx0c3Bpbl9sb2NrKFxcdTAwMjZmc3ZxLVxcdTAwM2Vsb2NrKTtcXG4gXFx0ZGVjX2luX2ZsaWdodF9yZXEoZnN2cSk7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZVxcbmluZGV4IGZiNTE2MDNmZTQxOTguLjljYjMwNDgxMjhkNWIgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uZ2l0aWdub3JlXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uZ2l0aWdub3JlXFxuQEAgLTEsNCArMSw2IEBAXFxuICMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbitmdXNlX2FjbF9jYWNoZV90ZXN0XFxuIGZ1c2VfbW50XFxuK2Z1c2VfZXN0YWxlX3Rlc3RcXG4gZnVzZWN0bF90ZXN0XFxuIHdyaXRlX2V4dGVuZF9lb2ZfdGVzdFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9NYWtlZmlsZVxcbmluZGV4IDk1YTFlZTk0N2NhNzYuLmY1NjRjYjM3YjNhNWIgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9NYWtlZmlsZVxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvTWFrZWZpbGVcXG5AQCAtNiwxMSArNiwxMiBAQCBURVNUX0dFTl9QUk9HUyA6PSBmdXNlY3RsX3Rlc3RcXG4gVEVTVF9HRU5fUFJPR1MgKz0gd3JpdGVfZXh0ZW5kX2VvZl90ZXN0XFxuIFRFU1RfR0VOX0ZJTEVTIDo9IGZ1c2VfbW50XFxuIFxcbi0jIGZ1c2VfYWNsX2NhY2hlX3Rlc3QgcmVxdWlyZXMgbGliZnVzZTM7IGFkZCBpdCBvbmx5IHdoZW4gdGhlIGxpYnJhcnkgaXMgcHJlc2VudC5cXG4tQUNMX0NGTEFHUyA6PSAkKHNoZWxsIHBrZy1jb25maWcgZnVzZTMgLS1jZmxhZ3MgMlxcdTAwM2UvZGV2L251bGwpXFxuLUFDTF9MRExJQlMgOj0gJChzaGVsbCBwa2ctY29uZmlnIGZ1c2UzIC0tbGlicyAyXFx1MDAzZS9kZXYvbnVsbClcXG4taWZuZXEgKCQoQUNMX0NGTEFHUyksKVxcbisjIFRoZXNlIHRlc3RzIHJlcXVpcmUgbGliZnVzZTM7IGFkZCB0aGVtIG9ubHkgd2hlbiB0aGUgbGlicmFyeSBpcyBwcmVzZW50LlxcbitGVVNFM19DRkxBR1MgOj0gJChzaGVsbCBwa2ctY29uZmlnIGZ1c2UzIC0tY2ZsYWdzIDJcXHUwMDNlL2Rldi9udWxsKVxcbitGVVNFM19MRExJQlMgOj0gJChzaGVsbCBwa2ctY29uZmlnIGZ1c2UzIC0tbGlicyAyXFx1MDAzZS9kZXYvbnVsbClcXG4raWZuZXEgKCQoRlVTRTNfQ0ZMQUdTKSwpXFxuIFRFU1RfR0VOX1BST0dTICs9IGZ1c2VfYWNsX2NhY2hlX3Rlc3RcXG4rVEVTVF9HRU5fUFJPR1MgKz0gZnVzZV9lc3RhbGVfdGVzdFxcbiBlbmRpZlxcbiBcXG4gaW5jbHVkZSAuLi8uLi9saWIubWtcXG5AQCAtMzAsNSArMzEsOCBAQCBlbmRpZlxcbiAkKE9VVFBVVCkvZnVzZV9tbnQ6IENGTEFHUyArPSAkKFZBUl9DRkxBR1MpXFxuICQoT1VUUFVUKS9mdXNlX21udDogTERMSUJTICs9ICQoVkFSX0xETElCUylcXG4gXFxuLSQoT1VUUFVUKS9mdXNlX2FjbF9jYWNoZV90ZXN0OiBDRkxBR1MgKz0gJChBQ0xfQ0ZMQUdTKVxcbi0kKE9VVFBVVCkvZnVzZV9hY2xfY2FjaGVfdGVzdDogTERMSUJTICs9ICQoQUNMX0xETElCUylcXG4rJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IENGTEFHUyArPSAkKEZVU0UzX0NGTEFHUylcXG4rJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IExETElCUyArPSAkKEZVU0UzX0xETElCUylcXG4rXFxuKyQoT1VUUFVUKS9mdXNlX2VzdGFsZV90ZXN0OiBDRkxBR1MgKz0gJChGVVNFM19DRkxBR1MpXFxuKyQoT1VUUFVUKS9mdXNlX2VzdGFsZV90ZXN0OiBMRExJQlMgKz0gJChGVVNFM19MRExJQlMpXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvZnVzZV9lc3RhbGVfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9mdXNlX2VzdGFsZV90ZXN0LmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjgyYjg0MmQzYTVmN2JcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9mdXNlX2VzdGFsZV90ZXN0LmNcXG5AQCAtMCwwICsxLDQ1MCBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBUZXN0OiBhIHJlcXVlc3QgcmVmdXNlZCBmb3IgYW4gaW5vZGUgdGhlIGNsaWVudCBzdGlsbCBob2xkcyBhIHJlZmVyZW5jZSB0b1xcbisgKlxcbisgKiBGVVNFX09QRU4sIEZVU0VfR0VUQVRUUiwgRlVTRV9TRVRBVFRSLCBGVVNFX1JFQURMSU5LIGFuZCBGVVNFX1NUQVRGUyBjYXJyeSBhXFxuKyAqIG5vZGVpZCByYXRoZXIgdGhhbiBhIHBhdGguICBUaGUgY2xpZW50IG9ubHkgc2VuZHMgdGhlbSBmb3IgYW4gaW5vZGUgaXQgaGFzXFxuKyAqIGFscmVhZHkgbG9va2VkIHVwIGFuZCBob2xkcyBhIHJlZmVyZW5jZSB0bywgYW5kIGEgc2VydmVyIG93ZXMgdGhlIGNsaWVudCB0aGF0XFxuKyAqIGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuICBBIHNlcnZlciB0aGF0IGxldHMgdGhlIGlub2RlIGdvIGVhcmx5LFxcbisgKiBhcyBvbmUgYmFja2luZyBhIHNoYXJlZCBkaXJlY3RvcnkgZG9lcyB3aGVuIHRoZSBuYW1lIGlzIHJlbmFtZWQgb3ZlciwgYW5zd2Vyc1xcbisgKiB3aXRoIEVOT0VOVC5cXG4rICpcXG4rICogT24gYW4gdW5maXhlZCBrZXJuZWwgdGhhdCBFTk9FTlQgaXMgcGFzc2VkIG91dCB1bmNoYW5nZWQuICBUaGUgcGF0aCB3YWxrIGhhc1xcbisgKiBubyByZWFzb24gdG8gZG91YnQgaXQgYW5kIHRoZSBjYWxsZXIgaXMgdG9sZCBhIGZpbGUgaXMgbWlzc2luZyB3aGVuIGl0IG5ldmVyXFxuKyAqIHN0b3BwZWQgZXhpc3RpbmcuICBDYWxsZXJzIHRoYXQgcmVhZCBhIG1pc3NpbmcgZmlsZSBhcyBhbiBlbXB0eSBvbmUgYWN0IG9uXFxuKyAqIHRoZSBlbXB0aW5lc3MuXFxuKyAqXFxuKyAqIEZpeGVkIChmcy9mdXNlL2ZpbGUuYyBhbmQgZnMvZnVzZS9kaXIuYyk6IEVOT0VOVCBiZWNvbWVzIEVTVEFMRSwgd2hpY2hcXG4rICogZGVzY3JpYmVzIHRoZSBoYW5kbGUgcmF0aGVyIHRoYW4gdGhlIG5hbWUuICBmaWxlbmFtZV9sb29rdXAoKSBhbmRcXG4rICogZG9fZmlscF9vcGVuKCkgYWxyZWFkeSByZXRyeSB3aXRoIExPT0tVUF9SRVZBTCBvbiBFU1RBTEUsIHNvIHRoZSBuYW1lIGlzXFxuKyAqIHJlc29sdmVkIGFnYWluIGFuZCB0aGUgaW5vZGUgaXQgcmVmZXJzIHRvIG5vdyBpcyB1c2VkLiAgQSBuYW1lIHRoYXQgaGFzXFxuKyAqIGdlbnVpbmVseSBnb25lIGF3YXkgZmFpbHMgdGhlIHJldHJpZWQgbG9va3VwLCBzbyBFTk9FTlQgc3RpbGwgcmVhY2hlcyBhXFxuKyAqIGNhbGxlciB0aGF0IGRlc2VydmVzIGl0LlxcbisgKlxcbisgKiBPbmx5IHJlcXVlc3RzIHJlYWNoYWJsZSB0aHJvdWdoIGEgcGF0aCB3YWxrIGFyZSBjb3ZlcmVkLCBiZWNhdXNlIHRoZSByZXRyeVxcbisgKiBpcyB3aGF0IG1ha2VzIEVTVEFMRSB1c2VmdWwgYW5kIHRoZSB3YWxrIGlzIHdoYXQgcGVyZm9ybXMgaXQuICBBbiBvcGVyYXRpb25cXG4rICogb24gYSBkZXNjcmlwdG9yIGFscmVhZHkgb3BlbiBoYXMgbm8gZXF1aXZhbGVudCByZWNvdmVyeS5cXG4rICpcXG4rICogVGVzdCBvdXRsaW5lOlxcbisgKiAgMS4gTW91bnQgYSBtaW5pbWFsIEZVU0UgZnMgaG9sZGluZyBvbmUgZmlsZS5cXG4rICogIDIuIFRoZSBzZXJ2ZXIgcmVmdXNlcyB0aGUgZmlyc3QgcmVxdWVzdCBvZiB0aGUga2luZCB1bmRlciB0ZXN0IGFuZCBhbGxvd3NcXG4rICogICAgIGV2ZXJ5IG9uZSBhZnRlciBpdCwgc3RhbmRpbmcgaW4gZm9yIGEgc2VydmVyIHRoYXQgcmVsZWFzZWQgdGhlIGlub2RlIGFuZFxcbisgKiAgICAgaGFzIHNpbmNlIHJlc29sdmVkIHRoZSBuYW1lIGFnYWluLlxcbisgKiAgMy4gb3BlbmF0KCkgdGhlIGZpbGUuXFxuKyAqICAgICBCdWdneTogIEVOT0VOVCByZWFjaGVzIHRoZSBjYWxsZXIsIG9uZSBvcGVuIHdhcyBhc2tlZCBmb3IuICBGQUlMLlxcbisgKiAgICAgRml4ZWQ6ICB0aGUgd2FsayByZXRyaWVzLCB0aGUgc2Vjb25kIG9wZW4gaXMgYWxsb3dlZCwgdGhlIGRlc2NyaXB0b3IgaXNcXG4rICogICAgICAgICAgICAgcmV0dXJuZWQsIHR3byBvcGVucyB3ZXJlIGFza2VkIGZvci4gIFBBU1MuXFxuKyAqICA0LiBzdGF0KCksIGNobW9kKCksIHJlYWRsaW5rKCkgYW5kIHN0YXRmcygpIGJ5IG5hbWUsIHdoaWNoIGFyZSB0aGUgc2FtZVxcbisgKiAgICAgcmVjb3ZlcnkgdGhyb3VnaCBGVVNFX0dFVEFUVFIsIEZVU0VfU0VUQVRUUiwgRlVTRV9SRUFETElOSyBhbmRcXG4rICogICAgIEZVU0VfU1RBVEZTLiAgRWFjaCBpcyByZWFjaGVkIHRocm91Z2ggYSBwYXRoIHdhbGssIHdoaWNoIGlzIHdoYXQgbWFrZXNcXG4rICogICAgIHRoZSByZXRyeSBhdmFpbGFibGUuXFxuKyAqICA1LiBPcGVuIGEgbmFtZSB0aGUgc2VydmVyIGRvZXMgbm90IGhhdmUgYXQgYWxsLlxcbisgKiAgICAgQm90aDogICBFTk9FTlQsIGJlY2F1c2UgdGhlIGxvb2t1cCBmYWlscyByYXRoZXIgdGhhbiB0aGUgb3BlbiwgYW5kIGFcXG4rICogICAgICAgICAgICAgZmlsZSB0aGF0IGlzIGFic2VudCBtdXN0IHN0aWxsIGxvb2sgYWJzZW50LlxcbisgKi9cXG4rXFxuKyNkZWZpbmUgX0dOVV9TT1VSQ0VcXG4rI2RlZmluZSBGVVNFX1VTRV9WRVJTSU9OIDM0XFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjZXJybm8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2ZjbnRsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NmdXNlX2xvd2xldmVsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9saW1pdHMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3B0aHJlYWQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGJvb2wuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0cmluZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3N0YXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9zdGF0dmZzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvdmZzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcXCIuLi8uLi9rc2VsZnRlc3RfaGFybmVzcy5oXFxcIlxcbitcXG4rI2RlZmluZSBGSUxFX05BTUVcXHRcXFwiaGVsZFxcXCJcXG4rI2RlZmluZSBMSU5LX05BTUVcXHRcXFwiaGVsZC1saW5rXFxcIlxcbisjZGVmaW5lIEFCU0VOVF9OQU1FXFx0XFxcIm5vLXN1Y2gtZmlsZVxcXCJcXG4rI2RlZmluZSBGSUxFX0lOT1xcdDJcXG4rI2RlZmluZSBMSU5LX0lOT1xcdDNcXG4rI2RlZmluZSBDT05URU5UU1xcdFxcXCJwcmVzZW50XFxcXG5cXFwiXFxuKyNkZWZpbmUgTElOS19UQVJHRVRcXHRGSUxFX05BTUVcXG4rXFxuKy8qXFxuKyAqIFdoaWNoIHJlcXVlc3QgdGhlIHNlcnZlciByZWZ1c2VzLCBhbmQgaG93IG1hbnkgdGltZXMuICBTaGFyZWQgd2l0aCB0aGVcXG4rICogZGFlbW9uIHRocmVhZDsgb25lIHRlc3QgcnVucyBhdCBhIHRpbWUsIHNvIHBsYWluIGludHMuXFxuKyAqXFxuKyAqIEV2ZXJ5IG9uZSBvZiB0aGVzZSBuYW1lcyBhbiBpbm9kZSBieSBub2RlaWQgcmF0aGVyIHRoYW4gYnkgbmFtZSwgc28gYVxcbisgKiByZWZ1c2FsIG9mIGFueSBvZiB0aGVtIGlzIGRlc2NyaWJpbmcgYSBoYW5kbGUgcmF0aGVyIHRoYW4gYSBtaXNzaW5nIGZpbGUuXFxuKyAqIEZVU0VfTE9PS1VQIGlzIGRlbGliZXJhdGVseSBhYnNlbnQ6IGl0IGNhcnJpZXMgYSBuYW1lLCBzbyBpdHMgRU5PRU5UIGlzIGFuXFxuKyAqIGFuc3dlciByYXRoZXIgdGhhbiBhIGZhdWx0LCBhbmQgYWJzZW50X25hbWVfc3RpbGxfcmVwb3J0c19hYnNlbnQgY292ZXJzIGl0LlxcbisgKi9cXG4rZW51bSByZWZ1c2Vfd2hhdCB7XFxuK1xcdFJFRlVTRV9OT1RISU5HLFxcbitcXHRSRUZVU0VfT1BFTixcXG4rXFx0UkVGVVNFX0dFVEFUVFIsXFxuK1xcdFJFRlVTRV9TRVRBVFRSLFxcbitcXHRSRUZVU0VfUkVBRExJTkssXFxuK1xcdFJFRlVTRV9TVEFURlMsXFxuK307XFxuK1xcbitzdGF0aWMgc3RydWN0IHtcXG4rXFx0ZW51bSByZWZ1c2Vfd2hhdCB3aGF0O1xcbitcXHRpbnQgcmVmdXNhbHNfbGVmdDtcXG4rXFx0aW50IG9wZW5zX3NlZW47XFxuK1xcdGludCBnZXRhdHRyc19zZWVuO1xcbitcXHRpbnQgc2V0YXR0cnNfc2VlbjtcXG4rXFx0aW50IHJlYWRsaW5rc19zZWVuO1xcbitcXHRpbnQgc3RhdGZzc19zZWVuO1xcbit9IGdfZHM7XFxuK1xcbisvKiBUcnVlIG9uY2UsIGZvciB0aGUgcmVxdWVzdCB1bmRlciB0ZXN0LCBhbmQgdGhlbiBuZXZlciBhZ2Fpbi4gKi9cXG4rc3RhdGljIGJvb2wgcmVmdXNlX25vdyhlbnVtIHJlZnVzZV93aGF0IHdoYXQpXFxuK3tcXG4rXFx0aWYgKGdfZHMud2hhdCAhPSB3aGF0IHx8IGdfZHMucmVmdXNhbHNfbGVmdCBcXHUwMDNjPSAwKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdGdfZHMucmVmdXNhbHNfbGVmdC0tO1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgZmlsbF9hdHRyKGZ1c2VfaW5vX3QgaW5vLCBzdHJ1Y3Qgc3RhdCAqc3QpXFxuK3tcXG4rXFx0bWVtc2V0KHN0LCAwLCBzaXplb2YoKnN0KSk7XFxuK1xcdHN0LVxcdTAwM2VzdF9pbm8gPSBpbm87XFxuK1xcdC8qXFxuK1xcdCAqIE93bmVkIGJ5IHdob2V2ZXIgcnVucyB0aGUgdGVzdCwgc28gdGhhdCBjaG1vZCgpIGlzIGEgcmVxdWVzdCB0aGVcXG4rXFx0ICoga2VybmVsIHdpbGwgY2FycnkgdGhyb3VnaCB0byB0aGUgc2VydmVyIHJhdGhlciB0aGFuIHJlZnVzZSBpdHNlbGYuXFxuK1xcdCAqL1xcbitcXHRzdC1cXHUwMDNlc3RfdWlkID0gZ2V0dWlkKCk7XFxuK1xcdHN0LVxcdTAwM2VzdF9naWQgPSBnZXRnaWQoKTtcXG4rXFx0aWYgKGlubyA9PSBGVVNFX1JPT1RfSUQpIHtcXG4rXFx0XFx0c3QtXFx1MDAzZXN0X21vZGUgPSBTX0lGRElSIHwgMDc1NTtcXG4rXFx0XFx0c3QtXFx1MDAzZXN0X25saW5rID0gMjtcXG4rXFx0fSBlbHNlIGlmIChpbm8gPT0gTElOS19JTk8pIHtcXG4rXFx0XFx0c3QtXFx1MDAzZXN0X21vZGUgPSBTX0lGTE5LIHwgMDc3NztcXG4rXFx0XFx0c3QtXFx1MDAzZXN0X25saW5rID0gMTtcXG4rXFx0XFx0c3QtXFx1MDAzZXN0X3NpemUgPSBzaXplb2YoTElOS19UQVJHRVQpIC0gMTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0c3QtXFx1MDAzZXN0X21vZGUgPSBTX0lGUkVHIHwgMDY0NDtcXG4rXFx0XFx0c3QtXFx1MDAzZXN0X25saW5rID0gMTtcXG4rXFx0XFx0c3QtXFx1MDAzZXN0X3NpemUgPSBzaXplb2YoQ09OVEVOVFMpIC0gMTtcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0X2xvb2t1cChmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUpXFxuK3tcXG4rXFx0c3RydWN0IGZ1c2VfZW50cnlfcGFyYW0gZTtcXG4rXFx0ZnVzZV9pbm9fdCBpbm87XFxuK1xcbitcXHRpZiAocGFyZW50ICE9IEZVU0VfUk9PVF9JRClcXG4rXFx0XFx0aW5vID0gMDtcXG4rXFx0ZWxzZSBpZiAoIXN0cmNtcChuYW1lLCBGSUxFX05BTUUpKVxcbitcXHRcXHRpbm8gPSBGSUxFX0lOTztcXG4rXFx0ZWxzZSBpZiAoIXN0cmNtcChuYW1lLCBMSU5LX05BTUUpKVxcbitcXHRcXHRpbm8gPSBMSU5LX0lOTztcXG4rXFx0ZWxzZVxcbitcXHRcXHRpbm8gPSAwO1xcbitcXG4rXFx0aWYgKCFpbm8pIHtcXG4rXFx0XFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuK1xcdG1lbXNldChcXHUwMDI2ZSwgMCwgc2l6ZW9mKGUpKTtcXG4rXFx0ZS5pbm8gPSBpbm87XFxuK1xcdGUuYXR0cl90aW1lb3V0ID0gMDtcXG4rXFx0ZS5lbnRyeV90aW1lb3V0ID0gMDtcXG4rXFx0ZmlsbF9hdHRyKGlubywgXFx1MDAyNmUuYXR0cik7XFxuK1xcdGZ1c2VfcmVwbHlfZW50cnkocmVxLCBcXHUwMDI2ZSk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRfZ2V0YXR0cihmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8sXFxuK1xcdFxcdCAgICAgIHN0cnVjdCBmdXNlX2ZpbGVfaW5mbyAqZmkpXFxuK3tcXG4rXFx0c3RydWN0IHN0YXQgc3Q7XFxuK1xcbitcXHQodm9pZClmaTtcXG4rXFx0LyogVGhlIHJvb3QgaXMgbGVmdCBhbG9uZTsgcmVmdXNpbmcgaXQgd291bGQgYnJlYWsgdGhlIG1vdW50IGl0c2VsZi4gKi9cXG4rXFx0aWYgKGlubyA9PSBGSUxFX0lOTykge1xcbitcXHRcXHRnX2RzLmdldGF0dHJzX3NlZW4rKztcXG4rXFx0XFx0aWYgKHJlZnVzZV9ub3coUkVGVVNFX0dFVEFUVFIpKSB7XFxuK1xcdFxcdFxcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTtcXG4rXFx0XFx0XFx0cmV0dXJuO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0ZmlsbF9hdHRyKGlubywgXFx1MDAyNnN0KTtcXG4rXFx0ZnVzZV9yZXBseV9hdHRyKHJlcSwgXFx1MDAyNnN0LCAwKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdF9vcGVuKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubywgc3RydWN0IGZ1c2VfZmlsZV9pbmZvICpmaSlcXG4re1xcbitcXHRpZiAoaW5vICE9IEZJTEVfSU5PKSB7XFxuK1xcdFxcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcbitcXHRnX2RzLm9wZW5zX3NlZW4rKztcXG4rXFx0aWYgKHJlZnVzZV9ub3coUkVGVVNFX09QRU4pKSB7XFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIFRoZSBpbm9kZSBpcyBnb25lIGFzIGZhciBhcyB0aGlzIHNlcnZlciBpcyBjb25jZXJuZWQsIGV2ZW5cXG4rXFx0XFx0ICogdGhvdWdoIHRoZSBjbGllbnQgaXMgaG9sZGluZyBhIHJlZmVyZW5jZSB0byBpdCBhbmQgYXNrZWQgYnlcXG4rXFx0XFx0ICogbm9kZWlkIHJhdGhlciB0aGFuIGJ5IG5hbWUuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXHRmdXNlX3JlcGx5X29wZW4ocmVxLCBmaSk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRfcmVhZChmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8sIHNpemVfdCBzaXplLCBvZmZfdCBvZmYsXFxuK1xcdFxcdCAgIHN0cnVjdCBmdXNlX2ZpbGVfaW5mbyAqZmkpXFxuK3tcXG4rXFx0c2l6ZV90IGxlbiA9IHNpemVvZihDT05URU5UUykgLSAxO1xcbitcXG4rXFx0KHZvaWQpZmk7XFxuK1xcdGlmIChpbm8gIT0gRklMRV9JTk8pIHtcXG4rXFx0XFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFx0aWYgKChzaXplX3Qpb2ZmIFxcdTAwM2U9IGxlbikge1xcbitcXHRcXHRmdXNlX3JlcGx5X2J1ZihyZXEsIE5VTEwsIDApO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFx0aWYgKG9mZiArIHNpemUgXFx1MDAzZSBsZW4pXFxuK1xcdFxcdHNpemUgPSBsZW4gLSBvZmY7XFxuK1xcdGZ1c2VfcmVwbHlfYnVmKHJlcSwgQ09OVEVOVFMgKyBvZmYsIHNpemUpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0X3NldGF0dHIoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgaW5vLCBzdHJ1Y3Qgc3RhdCAqYXR0cixcXG4rXFx0XFx0ICAgICAgaW50IHRvX3NldCwgc3RydWN0IGZ1c2VfZmlsZV9pbmZvICpmaSlcXG4re1xcbitcXHRzdHJ1Y3Qgc3RhdCBzdDtcXG4rXFxuK1xcdCh2b2lkKWF0dHI7XFxuK1xcdCh2b2lkKXRvX3NldDtcXG4rXFx0KHZvaWQpZmk7XFxuK1xcdGlmIChpbm8gPT0gRklMRV9JTk8pIHtcXG4rXFx0XFx0Z19kcy5zZXRhdHRyc19zZWVuKys7XFxuK1xcdFxcdGlmIChyZWZ1c2Vfbm93KFJFRlVTRV9TRVRBVFRSKSkge1xcbitcXHRcXHRcXHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XFxuK1xcdFxcdFxcdHJldHVybjtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdGZpbGxfYXR0cihpbm8sIFxcdTAwMjZzdCk7XFxuK1xcdGZ1c2VfcmVwbHlfYXR0cihyZXEsIFxcdTAwMjZzdCwgMCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRfcmVhZGxpbmsoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgaW5vKVxcbit7XFxuK1xcdGlmIChpbm8gIT0gTElOS19JTk8pIHtcXG4rXFx0XFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFSU5WQUwpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuK1xcdGdfZHMucmVhZGxpbmtzX3NlZW4rKztcXG4rXFx0aWYgKHJlZnVzZV9ub3coUkVGVVNFX1JFQURMSU5LKSkge1xcbitcXHRcXHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXHRmdXNlX3JlcGx5X3JlYWRsaW5rKHJlcSwgTElOS19UQVJHRVQpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0X3N0YXRmcyhmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8pXFxuK3tcXG4rXFx0c3RydWN0IHN0YXR2ZnMgc2ZzO1xcbitcXG4rXFx0KHZvaWQpaW5vO1xcbitcXHRnX2RzLnN0YXRmc3Nfc2VlbisrO1xcbitcXHRpZiAocmVmdXNlX25vdyhSRUZVU0VfU1RBVEZTKSkge1xcbitcXHRcXHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXG4rXFx0bWVtc2V0KFxcdTAwMjZzZnMsIDAsIHNpemVvZihzZnMpKTtcXG4rXFx0c2ZzLmZfYnNpemUgPSA1MTI7XFxuK1xcdHNmcy5mX2Zyc2l6ZSA9IDUxMjtcXG4rXFx0c2ZzLmZfbmFtZW1heCA9IE5BTUVfTUFYO1xcbitcXHRmdXNlX3JlcGx5X3N0YXRmcyhyZXEsIFxcdTAwMjZzZnMpO1xcbit9XFxuK1xcbitzdGF0aWMgY29uc3Qgc3RydWN0IGZ1c2VfbG93bGV2ZWxfb3BzIGZzX29wcyA9IHtcXG4rXFx0Lmxvb2t1cFxcdFxcdD0gdF9sb29rdXAsXFxuK1xcdC5nZXRhdHRyXFx0PSB0X2dldGF0dHIsXFxuK1xcdC5zZXRhdHRyXFx0PSB0X3NldGF0dHIsXFxuK1xcdC5yZWFkbGlua1xcdD0gdF9yZWFkbGluayxcXG4rXFx0LnN0YXRmc1xcdFxcdD0gdF9zdGF0ZnMsXFxuK1xcdC5vcGVuXFx0XFx0PSB0X29wZW4sXFxuK1xcdC5yZWFkXFx0XFx0PSB0X3JlYWQsXFxuK307XFxuK1xcbitzdGF0aWMgdm9pZCAqcnVuX2RhZW1vbih2b2lkICphcmcpXFxuK3tcXG4rXFx0ZnVzZV9zZXNzaW9uX2xvb3AoKHN0cnVjdCBmdXNlX3Nlc3Npb24gKilhcmcpO1xcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rLyogLS0tLSBrc2VsZnRlc3QgaGFybmVzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cXG4rXFxuK0ZJWFRVUkUob3Blbl9lc3RhbGUpIHtcXG4rXFx0c3RydWN0IGZ1c2Vfc2Vzc2lvbiAqc2U7XFxuK1xcdGNoYXIgICAgICAgICAgICAgICAgIG1vdW50cG9pbnRbUEFUSF9NQVhdO1xcbitcXHRjaGFyICAgICAgICAgICAgICAgICBmaWxlX3BhdGhbUEFUSF9NQVhdO1xcbitcXHRjaGFyICAgICAgICAgICAgICAgICBsaW5rX3BhdGhbUEFUSF9NQVhdO1xcbitcXHRjaGFyICAgICAgICAgICAgICAgICBhYnNlbnRfcGF0aFtQQVRIX01BWF07XFxuK1xcdHB0aHJlYWRfdCAgICAgICAgICAgIHRocmVhZDtcXG4rfTtcXG4rXFxuK0ZJWFRVUkVfU0VUVVAob3Blbl9lc3RhbGUpXFxuK3tcXG4rXFx0Y2hhciAqZnVzZV9hcmd2W10gPSB7IFxcXCJmdXNlX2VzdGFsZV90ZXN0XFxcIiwgTlVMTCB9O1xcbitcXHRzdHJ1Y3QgZnVzZV9hcmdzIGFyZ3MgPSBGVVNFX0FSR1NfSU5JVCgxLCBmdXNlX2FyZ3YpO1xcbitcXG4rXFx0bWVtc2V0KFxcdTAwMjZnX2RzLCAwLCBzaXplb2YoZ19kcykpO1xcbitcXHRnX2RzLndoYXQgPSBSRUZVU0VfTk9USElORztcXG4rXFx0Z19kcy5yZWZ1c2Fsc19sZWZ0ID0gMTtcXG4rXFxuK1xcdHN0cmNweShzZWxmLVxcdTAwM2Vtb3VudHBvaW50LCBcXFwiL3RtcC9vcGVuX2VzdGFsZV90ZXN0X1hYWFhYWFxcXCIpO1xcbitcXHRpZiAoIW1rZHRlbXAoc2VsZi1cXHUwMDNlbW91bnRwb2ludCkpXFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwibWtkdGVtcDogJXNcXFwiLCBzdHJlcnJvcihlcnJubykpO1xcbitcXG4rXFx0c25wcmludGYoc2VsZi1cXHUwMDNlZmlsZV9wYXRoLCBzaXplb2Yoc2VsZi1cXHUwMDNlZmlsZV9wYXRoKSxcXG4rXFx0XFx0IFxcXCIlcy9cXFwiIEZJTEVfTkFNRSwgc2VsZi1cXHUwMDNlbW91bnRwb2ludCk7XFxuK1xcdHNucHJpbnRmKHNlbGYtXFx1MDAzZWxpbmtfcGF0aCwgc2l6ZW9mKHNlbGYtXFx1MDAzZWxpbmtfcGF0aCksXFxuK1xcdFxcdCBcXFwiJXMvXFxcIiBMSU5LX05BTUUsIHNlbGYtXFx1MDAzZW1vdW50cG9pbnQpO1xcbitcXHRzbnByaW50ZihzZWxmLVxcdTAwM2VhYnNlbnRfcGF0aCwgc2l6ZW9mKHNlbGYtXFx1MDAzZWFic2VudF9wYXRoKSxcXG4rXFx0XFx0IFxcXCIlcy9cXFwiIEFCU0VOVF9OQU1FLCBzZWxmLVxcdTAwM2Vtb3VudHBvaW50KTtcXG4rXFxuK1xcdHNlbGYtXFx1MDAzZXNlID0gZnVzZV9zZXNzaW9uX25ldyhcXHUwMDI2YXJncywgXFx1MDAyNmZzX29wcywgc2l6ZW9mKGZzX29wcyksIE5VTEwpO1xcbitcXHRpZiAoIXNlbGYtXFx1MDAzZXNlKSB7XFxuK1xcdFxcdHJtZGlyKHNlbGYtXFx1MDAzZW1vdW50cG9pbnQpO1xcbitcXHRcXHRTS0lQKHJldHVybiwgXFxcImZ1c2Vfc2Vzc2lvbl9uZXcgZmFpbGVkXFxcIik7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChmdXNlX3Nlc3Npb25fbW91bnQoc2VsZi1cXHUwMDNlc2UsIHNlbGYtXFx1MDAzZW1vdW50cG9pbnQpKSB7XFxuK1xcdFxcdGZ1c2Vfc2Vzc2lvbl9kZXN0cm95KHNlbGYtXFx1MDAzZXNlKTtcXG4rXFx0XFx0cm1kaXIoc2VsZi1cXHUwMDNlbW91bnRwb2ludCk7XFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwiZnVzZV9zZXNzaW9uX21vdW50IGZhaWxlZCAobm8gZnVzZXJtb3VudDMgb3Igbm8gcHJpdmlsZWdlcylcXFwiKTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKHB0aHJlYWRfY3JlYXRlKFxcdTAwMjZzZWxmLVxcdTAwM2V0aHJlYWQsIE5VTEwsIHJ1bl9kYWVtb24sIHNlbGYtXFx1MDAzZXNlKSkge1xcbitcXHRcXHRmdXNlX3Nlc3Npb25fdW5tb3VudChzZWxmLVxcdTAwM2VzZSk7XFxuK1xcdFxcdGZ1c2Vfc2Vzc2lvbl9kZXN0cm95KHNlbGYtXFx1MDAzZXNlKTtcXG4rXFx0XFx0cm1kaXIoc2VsZi1cXHUwMDNlbW91bnRwb2ludCk7XFxuK1xcdFxcdFNLSVAocmV0dXJuLCBcXFwicHRocmVhZF9jcmVhdGU6ICVzXFxcIiwgc3RyZXJyb3IoZXJybm8pKTtcXG4rXFx0fVxcbitcXG4rXFx0ZnVzZV9vcHRfZnJlZV9hcmdzKFxcdTAwMjZhcmdzKTtcXG4rfVxcbitcXG4rRklYVFVSRV9URUFSRE9XTihvcGVuX2VzdGFsZSlcXG4re1xcbitcXHRmdXNlX3Nlc3Npb25fZXhpdChzZWxmLVxcdTAwM2VzZSk7XFxuK1xcdGZ1c2Vfc2Vzc2lvbl91bm1vdW50KHNlbGYtXFx1MDAzZXNlKTtcXG4rXFx0cHRocmVhZF9qb2luKHNlbGYtXFx1MDAzZXRocmVhZCwgTlVMTCk7XFxuK1xcdGZ1c2Vfc2Vzc2lvbl9kZXN0cm95KHNlbGYtXFx1MDAzZXNlKTtcXG4rXFx0cm1kaXIoc2VsZi1cXHUwMDNlbW91bnRwb2ludCk7XFxuK31cXG4rXFxuK1RFU1RfRihvcGVuX2VzdGFsZSwgcmVmdXNlZF9vcGVuX2lzX3JldHJpZWQpXFxuK3tcXG4rXFx0aW50IGZkO1xcbitcXG4rXFx0Z19kcy53aGF0ID0gUkVGVVNFX09QRU47XFxuK1xcbitcXHRmZCA9IG9wZW4oc2VsZi1cXHUwMDNlZmlsZV9wYXRoLCBPX1JET05MWSk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUaGUgcmVmdXNhbCBkZXNjcmliZXMgYSBoYW5kbGUgdGhlIHNlcnZlciBzaG91bGQgaGF2ZSBob25vdXJlZCwgc29cXG4rXFx0ICogdGhlIHdhbGsgaXMgZW50aXRsZWQgdG8gcmVzb2x2ZSB0aGUgbmFtZSBhZ2FpbiBhbmQgb3BlbiB3aGF0IGl0XFxuK1xcdCAqIHJlZmVycyB0byBub3cuIFJlcG9ydGluZyB0aGUgZmlsZSBtaXNzaW5nIGluc3RlYWQgZW5kcyB0aGUgd2Fsay5cXG4rXFx0ICovXFxuK1xcdEFTU0VSVF9HRShmZCwgMCkge1xcbitcXHRcXHRUSF9MT0coXFxcIm9wZW4gZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgb3BlbiByZXF1ZXN0KHMpXFxcIixcXG4rXFx0XFx0ICAgICAgIHN0cmVycm9yKGVycm5vKSwgZ19kcy5vcGVuc19zZWVuKTtcXG4rXFx0fVxcbitcXHRFWFBFQ1RfRVEoMiwgZ19kcy5vcGVuc19zZWVuKTtcXG4rXFx0Y2xvc2UoZmQpO1xcbit9XFxuK1xcbitURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfZ2V0YXR0cl9vbl9wYXRoX2lzX3JldHJpZWQpXFxuK3tcXG4rXFx0c3RydWN0IHN0YXQgc3Q7XFxuK1xcbitcXHRnX2RzLndoYXQgPSBSRUZVU0VfR0VUQVRUUjtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFJlYWNoZWQgYnkgbmFtZSwgc28gdGhlIHdhbGsgY2FuIHJlc29sdmUgaXQgYWdhaW4gYW5kIGFzayBhIHNlY29uZFxcbitcXHQgKiB0aW1lLCB0aGUgc2FtZSByZWNvdmVyeSB0aGUgb3BlbiBnZXRzLlxcbitcXHQgKi9cXG4rXFx0QVNTRVJUX0VRKDAsIHN0YXQoc2VsZi1cXHUwMDNlZmlsZV9wYXRoLCBcXHUwMDI2c3QpKSB7XFxuK1xcdFxcdFRIX0xPRyhcXFwic3RhdCBmYWlsZWQgd2l0aCAlcyBhZnRlciAlZCBnZXRhdHRyIHJlcXVlc3QocylcXFwiLFxcbitcXHRcXHQgICAgICAgc3RyZXJyb3IoZXJybm8pLCBnX2RzLmdldGF0dHJzX3NlZW4pO1xcbitcXHR9XFxuK1xcdEVYUEVDVF9HVChnX2RzLmdldGF0dHJzX3NlZW4sIDEpO1xcbit9XFxuK1xcbitURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfc2V0YXR0cl9vbl9wYXRoX2lzX3JldHJpZWQpXFxuK3tcXG4rXFx0Z19kcy53aGF0ID0gUkVGVVNFX1NFVEFUVFI7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBjaG1vZCgpIHJlYWNoZXMgdGhlIGlub2RlIGJ5IG5hbWUsIHNvIHRoZSBzYW1lIHJldHJ5IGFwcGxpZXM6IHRoZVxcbitcXHQgKiByZWZ1c2FsIGRlc2NyaWJlcyBhIGhhbmRsZSBhbmQgdGhlIHdhbGsgbWF5IHJlc29sdmUgdGhlIG5hbWUgYWdhaW4uXFxuK1xcdCAqL1xcbitcXHRBU1NFUlRfRVEoMCwgY2htb2Qoc2VsZi1cXHUwMDNlZmlsZV9wYXRoLCAwNjAwKSkge1xcbitcXHRcXHRUSF9MT0coXFxcImNobW9kIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHNldGF0dHIgcmVxdWVzdChzKVxcXCIsXFxuK1xcdFxcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMuc2V0YXR0cnNfc2Vlbik7XFxuK1xcdH1cXG4rXFx0RVhQRUNUX0dUKGdfZHMuc2V0YXR0cnNfc2VlbiwgMSk7XFxuK31cXG4rXFxuK1RFU1RfRihvcGVuX2VzdGFsZSwgcmVmdXNlZF9yZWFkbGlua19vbl9wYXRoX2lzX3JldHJpZWQpXFxuK3tcXG4rXFx0Y2hhciBidWZbUEFUSF9NQVhdO1xcbitcXHRzc2l6ZV90IG47XFxuK1xcbitcXHRnX2RzLndoYXQgPSBSRUZVU0VfUkVBRExJTks7XFxuK1xcbitcXHRuID0gcmVhZGxpbmsoc2VsZi1cXHUwMDNlbGlua19wYXRoLCBidWYsIHNpemVvZihidWYpIC0gMSk7XFxuK1xcdEFTU0VSVF9HRShuLCAwKSB7XFxuK1xcdFxcdFRIX0xPRyhcXFwicmVhZGxpbmsgZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgcmVhZGxpbmsgcmVxdWVzdChzKVxcXCIsXFxuK1xcdFxcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMucmVhZGxpbmtzX3NlZW4pO1xcbitcXHR9XFxuK1xcdGJ1ZltuXSA9ICdcXFxcMCc7XFxuK1xcdEVYUEVDVF9TVFJFUShMSU5LX1RBUkdFVCwgYnVmKTtcXG4rXFx0RVhQRUNUX0dUKGdfZHMucmVhZGxpbmtzX3NlZW4sIDEpO1xcbit9XFxuK1xcbitURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfc3RhdGZzX29uX3BhdGhfaXNfcmV0cmllZClcXG4re1xcbitcXHRzdHJ1Y3Qgc3RhdGZzIHNmcztcXG4rXFxuK1xcdGdfZHMud2hhdCA9IFJFRlVTRV9TVEFURlM7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBzdGF0ZnMoKSBkZXNjcmliZXMgdGhlIG1vdW50IHJhdGhlciB0aGFuIHRoZSBmaWxlLCBidXQgaXQgaXMgc3RpbGxcXG4rXFx0ICogcmVhY2hlZCB0aHJvdWdoIGEgcGF0aCB3YWxrLCBzbyBhIHJlZnVzYWwgdGhhdCBuYW1lcyBhIGhhbmRsZSBpc1xcbitcXHQgKiByZXRyaWVkIHRoZSBzYW1lIHdheS5cXG4rXFx0ICovXFxuK1xcdEFTU0VSVF9FUSgwLCBzdGF0ZnMoc2VsZi1cXHUwMDNlZmlsZV9wYXRoLCBcXHUwMDI2c2ZzKSkge1xcbitcXHRcXHRUSF9MT0coXFxcInN0YXRmcyBmYWlsZWQgd2l0aCAlcyBhZnRlciAlZCBzdGF0ZnMgcmVxdWVzdChzKVxcXCIsXFxuK1xcdFxcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMuc3RhdGZzc19zZWVuKTtcXG4rXFx0fVxcbitcXHRFWFBFQ1RfR1QoZ19kcy5zdGF0ZnNzX3NlZW4sIDEpO1xcbit9XFxuK1xcbitURVNUX0Yob3Blbl9lc3RhbGUsIGFic2VudF9uYW1lX3N0aWxsX3JlcG9ydHNfYWJzZW50KVxcbit7XFxuK1xcdGludCBmZDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEhlcmUgaXQgaXMgdGhlIGxvb2t1cCB0aGF0IGZhaWxzIHJhdGhlciB0aGFuIHRoZSBvcGVuLCBzbyBub3RoaW5nIGlzXFxuK1xcdCAqIGJlaW5nIGRlc2NyaWJlZCBhcyBzdGFsZSBhbmQgdGhlIGNhbGxlciBtdXN0IHN0aWxsIGJlIHRvbGQgdGhlIG5hbWVcXG4rXFx0ICogaXMgbm90IHRoZXJlLlxcbitcXHQgKi9cXG4rXFx0ZmQgPSBvcGVuKHNlbGYtXFx1MDAzZWFic2VudF9wYXRoLCBPX1JET05MWSk7XFxuK1xcdEFTU0VSVF9MVChmZCwgMCk7XFxuK1xcdEVYUEVDVF9FUShFTk9FTlQsIGVycm5vKTtcXG4rfVxcbitcXG4rVEVTVF9IQVJORVNTX01BSU5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMDA6MDU6MzIuMzI5Mzg1NzQ4WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoxMTIyOTA1NjU1ODYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRlVTRV9GU1wiLFxuICAgIFwiVklSVElPX0ZTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZnVzZV9kb19zZXRhdHRyXCIsXG4gICAgXCJmdXNlX29wZW5cIixcbiAgICBcImZ1c2VfZGlyX29wZW5cIixcbiAgICBcImZ1c2VfZG9fZ2V0YXR0clwiLFxuICAgIFwiZnVzZV9zdGF0ZnNcIixcbiAgICBcImZ1c2VfcmVhZGxpbmtfZm9saW9cIixcbiAgICBcInZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggdXBkYXRlcyBlcnJvciBoYW5kbGluZyBmb3IgbGl2ZSBub2RlIElEcyBpbiBGVVNFIGFuZCB2aXJ0aW8tZnMgd2hlbiB0aGUgdXNlci9ob3N0IHNlcnZlciByZXR1cm5zIC1FTk9FTlQsIHRyYW5zbGF0aW5nIGl0IHRvIC1FU1RBTEUgb3IgLUVPUEVOU1RBTEUgdG8gdHJpZ2dlciBWRlMgcGF0aCBsb29rdXAgcmV0cmllcyAoTE9PS1VQX1JFVkFMKS4gVGhlc2UgZnVuY3Rpb25hbCBjaGFuZ2VzIGltcGFjdCBjb3JlIGZpbGUgb3BlcmF0aW9ucyAob3BlbiwgZ2V0YXR0ciwgc2V0YXR0ciwgcmVhZGxpbmssIHN0YXRmcykgaW4gRlVTRSBhbmQgdmlydGlvLWZzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBiNGNjYTM0YjZmZWU5NDg2M2IxYmUyMDM5MjA5MzhlMWY0YWY5YmU0XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgMjggMDA6MDU6MzAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9mdXNlL2Rpci5jIGIvZnMvZnVzZS9kaXIuY1xuaW5kZXggZTQ5YjRlODc0YjE1Zi4uMjE3YTAzOTk5MDUwNyAxMDA2NDRcbi0tLSBhL2ZzL2Z1c2UvZGlyLmNcbisrKyBiL2ZzL2Z1c2UvZGlyLmNcbkBAIC0xNTMyLDYgKzE1MzIsOCBAQCBzdGF0aWMgaW50IGZ1c2VfZG9fZ2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGlub2RlICppbm9kZSxcbiBcdFx0XHRpZiAoc3RhdClcbiBcdFx0XHRcdGZ1c2VfZmlsbGF0dHIoaWRtYXAsIGlub2RlLCBcdTAwMjZvdXRhcmcuYXR0ciwgc3RhdCk7XG4gXHRcdH1cbitcdH0gZWxzZSB7XG4rXHRcdGVyciA9IGZ1c2Vfc3RhbGVfaW5vZGVfZXJyKGVycik7XG4gXHR9XG4gXHRyZXR1cm4gZXJyO1xuIH1cbkBAIC0xODQ4LDYgKzE4NTAsNyBAQCBzdGF0aWMgaW50IGZ1c2VfcmVhZGxpbmtfZm9saW8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZvbGlvICpmb2xpbylcbiBcbiBcdGZ1c2VfaW52YWxpZGF0ZV9hdGltZShpbm9kZSk7XG4gXG4rXHRyZXMgPSBmdXNlX3N0YWxlX2lub2RlX2VycihyZXMpO1xuIFx0aWYgKHJlcyBcdTAwM2MgMClcbiBcdFx0cmV0dXJuIHJlcztcbiBcbkBAIC0xOTEwLDYgKzE5MTMsMTIgQEAgc3RhdGljIGludCBmdXNlX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxuIFx0XHRyZXR1cm4gZXJyO1xuIFxuIFx0ZXJyID0gZnVzZV9kb19vcGVuKGZtLCBnZXRfbm9kZV9pZChpbm9kZSksIGZpbGUsIHRydWUpO1xuK1x0LypcbitcdCAqIEFzIGluIGZ1c2Vfb3Blbl9jb21tb24oKTogYSBwYXRoIHdhbGsgc3RhbmRzIGJlaGluZCB0aGlzIG9wZW4sXG4rXHQgKiBzbyB0aGUgcmVmdXNhbCBpcyBFT1BFTlNUQUxFIGZvciBwYXRoX29wZW5hdCgpIHRvIGFuc3dlci5cbitcdCAqL1xuK1x0aWYgKGVyciA9PSAtRU5PRU5UKVxuK1x0XHRlcnIgPSAtRU9QRU5TVEFMRTtcbiBcdGlmICghZXJyKSB7XG4gXHRcdHN0cnVjdCBmdXNlX2ZpbGUgKmZmID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4gXG5AQCAtMjI0OSw2ICsyMjU4LDcgQEAgaW50IGZ1c2VfZG9fc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuIFx0aWYgKGVycikge1xuIFx0XHRpZiAoZXJyID09IC1FSU5UUilcbiBcdFx0XHRmdXNlX2ludmFsaWRhdGVfYXR0cihpbm9kZSk7XG4rXHRcdGVyciA9IGZ1c2Vfc3RhbGVfaW5vZGVfZXJyKGVycik7XG4gXHRcdGdvdG8gZXJyb3I7XG4gXHR9XG4gXG5kaWZmIC0tZ2l0IGEvZnMvZnVzZS9maWxlLmMgYi9mcy9mdXNlL2ZpbGUuY1xuaW5kZXggOGQ2MTM1YTYxMDhhNC4uMzA4YjE1YzMwZjM0ZCAxMDA2NDRcbi0tLSBhL2ZzL2Z1c2UvZmlsZS5jXG4rKysgYi9mcy9mdXNlL2ZpbGUuY1xuQEAgLTI3OSw2ICsyNzksMTcgQEAgc3RhdGljIGludCBmdXNlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG4gXHRcdGZ1c2Vfc2V0X25vd3JpdGUoaW5vZGUpO1xuIFxuIFx0ZXJyID0gZnVzZV9kb19vcGVuKGZtLCBnZXRfbm9kZV9pZChpbm9kZSksIGZpbGUsIGZhbHNlKTtcbitcdC8qXG4rXHQgKiBUaGlzIG9wZW4gcmVhY2hlZCB0aGUgc2VydmVyIHRocm91Z2ggYSBwYXRoIHdhbGssIHNvIGEgcmVmdXNhbFxuK1x0ICogZm9yIHRoZSBsaXZlIG5vZGVpZCBpcyByZXBvcnRlZCBhcyBFT1BFTlNUQUxFIHJhdGhlciB0aGFuIHRoZVxuK1x0ICogRVNUQUxFIHRoZSBub2RlaWQtb25seSByZXF1ZXN0cyBzYXk6IHBhdGhfb3BlbmF0KCkgcGlja3MgdGhlXG4rXHQgKiBjaGVhcGVzdCByZXRyeSBmb3IgdGhlIHdhbGsgaW4gcHJvZ3Jlc3MsIEVDSElMRCB1bmRlciBMT09LVVBfUkNVXG4rXHQgKiBhbmQgRVNUQUxFIG90aGVyd2lzZS4gZnVzZV9maWxlX29wZW4oKSBpcyBsZWZ0IGFsb25lIGJlY2F1c2VcbitcdCAqIGZ1c2VfcHJpdl9pb2N0bF9wcmVwYXJlKCkgcmVhY2hlcyBpdCB0byBzZXJ2ZSBGU19JT0NfR0VURkxBR1MsXG4rXHQgKiB3aXRoIG5vIG9wZW4gYmVoaW5kIGl0IHRvIHRyYW5zbGF0ZSB0aGUgaW50ZXJuYWwgZXJybm8uXG4rXHQgKi9cbitcdGlmIChlcnIgPT0gLUVOT0VOVClcbitcdFx0ZXJyID0gLUVPUEVOU1RBTEU7XG4gXHRpZiAoIWVycikge1xuIFx0XHRmZiA9IGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhO1xuIFx0XHRlcnIgPSBmdXNlX2ZpbmlzaF9vcGVuKGlub2RlLCBmaWxlKTtcbmRpZmYgLS1naXQgYS9mcy9mdXNlL2Z1c2VfaS5oIGIvZnMvZnVzZS9mdXNlX2kuaFxuaW5kZXggYzhkNGM1ZjNhZjdlOC4uZTZiMjU5N2Q2ZGQ2ZiAxMDA2NDRcbi0tLSBhL2ZzL2Z1c2UvZnVzZV9pLmhcbisrKyBiL2ZzL2Z1c2UvZnVzZV9pLmhcbkBAIC0xMjUwLDYgKzEyNTAsMjUgQEAgdm9pZCBmdXNlX2lub2RlX3VuY2FjaGVkX2lvX2VuZChzdHJ1Y3QgZnVzZV9pbm9kZSAqZmkpO1xuIGludCBmdXNlX2ZpbGVfaW9fb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGlub2RlICppbm9kZSk7XG4gdm9pZCBmdXNlX2ZpbGVfaW9fcmVsZWFzZShzdHJ1Y3QgZnVzZV9maWxlICpmZiwgc3RydWN0IGlub2RlICppbm9kZSk7XG4gXG4rLypcbisgKiBSZXBvcnQgYSByZXF1ZXN0IHJlZnVzZWQgZm9yIGEgbGl2ZSBub2RlaWQgYXMgc3RhbGUuXG4rICpcbisgKiBBIHJlcXVlc3QgdGhhdCBuYW1lcyBhIG5vZGVpZCBhbmQgbm90aGluZyBlbHNlIGlzIG9ubHkgc2VudCBmb3IgYW5cbisgKiBpbm9kZSB0aGUgY2xpZW50IGhhcyBsb29rZWQgdXAgYW5kIGhvbGRzIGEgcmVmZXJlbmNlIHRvLCBhbmQgdGhlXG4rICogc2VydmVyIG93ZXMgdGhlIGNsaWVudCB0aGF0IGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuXG4rICogRU5PRU5UIGZyb20gdGhlIHNlcnZlciBkZXNjcmliZXMgdGhlIGlub2RlIGl0c2VsZiByYXRoZXIgdGhhbiBhIG5hbWVcbisgKiB0aGF0IGhhcyBnb25lIGF3YXkuIFJlcG9ydCB0aGUgaGFuZGxlIGFzIHN0YWxlLCB3aGljaCB0aGUgY2FsbGVyXG4rICogYW5zd2VycyBieSByZXNvbHZpbmcgdGhlIG5hbWUgYWdhaW4gdW5kZXIgTE9PS1VQX1JFVkFMIGFuZCBhY3Rpbmcgb25cbisgKiB3aGF0ZXZlciBpdCByZWZlcnMgdG8gbm93LiBBIG5hbWUgdGhhdCByZWFsbHkgaGFzIGdvbmUgZmFpbHMgdGhhdFxuKyAqIHNlY29uZCBsb29rdXAgYW5kIHRoZSBjYWxsZXIgc3RpbGwgc2VlcyBFTk9FTlQuXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgZnVzZV9zdGFsZV9pbm9kZV9lcnIoaW50IGVycilcbit7XG4rXHRpZiAoZXJyID09IC1FTk9FTlQpXG4rXHRcdHJldHVybiAtRVNUQUxFO1xuK1x0cmV0dXJuIGVycjtcbit9XG4rXG4gLyogZmlsZS5jICovXG4gc3RydWN0IGZ1c2VfZmlsZSAqZnVzZV9maWxlX29wZW4oc3RydWN0IGZ1c2VfbW91bnQgKmZtLCB1NjQgbm9kZWlkLFxuIFx0XHRcdFx0IHVuc2lnbmVkIGludCBvcGVuX2ZsYWdzLCBib29sIGlzZGlyKTtcbmRpZmYgLS1naXQgYS9mcy9mdXNlL2lub2RlLmMgYi9mcy9mdXNlL2lub2RlLmNcbmluZGV4IGU5NTUyYmUzNjM3YmMuLmNkZTBhNTMzNTA4OTcgMTAwNjQ0XG4tLS0gYS9mcy9mdXNlL2lub2RlLmNcbisrKyBiL2ZzL2Z1c2UvaW5vZGUuY1xuQEAgLTY2Niw3ICs2NjYsNyBAQCBzdGF0aWMgaW50IGZ1c2Vfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZilcbiBcdGVyciA9IGZ1c2Vfc2ltcGxlX3JlcXVlc3QoZm0sIFx1MDAyNmFyZ3MpO1xuIFx0aWYgKCFlcnIpXG4gXHRcdGNvbnZlcnRfZnVzZV9zdGF0ZnMoYnVmLCBcdTAwMjZvdXRhcmcuc3QpO1xuLVx0cmV0dXJuIGVycjtcbitcdHJldHVybiBmdXNlX3N0YWxlX2lub2RlX2VycihlcnIpO1xuIH1cbiBcbiBzdGF0aWMgc3RydWN0IGZ1c2Vfc3luY19idWNrZXQgKmZ1c2Vfc3luY19idWNrZXRfYWxsb2Modm9pZClcbmRpZmYgLS1naXQgYS9mcy9mdXNlL3ZpcnRpb19mcy5jIGIvZnMvZnVzZS92aXJ0aW9fZnMuY1xuaW5kZXggZjE1ZTUxNmViY2I1Yy4uN2IwM2JmODdjMmFlOCAxMDA2NDRcbi0tLSBhL2ZzL2Z1c2UvdmlydGlvX2ZzLmNcbisrKyBiL2ZzL2Z1c2UvdmlydGlvX2ZzLmNcbkBAIC03ODAsNiArNzgwLDY2IEBAIHN0YXRpYyBib29sIHZpcnRpb19mc192ZXJpZnlfcmVzcG9uc2Uoc3RydWN0IGZ1c2VfcmVxICpyZXEsIHVuc2lnbmVkIGludCBsZW4pXG4gXHRyZXR1cm4gdHJ1ZTtcbiB9XG4gXG4rLypcbisgKiBSZXBvcnQgYSByZXF1ZXN0IHJlZnVzZWQgZm9yIGEgbGl2ZSBub2RlaWQgYXMgc3RhbGUuXG4rICpcbisgKiBUaGVzZSByZXF1ZXN0cyBjYXJyeSBhIG5vZGVpZCBhbmQgbm8gbmFtZSwgc28gdGhlIGNsaWVudCBvbmx5IHNlbmRzIHRoZW0gZm9yXG4rICogYW4gaW5vZGUgaXQgaGFzIGFscmVhZHkgbG9va2VkIHVwIGFuZCBob2xkcyBhIHJlZmVyZW5jZSB0bywgYW5kIGEgc2VydmVyIG93ZXNcbisgKiB0aGUgY2xpZW50IHRoYXQgaW5vZGUgdW50aWwgaXQgaXMgc2VudCBGVVNFX0ZPUkdFVC4gQSBzZXJ2ZXIgYW5zd2VyaW5nIHdpdGhcbisgKiBFTk9FTlQgaXMgZGVzY3JpYmluZyBhIGhhbmRsZSBpdCB3YXMgb2JsaWdlZCB0byBob25vdXIgcmF0aGVyIHRoYW4gYSBuYW1lXG4rICogdGhhdCBoYXMgZ29uZSBhd2F5LCBhbmQgdGhlIGNhbGxlciBoYXMgbm8gcmVhc29uIHRvIGRvdWJ0IGl0LlxuKyAqXG4rICogU2F5aW5nIHRoZSBoYW5kbGUgaXMgc3RhbGUgaXMgc29tZXRoaW5nIHRoZSBjYWxsZXIga25vd3MgaG93IHRvIGFuc3dlcjogaXRcbisgKiByZXBlYXRzIHRoZSBsb29rdXAgdW5kZXIgTE9PS1VQX1JFVkFMIGFuZCBhY3RzIG9uIHdoYXRldmVyIHRoZSBuYW1lIHJlZmVycyB0b1xuKyAqIG5vdy4gQSBuYW1lIHRoYXQgZ2VudWluZWx5IGhhcyBnb25lIGZhaWxzIHRoZSByZXRyaWVkIGxvb2t1cCwgc28gYSBjYWxsZXJcbisgKiBzdGlsbCBsZWFybnMgaXQgaXMgZ29uZS4gcmV0cnlfZXN0YWxlKCkgaXMgd2hhdCBkb2VzIHRoaXMsIGFuZCBmcy9uYW1laS5jLFxuKyAqIGZzL29wZW4uYywgZnMvc3RhdC5jLCBmcy9zdGF0ZnMuYywgZnMvdXRpbWVzLmMgYW5kIGZzL3hhdHRyLmMgYWxsIHJlYWNoIGl0LFxuKyAqIHdoaWNoIGlzIHdoYXQgbWFrZXMgdGhlIGNvbnZlcnNpb24gdXNlZnVsIHJhdGhlciB0aGFuIGEgcmVuYW1lIG9mIHRoZSBlcnJvci5cbisgKlxuKyAqIEEgcmVxdWVzdCB0aGF0IG5hbWVzIHNvbWV0aGluZyB3aGljaCBjYW4gaXRzZWxmIGJlIGFic2VudCBpcyBsZWZ0IGFsb25lLFxuKyAqIGJlY2F1c2UgRU5PRU5UIGlzIHRoZW4gYW1iaWd1b3VzIGFuZCBpcyBmcmVxdWVudGx5IHRoZSBhbnN3ZXIgdGhlIGNhbGxlclxuKyAqIGFza2VkIGZvci4gRlVTRV9MT09LVVAgcmVwb3J0cyBhIG1pc3NpbmcgbmFtZSBpbiBhIGxpdmluZyBkaXJlY3RvcnkgYW5kIHRoZVxuKyAqIGRpcmVjdG9yeSBvcGVyYXRpb25zIGNhcnJ5IGEgcGFyZW50IG5vZGVpZCBiZXNpZGUgb25lLCBzbyBuZWl0aGVyIGNhbiBiZVxuKyAqIHJlYWQgYXMgYSBzdGF0ZW1lbnQgYWJvdXQgdGhlIGlub2RlLiBUaGUgZXh0ZW5kZWQgYXR0cmlidXRlIHJlcXVlc3RzIGJlbG9uZ1xuKyAqIHdpdGggdGhlbTogdGhleSBjYXJyeSBhbiBhdHRyaWJ1dGUgbmFtZSwgYW5kIHdoaWxlIGEgc2VydmVyIHNob3VsZCByZXBvcnQgYVxuKyAqIG1pc3NpbmcgYXR0cmlidXRlIGFzIEVOT0RBVEEsIG9uZSB0aGF0IGFuc3dlcnMgRU5PRU5UIGluc3RlYWQgd291bGQgaGF2ZSBhXG4rICogY29ycmVjdCByZXBseSB0dXJuZWQgaW50byBhIHJldHJ5IHRoYXQgY2Fubm90IHN1Y2NlZWQuXG4rICpcbisgKiBSZXF1ZXN0cyBhZ2FpbnN0IGFuIGFscmVhZHkgb3BlbiBkZXNjcmlwdG9yIGFyZSBhbHNvIGxlZnQgYWxvbmUsIHNpbmNlIHRoZXJlXG4rICogaXMgbm8gZXF1aXZhbGVudCByZXRyeSB0byByZWFjaCBhbmQgY29udmVydGluZyB0aGUgZXJyb3Igd291bGQgcmVuYW1lIGFcbisgKiBmYWlsdXJlIHJhdGhlciB0aGFuIHJlcGFpciBpdCwgYW5kIEZVU0VfSU9DVEwgYW5kIEZVU0VfUE9MTCBoYW5kIHRoZVxuKyAqIHNlcnZlcidzIGVycm5vIHRvIHVzZXJzcGFjZSB2ZXJiYXRpbS5cbisgKi9cbitzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfZml4dXBfc3RhbGVfZXJyb3Ioc3RydWN0IGZ1c2VfcmVxICpyZXEpXG4re1xuK1x0aWYgKHJlcS1cdTAwM2VvdXQuaC5lcnJvciAhPSAtRU5PRU5UKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRzd2l0Y2ggKHJlcS1cdTAwM2Vpbi5oLm9wY29kZSkge1xuK1x0Y2FzZSBGVVNFX09QRU46XG4rXHRjYXNlIEZVU0VfT1BFTkRJUjpcbitcdFx0LypcbitcdFx0ICogQW4gb3BlbiBzYXlzIEVPUEVOU1RBTEUsIGFuZCBwYXRoX29wZW5hdCgpIGRlY2lkZXMgd2hhdCB0aGVcbitcdFx0ICogd2FsayBpbiBwcm9ncmVzcyBzaG91bGQgbWFrZSBvZiBpdDogRUNISUxEIHVuZGVyIExPT0tVUF9SQ1VcbitcdFx0ICogc28gaXQgZHJvcHMgdG8gUkVGLXdhbGssIEVTVEFMRSBvdGhlcndpc2Ugc28gdGhlIG5hbWUgaXNcbitcdFx0ICogcmVzb2x2ZWQgYWdhaW4gdW5kZXIgTE9PS1VQX1JFVkFMLiBOYW1pbmcgRVNUQUxFIGhlcmUgd291bGRcbitcdFx0ICogdGFrZSB0aGUgc2Vjb25kIGluIGJvdGggY2FzZXMgYW5kIHNraXAgYSBjaGVhcGVyIHJldHJ5LlxuK1x0XHQgKi9cbitcdFx0cmVxLVx1MDAzZW91dC5oLmVycm9yID0gLUVPUEVOU1RBTEU7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBGVVNFX0dFVEFUVFI6XG4rXHRjYXNlIEZVU0VfU0VUQVRUUjpcbitcdGNhc2UgRlVTRV9SRUFETElOSzpcbitcdGNhc2UgRlVTRV9TVEFURlM6XG4rXHRcdC8qXG4rXHRcdCAqIE5vdGhpbmcgdHJhbnNsYXRlcyBFT1BFTlNUQUxFIG91dHNpZGUgdGhlIG9wZW4gcGF0aCwgc29cbitcdFx0ICogdGhlc2Ugc2F5IEVTVEFMRSBkaXJlY3RseSwgd2hpY2ggcmV0cnlfZXN0YWxlKCkgYW5zd2Vycy5cbitcdFx0ICovXG4rXHRcdHJlcS1cdTAwM2VvdXQuaC5lcnJvciA9IC1FU1RBTEU7XG4rXHRcdGJyZWFrO1xuK1x0fVxuK31cbitcbiAvKiBXb3JrIGZ1bmN0aW9uIGZvciByZXF1ZXN0IGNvbXBsZXRpb24gKi9cbiBzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZShzdHJ1Y3QgZnVzZV9yZXEgKnJlcSxcbiBcdFx0XHRcdCAgICAgICBzdHJ1Y3QgdmlydGlvX2ZzX3ZxICpmc3ZxKVxuQEAgLTgxMCw2ICs4NzAsOCBAQCBzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZShzdHJ1Y3QgZnVzZV9yZXEgKnJlcSxcbiBcbiBcdGNsZWFyX2JpdChGUl9TRU5ULCBcdTAwMjZyZXEtXHUwMDNlZmxhZ3MpO1xuIFxuK1x0dmlydGlvX2ZzX2ZpeHVwX3N0YWxlX2Vycm9yKHJlcSk7XG4rXG4gXHRmdXNlX3JlcXVlc3RfZW5kKHJlcSk7XG4gXHRzcGluX2xvY2soXHUwMDI2ZnN2cS1cdTAwM2Vsb2NrKTtcbiBcdGRlY19pbl9mbGlnaHRfcmVxKGZzdnEpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZVxuaW5kZXggZmI1MTYwM2ZlNDE5OC4uOWNiMzA0ODEyOGQ1YiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZVxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uZ2l0aWdub3JlXG5AQCAtMSw0ICsxLDYgQEBcbiAjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbitmdXNlX2FjbF9jYWNoZV90ZXN0XG4gZnVzZV9tbnRcbitmdXNlX2VzdGFsZV90ZXN0XG4gZnVzZWN0bF90ZXN0XG4gd3JpdGVfZXh0ZW5kX2VvZl90ZXN0XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvTWFrZWZpbGVcbmluZGV4IDk1YTFlZTk0N2NhNzYuLmY1NjRjYjM3YjNhNWIgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL01ha2VmaWxlXG5AQCAtNiwxMSArNiwxMiBAQCBURVNUX0dFTl9QUk9HUyA6PSBmdXNlY3RsX3Rlc3RcbiBURVNUX0dFTl9QUk9HUyArPSB3cml0ZV9leHRlbmRfZW9mX3Rlc3RcbiBURVNUX0dFTl9GSUxFUyA6PSBmdXNlX21udFxuIFxuLSMgZnVzZV9hY2xfY2FjaGVfdGVzdCByZXF1aXJlcyBsaWJmdXNlMzsgYWRkIGl0IG9ubHkgd2hlbiB0aGUgbGlicmFyeSBpcyBwcmVzZW50LlxuLUFDTF9DRkxBR1MgOj0gJChzaGVsbCBwa2ctY29uZmlnIGZ1c2UzIC0tY2ZsYWdzIDJcdTAwM2UvZGV2L251bGwpXG4tQUNMX0xETElCUyA6PSAkKHNoZWxsIHBrZy1jb25maWcgZnVzZTMgLS1saWJzIDJcdTAwM2UvZGV2L251bGwpXG4taWZuZXEgKCQoQUNMX0NGTEFHUyksKVxuKyMgVGhlc2UgdGVzdHMgcmVxdWlyZSBsaWJmdXNlMzsgYWRkIHRoZW0gb25seSB3aGVuIHRoZSBsaWJyYXJ5IGlzIHByZXNlbnQuXG4rRlVTRTNfQ0ZMQUdTIDo9ICQoc2hlbGwgcGtnLWNvbmZpZyBmdXNlMyAtLWNmbGFncyAyXHUwMDNlL2Rldi9udWxsKVxuK0ZVU0UzX0xETElCUyA6PSAkKHNoZWxsIHBrZy1jb25maWcgZnVzZTMgLS1saWJzIDJcdTAwM2UvZGV2L251bGwpXG4raWZuZXEgKCQoRlVTRTNfQ0ZMQUdTKSwpXG4gVEVTVF9HRU5fUFJPR1MgKz0gZnVzZV9hY2xfY2FjaGVfdGVzdFxuK1RFU1RfR0VOX1BST0dTICs9IGZ1c2VfZXN0YWxlX3Rlc3RcbiBlbmRpZlxuIFxuIGluY2x1ZGUgLi4vLi4vbGliLm1rXG5AQCAtMzAsNSArMzEsOCBAQCBlbmRpZlxuICQoT1VUUFVUKS9mdXNlX21udDogQ0ZMQUdTICs9ICQoVkFSX0NGTEFHUylcbiAkKE9VVFBVVCkvZnVzZV9tbnQ6IExETElCUyArPSAkKFZBUl9MRExJQlMpXG4gXG4tJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IENGTEFHUyArPSAkKEFDTF9DRkxBR1MpXG4tJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IExETElCUyArPSAkKEFDTF9MRExJQlMpXG4rJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IENGTEFHUyArPSAkKEZVU0UzX0NGTEFHUylcbiskKE9VVFBVVCkvZnVzZV9hY2xfY2FjaGVfdGVzdDogTERMSUJTICs9ICQoRlVTRTNfTERMSUJTKVxuK1xuKyQoT1VUUFVUKS9mdXNlX2VzdGFsZV90ZXN0OiBDRkxBR1MgKz0gJChGVVNFM19DRkxBR1MpXG4rJChPVVRQVVQpL2Z1c2VfZXN0YWxlX3Rlc3Q6IExETElCUyArPSAkKEZVU0UzX0xETElCUylcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL2Z1c2VfZXN0YWxlX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvZnVzZV9lc3RhbGVfdGVzdC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uODJiODQyZDNhNWY3YlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9mdXNlX2VzdGFsZV90ZXN0LmNcbkBAIC0wLDAgKzEsNDUwIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIFRlc3Q6IGEgcmVxdWVzdCByZWZ1c2VkIGZvciBhbiBpbm9kZSB0aGUgY2xpZW50IHN0aWxsIGhvbGRzIGEgcmVmZXJlbmNlIHRvXG4rICpcbisgKiBGVVNFX09QRU4sIEZVU0VfR0VUQVRUUiwgRlVTRV9TRVRBVFRSLCBGVVNFX1JFQURMSU5LIGFuZCBGVVNFX1NUQVRGUyBjYXJyeSBhXG4rICogbm9kZWlkIHJhdGhlciB0aGFuIGEgcGF0aC4gIFRoZSBjbGllbnQgb25seSBzZW5kcyB0aGVtIGZvciBhbiBpbm9kZSBpdCBoYXNcbisgKiBhbHJlYWR5IGxvb2tlZCB1cCBhbmQgaG9sZHMgYSByZWZlcmVuY2UgdG8sIGFuZCBhIHNlcnZlciBvd2VzIHRoZSBjbGllbnQgdGhhdFxuKyAqIGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuICBBIHNlcnZlciB0aGF0IGxldHMgdGhlIGlub2RlIGdvIGVhcmx5LFxuKyAqIGFzIG9uZSBiYWNraW5nIGEgc2hhcmVkIGRpcmVjdG9yeSBkb2VzIHdoZW4gdGhlIG5hbWUgaXMgcmVuYW1lZCBvdmVyLCBhbnN3ZXJzXG4rICogd2l0aCBFTk9FTlQuXG4rICpcbisgKiBPbiBhbiB1bmZpeGVkIGtlcm5lbCB0aGF0IEVOT0VOVCBpcyBwYXNzZWQgb3V0IHVuY2hhbmdlZC4gIFRoZSBwYXRoIHdhbGsgaGFzXG4rICogbm8gcmVhc29uIHRvIGRvdWJ0IGl0IGFuZCB0aGUgY2FsbGVyIGlzIHRvbGQgYSBmaWxlIGlzIG1pc3Npbmcgd2hlbiBpdCBuZXZlclxuKyAqIHN0b3BwZWQgZXhpc3RpbmcuICBDYWxsZXJzIHRoYXQgcmVhZCBhIG1pc3NpbmcgZmlsZSBhcyBhbiBlbXB0eSBvbmUgYWN0IG9uXG4rICogdGhlIGVtcHRpbmVzcy5cbisgKlxuKyAqIEZpeGVkIChmcy9mdXNlL2ZpbGUuYyBhbmQgZnMvZnVzZS9kaXIuYyk6IEVOT0VOVCBiZWNvbWVzIEVTVEFMRSwgd2hpY2hcbisgKiBkZXNjcmliZXMgdGhlIGhhbmRsZSByYXRoZXIgdGhhbiB0aGUgbmFtZS4gIGZpbGVuYW1lX2xvb2t1cCgpIGFuZFxuKyAqIGRvX2ZpbHBfb3BlbigpIGFscmVhZHkgcmV0cnkgd2l0aCBMT09LVVBfUkVWQUwgb24gRVNUQUxFLCBzbyB0aGUgbmFtZSBpc1xuKyAqIHJlc29sdmVkIGFnYWluIGFuZCB0aGUgaW5vZGUgaXQgcmVmZXJzIHRvIG5vdyBpcyB1c2VkLiAgQSBuYW1lIHRoYXQgaGFzXG4rICogZ2VudWluZWx5IGdvbmUgYXdheSBmYWlscyB0aGUgcmV0cmllZCBsb29rdXAsIHNvIEVOT0VOVCBzdGlsbCByZWFjaGVzIGFcbisgKiBjYWxsZXIgdGhhdCBkZXNlcnZlcyBpdC5cbisgKlxuKyAqIE9ubHkgcmVxdWVzdHMgcmVhY2hhYmxlIHRocm91Z2ggYSBwYXRoIHdhbGsgYXJlIGNvdmVyZWQsIGJlY2F1c2UgdGhlIHJldHJ5XG4rICogaXMgd2hhdCBtYWtlcyBFU1RBTEUgdXNlZnVsIGFuZCB0aGUgd2FsayBpcyB3aGF0IHBlcmZvcm1zIGl0LiAgQW4gb3BlcmF0aW9uXG4rICogb24gYSBkZXNjcmlwdG9yIGFscmVhZHkgb3BlbiBoYXMgbm8gZXF1aXZhbGVudCByZWNvdmVyeS5cbisgKlxuKyAqIFRlc3Qgb3V0bGluZTpcbisgKiAgMS4gTW91bnQgYSBtaW5pbWFsIEZVU0UgZnMgaG9sZGluZyBvbmUgZmlsZS5cbisgKiAgMi4gVGhlIHNlcnZlciByZWZ1c2VzIHRoZSBmaXJzdCByZXF1ZXN0IG9mIHRoZSBraW5kIHVuZGVyIHRlc3QgYW5kIGFsbG93c1xuKyAqICAgICBldmVyeSBvbmUgYWZ0ZXIgaXQsIHN0YW5kaW5nIGluIGZvciBhIHNlcnZlciB0aGF0IHJlbGVhc2VkIHRoZSBpbm9kZSBhbmRcbisgKiAgICAgaGFzIHNpbmNlIHJlc29sdmVkIHRoZSBuYW1lIGFnYWluLlxuKyAqICAzLiBvcGVuYXQoKSB0aGUgZmlsZS5cbisgKiAgICAgQnVnZ3k6ICBFTk9FTlQgcmVhY2hlcyB0aGUgY2FsbGVyLCBvbmUgb3BlbiB3YXMgYXNrZWQgZm9yLiAgRkFJTC5cbisgKiAgICAgRml4ZWQ6ICB0aGUgd2FsayByZXRyaWVzLCB0aGUgc2Vjb25kIG9wZW4gaXMgYWxsb3dlZCwgdGhlIGRlc2NyaXB0b3IgaXNcbisgKiAgICAgICAgICAgICByZXR1cm5lZCwgdHdvIG9wZW5zIHdlcmUgYXNrZWQgZm9yLiAgUEFTUy5cbisgKiAgNC4gc3RhdCgpLCBjaG1vZCgpLCByZWFkbGluaygpIGFuZCBzdGF0ZnMoKSBieSBuYW1lLCB3aGljaCBhcmUgdGhlIHNhbWVcbisgKiAgICAgcmVjb3ZlcnkgdGhyb3VnaCBGVVNFX0dFVEFUVFIsIEZVU0VfU0VUQVRUUiwgRlVTRV9SRUFETElOSyBhbmRcbisgKiAgICAgRlVTRV9TVEFURlMuICBFYWNoIGlzIHJlYWNoZWQgdGhyb3VnaCBhIHBhdGggd2Fsaywgd2hpY2ggaXMgd2hhdCBtYWtlc1xuKyAqICAgICB0aGUgcmV0cnkgYXZhaWxhYmxlLlxuKyAqICA1LiBPcGVuIGEgbmFtZSB0aGUgc2VydmVyIGRvZXMgbm90IGhhdmUgYXQgYWxsLlxuKyAqICAgICBCb3RoOiAgIEVOT0VOVCwgYmVjYXVzZSB0aGUgbG9va3VwIGZhaWxzIHJhdGhlciB0aGFuIHRoZSBvcGVuLCBhbmQgYVxuKyAqICAgICAgICAgICAgIGZpbGUgdGhhdCBpcyBhYnNlbnQgbXVzdCBzdGlsbCBsb29rIGFic2VudC5cbisgKi9cbitcbisjZGVmaW5lIF9HTlVfU09VUkNFXG4rI2RlZmluZSBGVVNFX1VTRV9WRVJTSU9OIDM0XG4rXG4rI2luY2x1ZGUgXHUwMDNjZXJybm8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NmdXNlX2xvd2xldmVsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9saW1pdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGJvb2wuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3N0YXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0dmZzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvdmZzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwiLi4vLi4va3NlbGZ0ZXN0X2hhcm5lc3MuaFwiXG4rXG4rI2RlZmluZSBGSUxFX05BTUVcdFwiaGVsZFwiXG4rI2RlZmluZSBMSU5LX05BTUVcdFwiaGVsZC1saW5rXCJcbisjZGVmaW5lIEFCU0VOVF9OQU1FXHRcIm5vLXN1Y2gtZmlsZVwiXG4rI2RlZmluZSBGSUxFX0lOT1x0MlxuKyNkZWZpbmUgTElOS19JTk9cdDNcbisjZGVmaW5lIENPTlRFTlRTXHRcInByZXNlbnRcXG5cIlxuKyNkZWZpbmUgTElOS19UQVJHRVRcdEZJTEVfTkFNRVxuK1xuKy8qXG4rICogV2hpY2ggcmVxdWVzdCB0aGUgc2VydmVyIHJlZnVzZXMsIGFuZCBob3cgbWFueSB0aW1lcy4gIFNoYXJlZCB3aXRoIHRoZVxuKyAqIGRhZW1vbiB0aHJlYWQ7IG9uZSB0ZXN0IHJ1bnMgYXQgYSB0aW1lLCBzbyBwbGFpbiBpbnRzLlxuKyAqXG4rICogRXZlcnkgb25lIG9mIHRoZXNlIG5hbWVzIGFuIGlub2RlIGJ5IG5vZGVpZCByYXRoZXIgdGhhbiBieSBuYW1lLCBzbyBhXG4rICogcmVmdXNhbCBvZiBhbnkgb2YgdGhlbSBpcyBkZXNjcmliaW5nIGEgaGFuZGxlIHJhdGhlciB0aGFuIGEgbWlzc2luZyBmaWxlLlxuKyAqIEZVU0VfTE9PS1VQIGlzIGRlbGliZXJhdGVseSBhYnNlbnQ6IGl0IGNhcnJpZXMgYSBuYW1lLCBzbyBpdHMgRU5PRU5UIGlzIGFuXG4rICogYW5zd2VyIHJhdGhlciB0aGFuIGEgZmF1bHQsIGFuZCBhYnNlbnRfbmFtZV9zdGlsbF9yZXBvcnRzX2Fic2VudCBjb3ZlcnMgaXQuXG4rICovXG4rZW51bSByZWZ1c2Vfd2hhdCB7XG4rXHRSRUZVU0VfTk9USElORyxcbitcdFJFRlVTRV9PUEVOLFxuK1x0UkVGVVNFX0dFVEFUVFIsXG4rXHRSRUZVU0VfU0VUQVRUUixcbitcdFJFRlVTRV9SRUFETElOSyxcbitcdFJFRlVTRV9TVEFURlMsXG4rfTtcbitcbitzdGF0aWMgc3RydWN0IHtcbitcdGVudW0gcmVmdXNlX3doYXQgd2hhdDtcbitcdGludCByZWZ1c2Fsc19sZWZ0O1xuK1x0aW50IG9wZW5zX3NlZW47XG4rXHRpbnQgZ2V0YXR0cnNfc2VlbjtcbitcdGludCBzZXRhdHRyc19zZWVuO1xuK1x0aW50IHJlYWRsaW5rc19zZWVuO1xuK1x0aW50IHN0YXRmc3Nfc2Vlbjtcbit9IGdfZHM7XG4rXG4rLyogVHJ1ZSBvbmNlLCBmb3IgdGhlIHJlcXVlc3QgdW5kZXIgdGVzdCwgYW5kIHRoZW4gbmV2ZXIgYWdhaW4uICovXG4rc3RhdGljIGJvb2wgcmVmdXNlX25vdyhlbnVtIHJlZnVzZV93aGF0IHdoYXQpXG4re1xuK1x0aWYgKGdfZHMud2hhdCAhPSB3aGF0IHx8IGdfZHMucmVmdXNhbHNfbGVmdCBcdTAwM2M9IDApXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdGdfZHMucmVmdXNhbHNfbGVmdC0tO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGZpbGxfYXR0cihmdXNlX2lub190IGlubywgc3RydWN0IHN0YXQgKnN0KVxuK3tcbitcdG1lbXNldChzdCwgMCwgc2l6ZW9mKCpzdCkpO1xuK1x0c3QtXHUwMDNlc3RfaW5vID0gaW5vO1xuK1x0LypcbitcdCAqIE93bmVkIGJ5IHdob2V2ZXIgcnVucyB0aGUgdGVzdCwgc28gdGhhdCBjaG1vZCgpIGlzIGEgcmVxdWVzdCB0aGVcbitcdCAqIGtlcm5lbCB3aWxsIGNhcnJ5IHRocm91Z2ggdG8gdGhlIHNlcnZlciByYXRoZXIgdGhhbiByZWZ1c2UgaXRzZWxmLlxuK1x0ICovXG4rXHRzdC1cdTAwM2VzdF91aWQgPSBnZXR1aWQoKTtcbitcdHN0LVx1MDAzZXN0X2dpZCA9IGdldGdpZCgpO1xuK1x0aWYgKGlubyA9PSBGVVNFX1JPT1RfSUQpIHtcbitcdFx0c3QtXHUwMDNlc3RfbW9kZSA9IFNfSUZESVIgfCAwNzU1O1xuK1x0XHRzdC1cdTAwM2VzdF9ubGluayA9IDI7XG4rXHR9IGVsc2UgaWYgKGlubyA9PSBMSU5LX0lOTykge1xuK1x0XHRzdC1cdTAwM2VzdF9tb2RlID0gU19JRkxOSyB8IDA3Nzc7XG4rXHRcdHN0LVx1MDAzZXN0X25saW5rID0gMTtcbitcdFx0c3QtXHUwMDNlc3Rfc2l6ZSA9IHNpemVvZihMSU5LX1RBUkdFVCkgLSAxO1xuK1x0fSBlbHNlIHtcbitcdFx0c3QtXHUwMDNlc3RfbW9kZSA9IFNfSUZSRUcgfCAwNjQ0O1xuK1x0XHRzdC1cdTAwM2VzdF9ubGluayA9IDE7XG4rXHRcdHN0LVx1MDAzZXN0X3NpemUgPSBzaXplb2YoQ09OVEVOVFMpIC0gMTtcbitcdH1cbit9XG4rXG4rc3RhdGljIHZvaWQgdF9sb29rdXAoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgcGFyZW50LCBjb25zdCBjaGFyICpuYW1lKVxuK3tcbitcdHN0cnVjdCBmdXNlX2VudHJ5X3BhcmFtIGU7XG4rXHRmdXNlX2lub190IGlubztcbitcbitcdGlmIChwYXJlbnQgIT0gRlVTRV9ST09UX0lEKVxuK1x0XHRpbm8gPSAwO1xuK1x0ZWxzZSBpZiAoIXN0cmNtcChuYW1lLCBGSUxFX05BTUUpKVxuK1x0XHRpbm8gPSBGSUxFX0lOTztcbitcdGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgTElOS19OQU1FKSlcbitcdFx0aW5vID0gTElOS19JTk87XG4rXHRlbHNlXG4rXHRcdGlubyA9IDA7XG4rXG4rXHRpZiAoIWlubykge1xuK1x0XHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbitcdG1lbXNldChcdTAwMjZlLCAwLCBzaXplb2YoZSkpO1xuK1x0ZS5pbm8gPSBpbm87XG4rXHRlLmF0dHJfdGltZW91dCA9IDA7XG4rXHRlLmVudHJ5X3RpbWVvdXQgPSAwO1xuK1x0ZmlsbF9hdHRyKGlubywgXHUwMDI2ZS5hdHRyKTtcbitcdGZ1c2VfcmVwbHlfZW50cnkocmVxLCBcdTAwMjZlKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdF9nZXRhdHRyKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubyxcbitcdFx0ICAgICAgc3RydWN0IGZ1c2VfZmlsZV9pbmZvICpmaSlcbit7XG4rXHRzdHJ1Y3Qgc3RhdCBzdDtcbitcbitcdCh2b2lkKWZpO1xuK1x0LyogVGhlIHJvb3QgaXMgbGVmdCBhbG9uZTsgcmVmdXNpbmcgaXQgd291bGQgYnJlYWsgdGhlIG1vdW50IGl0c2VsZi4gKi9cbitcdGlmIChpbm8gPT0gRklMRV9JTk8pIHtcbitcdFx0Z19kcy5nZXRhdHRyc19zZWVuKys7XG4rXHRcdGlmIChyZWZ1c2Vfbm93KFJFRlVTRV9HRVRBVFRSKSkge1xuK1x0XHRcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTtcbitcdFx0XHRyZXR1cm47XG4rXHRcdH1cbitcdH1cbitcdGZpbGxfYXR0cihpbm8sIFx1MDAyNnN0KTtcbitcdGZ1c2VfcmVwbHlfYXR0cihyZXEsIFx1MDAyNnN0LCAwKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdF9vcGVuKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubywgc3RydWN0IGZ1c2VfZmlsZV9pbmZvICpmaSlcbit7XG4rXHRpZiAoaW5vICE9IEZJTEVfSU5PKSB7XG4rXHRcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuK1x0Z19kcy5vcGVuc19zZWVuKys7XG4rXHRpZiAocmVmdXNlX25vdyhSRUZVU0VfT1BFTikpIHtcbitcdFx0LypcbitcdFx0ICogVGhlIGlub2RlIGlzIGdvbmUgYXMgZmFyIGFzIHRoaXMgc2VydmVyIGlzIGNvbmNlcm5lZCwgZXZlblxuK1x0XHQgKiB0aG91Z2ggdGhlIGNsaWVudCBpcyBob2xkaW5nIGEgcmVmZXJlbmNlIHRvIGl0IGFuZCBhc2tlZCBieVxuK1x0XHQgKiBub2RlaWQgcmF0aGVyIHRoYW4gYnkgbmFtZS5cbitcdFx0ICovXG4rXHRcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1x0ZnVzZV9yZXBseV9vcGVuKHJlcSwgZmkpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0X3JlYWQoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgaW5vLCBzaXplX3Qgc2l6ZSwgb2ZmX3Qgb2ZmLFxuK1x0XHQgICBzdHJ1Y3QgZnVzZV9maWxlX2luZm8gKmZpKVxuK3tcbitcdHNpemVfdCBsZW4gPSBzaXplb2YoQ09OVEVOVFMpIC0gMTtcbitcbitcdCh2b2lkKWZpO1xuK1x0aWYgKGlubyAhPSBGSUxFX0lOTykge1xuK1x0XHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdGlmICgoc2l6ZV90KW9mZiBcdTAwM2U9IGxlbikge1xuK1x0XHRmdXNlX3JlcGx5X2J1ZihyZXEsIE5VTEwsIDApO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXHRpZiAob2ZmICsgc2l6ZSBcdTAwM2UgbGVuKVxuK1x0XHRzaXplID0gbGVuIC0gb2ZmO1xuK1x0ZnVzZV9yZXBseV9idWYocmVxLCBDT05URU5UUyArIG9mZiwgc2l6ZSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRfc2V0YXR0cihmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8sIHN0cnVjdCBzdGF0ICphdHRyLFxuK1x0XHQgICAgICBpbnQgdG9fc2V0LCBzdHJ1Y3QgZnVzZV9maWxlX2luZm8gKmZpKVxuK3tcbitcdHN0cnVjdCBzdGF0IHN0O1xuK1xuK1x0KHZvaWQpYXR0cjtcbitcdCh2b2lkKXRvX3NldDtcbitcdCh2b2lkKWZpO1xuK1x0aWYgKGlubyA9PSBGSUxFX0lOTykge1xuK1x0XHRnX2RzLnNldGF0dHJzX3NlZW4rKztcbitcdFx0aWYgKHJlZnVzZV9ub3coUkVGVVNFX1NFVEFUVFIpKSB7XG4rXHRcdFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpO1xuK1x0XHRcdHJldHVybjtcbitcdFx0fVxuK1x0fVxuK1x0ZmlsbF9hdHRyKGlubywgXHUwMDI2c3QpO1xuK1x0ZnVzZV9yZXBseV9hdHRyKHJlcSwgXHUwMDI2c3QsIDApO1xuK31cbitcbitzdGF0aWMgdm9pZCB0X3JlYWRsaW5rKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubylcbit7XG4rXHRpZiAoaW5vICE9IExJTktfSU5PKSB7XG4rXHRcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRUlOVkFMKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuK1x0Z19kcy5yZWFkbGlua3Nfc2VlbisrO1xuK1x0aWYgKHJlZnVzZV9ub3coUkVGVVNFX1JFQURMSU5LKSkge1xuK1x0XHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdGZ1c2VfcmVwbHlfcmVhZGxpbmsocmVxLCBMSU5LX1RBUkdFVCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRfc3RhdGZzKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubylcbit7XG4rXHRzdHJ1Y3Qgc3RhdHZmcyBzZnM7XG4rXG4rXHQodm9pZClpbm87XG4rXHRnX2RzLnN0YXRmc3Nfc2VlbisrO1xuK1x0aWYgKHJlZnVzZV9ub3coUkVGVVNFX1NUQVRGUykpIHtcbitcdFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRtZW1zZXQoXHUwMDI2c2ZzLCAwLCBzaXplb2Yoc2ZzKSk7XG4rXHRzZnMuZl9ic2l6ZSA9IDUxMjtcbitcdHNmcy5mX2Zyc2l6ZSA9IDUxMjtcbitcdHNmcy5mX25hbWVtYXggPSBOQU1FX01BWDtcbitcdGZ1c2VfcmVwbHlfc3RhdGZzKHJlcSwgXHUwMDI2c2ZzKTtcbit9XG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBmdXNlX2xvd2xldmVsX29wcyBmc19vcHMgPSB7XG4rXHQubG9va3VwXHRcdD0gdF9sb29rdXAsXG4rXHQuZ2V0YXR0clx0PSB0X2dldGF0dHIsXG4rXHQuc2V0YXR0clx0PSB0X3NldGF0dHIsXG4rXHQucmVhZGxpbmtcdD0gdF9yZWFkbGluayxcbitcdC5zdGF0ZnNcdFx0PSB0X3N0YXRmcyxcbitcdC5vcGVuXHRcdD0gdF9vcGVuLFxuK1x0LnJlYWRcdFx0PSB0X3JlYWQsXG4rfTtcbitcbitzdGF0aWMgdm9pZCAqcnVuX2RhZW1vbih2b2lkICphcmcpXG4re1xuK1x0ZnVzZV9zZXNzaW9uX2xvb3AoKHN0cnVjdCBmdXNlX3Nlc3Npb24gKilhcmcpO1xuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuKy8qIC0tLS0ga3NlbGZ0ZXN0IGhhcm5lc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4rXG4rRklYVFVSRShvcGVuX2VzdGFsZSkge1xuK1x0c3RydWN0IGZ1c2Vfc2Vzc2lvbiAqc2U7XG4rXHRjaGFyICAgICAgICAgICAgICAgICBtb3VudHBvaW50W1BBVEhfTUFYXTtcbitcdGNoYXIgICAgICAgICAgICAgICAgIGZpbGVfcGF0aFtQQVRIX01BWF07XG4rXHRjaGFyICAgICAgICAgICAgICAgICBsaW5rX3BhdGhbUEFUSF9NQVhdO1xuK1x0Y2hhciAgICAgICAgICAgICAgICAgYWJzZW50X3BhdGhbUEFUSF9NQVhdO1xuK1x0cHRocmVhZF90ICAgICAgICAgICAgdGhyZWFkO1xuK307XG4rXG4rRklYVFVSRV9TRVRVUChvcGVuX2VzdGFsZSlcbit7XG4rXHRjaGFyICpmdXNlX2FyZ3ZbXSA9IHsgXCJmdXNlX2VzdGFsZV90ZXN0XCIsIE5VTEwgfTtcbitcdHN0cnVjdCBmdXNlX2FyZ3MgYXJncyA9IEZVU0VfQVJHU19JTklUKDEsIGZ1c2VfYXJndik7XG4rXG4rXHRtZW1zZXQoXHUwMDI2Z19kcywgMCwgc2l6ZW9mKGdfZHMpKTtcbitcdGdfZHMud2hhdCA9IFJFRlVTRV9OT1RISU5HO1xuK1x0Z19kcy5yZWZ1c2Fsc19sZWZ0ID0gMTtcbitcbitcdHN0cmNweShzZWxmLVx1MDAzZW1vdW50cG9pbnQsIFwiL3RtcC9vcGVuX2VzdGFsZV90ZXN0X1hYWFhYWFwiKTtcbitcdGlmICghbWtkdGVtcChzZWxmLVx1MDAzZW1vdW50cG9pbnQpKVxuK1x0XHRTS0lQKHJldHVybiwgXCJta2R0ZW1wOiAlc1wiLCBzdHJlcnJvcihlcnJubykpO1xuK1xuK1x0c25wcmludGYoc2VsZi1cdTAwM2VmaWxlX3BhdGgsIHNpemVvZihzZWxmLVx1MDAzZWZpbGVfcGF0aCksXG4rXHRcdCBcIiVzL1wiIEZJTEVfTkFNRSwgc2VsZi1cdTAwM2Vtb3VudHBvaW50KTtcbitcdHNucHJpbnRmKHNlbGYtXHUwMDNlbGlua19wYXRoLCBzaXplb2Yoc2VsZi1cdTAwM2VsaW5rX3BhdGgpLFxuK1x0XHQgXCIlcy9cIiBMSU5LX05BTUUsIHNlbGYtXHUwMDNlbW91bnRwb2ludCk7XG4rXHRzbnByaW50ZihzZWxmLVx1MDAzZWFic2VudF9wYXRoLCBzaXplb2Yoc2VsZi1cdTAwM2VhYnNlbnRfcGF0aCksXG4rXHRcdCBcIiVzL1wiIEFCU0VOVF9OQU1FLCBzZWxmLVx1MDAzZW1vdW50cG9pbnQpO1xuK1xuK1x0c2VsZi1cdTAwM2VzZSA9IGZ1c2Vfc2Vzc2lvbl9uZXcoXHUwMDI2YXJncywgXHUwMDI2ZnNfb3BzLCBzaXplb2YoZnNfb3BzKSwgTlVMTCk7XG4rXHRpZiAoIXNlbGYtXHUwMDNlc2UpIHtcbitcdFx0cm1kaXIoc2VsZi1cdTAwM2Vtb3VudHBvaW50KTtcbitcdFx0U0tJUChyZXR1cm4sIFwiZnVzZV9zZXNzaW9uX25ldyBmYWlsZWRcIik7XG4rXHR9XG4rXG4rXHRpZiAoZnVzZV9zZXNzaW9uX21vdW50KHNlbGYtXHUwMDNlc2UsIHNlbGYtXHUwMDNlbW91bnRwb2ludCkpIHtcbitcdFx0ZnVzZV9zZXNzaW9uX2Rlc3Ryb3koc2VsZi1cdTAwM2VzZSk7XG4rXHRcdHJtZGlyKHNlbGYtXHUwMDNlbW91bnRwb2ludCk7XG4rXHRcdFNLSVAocmV0dXJuLCBcImZ1c2Vfc2Vzc2lvbl9tb3VudCBmYWlsZWQgKG5vIGZ1c2VybW91bnQzIG9yIG5vIHByaXZpbGVnZXMpXCIpO1xuK1x0fVxuK1xuK1x0aWYgKHB0aHJlYWRfY3JlYXRlKFx1MDAyNnNlbGYtXHUwMDNldGhyZWFkLCBOVUxMLCBydW5fZGFlbW9uLCBzZWxmLVx1MDAzZXNlKSkge1xuK1x0XHRmdXNlX3Nlc3Npb25fdW5tb3VudChzZWxmLVx1MDAzZXNlKTtcbitcdFx0ZnVzZV9zZXNzaW9uX2Rlc3Ryb3koc2VsZi1cdTAwM2VzZSk7XG4rXHRcdHJtZGlyKHNlbGYtXHUwMDNlbW91bnRwb2ludCk7XG4rXHRcdFNLSVAocmV0dXJuLCBcInB0aHJlYWRfY3JlYXRlOiAlc1wiLCBzdHJlcnJvcihlcnJubykpO1xuK1x0fVxuK1xuK1x0ZnVzZV9vcHRfZnJlZV9hcmdzKFx1MDAyNmFyZ3MpO1xuK31cbitcbitGSVhUVVJFX1RFQVJET1dOKG9wZW5fZXN0YWxlKVxuK3tcbitcdGZ1c2Vfc2Vzc2lvbl9leGl0KHNlbGYtXHUwMDNlc2UpO1xuK1x0ZnVzZV9zZXNzaW9uX3VubW91bnQoc2VsZi1cdTAwM2VzZSk7XG4rXHRwdGhyZWFkX2pvaW4oc2VsZi1cdTAwM2V0aHJlYWQsIE5VTEwpO1xuK1x0ZnVzZV9zZXNzaW9uX2Rlc3Ryb3koc2VsZi1cdTAwM2VzZSk7XG4rXHRybWRpcihzZWxmLVx1MDAzZW1vdW50cG9pbnQpO1xuK31cbitcbitURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfb3Blbl9pc19yZXRyaWVkKVxuK3tcbitcdGludCBmZDtcbitcbitcdGdfZHMud2hhdCA9IFJFRlVTRV9PUEVOO1xuK1xuK1x0ZmQgPSBvcGVuKHNlbGYtXHUwMDNlZmlsZV9wYXRoLCBPX1JET05MWSk7XG4rXG4rXHQvKlxuK1x0ICogVGhlIHJlZnVzYWwgZGVzY3JpYmVzIGEgaGFuZGxlIHRoZSBzZXJ2ZXIgc2hvdWxkIGhhdmUgaG9ub3VyZWQsIHNvXG4rXHQgKiB0aGUgd2FsayBpcyBlbnRpdGxlZCB0byByZXNvbHZlIHRoZSBuYW1lIGFnYWluIGFuZCBvcGVuIHdoYXQgaXRcbitcdCAqIHJlZmVycyB0byBub3cuIFJlcG9ydGluZyB0aGUgZmlsZSBtaXNzaW5nIGluc3RlYWQgZW5kcyB0aGUgd2Fsay5cbitcdCAqL1xuK1x0QVNTRVJUX0dFKGZkLCAwKSB7XG4rXHRcdFRIX0xPRyhcIm9wZW4gZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgb3BlbiByZXF1ZXN0KHMpXCIsXG4rXHRcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMub3BlbnNfc2Vlbik7XG4rXHR9XG4rXHRFWFBFQ1RfRVEoMiwgZ19kcy5vcGVuc19zZWVuKTtcbitcdGNsb3NlKGZkKTtcbit9XG4rXG4rVEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX2dldGF0dHJfb25fcGF0aF9pc19yZXRyaWVkKVxuK3tcbitcdHN0cnVjdCBzdGF0IHN0O1xuK1xuK1x0Z19kcy53aGF0ID0gUkVGVVNFX0dFVEFUVFI7XG4rXG4rXHQvKlxuK1x0ICogUmVhY2hlZCBieSBuYW1lLCBzbyB0aGUgd2FsayBjYW4gcmVzb2x2ZSBpdCBhZ2FpbiBhbmQgYXNrIGEgc2Vjb25kXG4rXHQgKiB0aW1lLCB0aGUgc2FtZSByZWNvdmVyeSB0aGUgb3BlbiBnZXRzLlxuK1x0ICovXG4rXHRBU1NFUlRfRVEoMCwgc3RhdChzZWxmLVx1MDAzZWZpbGVfcGF0aCwgXHUwMDI2c3QpKSB7XG4rXHRcdFRIX0xPRyhcInN0YXQgZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgZ2V0YXR0ciByZXF1ZXN0KHMpXCIsXG4rXHRcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMuZ2V0YXR0cnNfc2Vlbik7XG4rXHR9XG4rXHRFWFBFQ1RfR1QoZ19kcy5nZXRhdHRyc19zZWVuLCAxKTtcbit9XG4rXG4rVEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX3NldGF0dHJfb25fcGF0aF9pc19yZXRyaWVkKVxuK3tcbitcdGdfZHMud2hhdCA9IFJFRlVTRV9TRVRBVFRSO1xuK1xuK1x0LypcbitcdCAqIGNobW9kKCkgcmVhY2hlcyB0aGUgaW5vZGUgYnkgbmFtZSwgc28gdGhlIHNhbWUgcmV0cnkgYXBwbGllczogdGhlXG4rXHQgKiByZWZ1c2FsIGRlc2NyaWJlcyBhIGhhbmRsZSBhbmQgdGhlIHdhbGsgbWF5IHJlc29sdmUgdGhlIG5hbWUgYWdhaW4uXG4rXHQgKi9cbitcdEFTU0VSVF9FUSgwLCBjaG1vZChzZWxmLVx1MDAzZWZpbGVfcGF0aCwgMDYwMCkpIHtcbitcdFx0VEhfTE9HKFwiY2htb2QgZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgc2V0YXR0ciByZXF1ZXN0KHMpXCIsXG4rXHRcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMuc2V0YXR0cnNfc2Vlbik7XG4rXHR9XG4rXHRFWFBFQ1RfR1QoZ19kcy5zZXRhdHRyc19zZWVuLCAxKTtcbit9XG4rXG4rVEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX3JlYWRsaW5rX29uX3BhdGhfaXNfcmV0cmllZClcbit7XG4rXHRjaGFyIGJ1ZltQQVRIX01BWF07XG4rXHRzc2l6ZV90IG47XG4rXG4rXHRnX2RzLndoYXQgPSBSRUZVU0VfUkVBRExJTks7XG4rXG4rXHRuID0gcmVhZGxpbmsoc2VsZi1cdTAwM2VsaW5rX3BhdGgsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKTtcbitcdEFTU0VSVF9HRShuLCAwKSB7XG4rXHRcdFRIX0xPRyhcInJlYWRsaW5rIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHJlYWRsaW5rIHJlcXVlc3QocylcIixcbitcdFx0ICAgICAgIHN0cmVycm9yKGVycm5vKSwgZ19kcy5yZWFkbGlua3Nfc2Vlbik7XG4rXHR9XG4rXHRidWZbbl0gPSAnXFwwJztcbitcdEVYUEVDVF9TVFJFUShMSU5LX1RBUkdFVCwgYnVmKTtcbitcdEVYUEVDVF9HVChnX2RzLnJlYWRsaW5rc19zZWVuLCAxKTtcbit9XG4rXG4rVEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX3N0YXRmc19vbl9wYXRoX2lzX3JldHJpZWQpXG4re1xuK1x0c3RydWN0IHN0YXRmcyBzZnM7XG4rXG4rXHRnX2RzLndoYXQgPSBSRUZVU0VfU1RBVEZTO1xuK1xuK1x0LypcbitcdCAqIHN0YXRmcygpIGRlc2NyaWJlcyB0aGUgbW91bnQgcmF0aGVyIHRoYW4gdGhlIGZpbGUsIGJ1dCBpdCBpcyBzdGlsbFxuK1x0ICogcmVhY2hlZCB0aHJvdWdoIGEgcGF0aCB3YWxrLCBzbyBhIHJlZnVzYWwgdGhhdCBuYW1lcyBhIGhhbmRsZSBpc1xuK1x0ICogcmV0cmllZCB0aGUgc2FtZSB3YXkuXG4rXHQgKi9cbitcdEFTU0VSVF9FUSgwLCBzdGF0ZnMoc2VsZi1cdTAwM2VmaWxlX3BhdGgsIFx1MDAyNnNmcykpIHtcbitcdFx0VEhfTE9HKFwic3RhdGZzIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHN0YXRmcyByZXF1ZXN0KHMpXCIsXG4rXHRcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMuc3RhdGZzc19zZWVuKTtcbitcdH1cbitcdEVYUEVDVF9HVChnX2RzLnN0YXRmc3Nfc2VlbiwgMSk7XG4rfVxuK1xuK1RFU1RfRihvcGVuX2VzdGFsZSwgYWJzZW50X25hbWVfc3RpbGxfcmVwb3J0c19hYnNlbnQpXG4re1xuK1x0aW50IGZkO1xuK1xuK1x0LypcbitcdCAqIEhlcmUgaXQgaXMgdGhlIGxvb2t1cCB0aGF0IGZhaWxzIHJhdGhlciB0aGFuIHRoZSBvcGVuLCBzbyBub3RoaW5nIGlzXG4rXHQgKiBiZWluZyBkZXNjcmliZWQgYXMgc3RhbGUgYW5kIHRoZSBjYWxsZXIgbXVzdCBzdGlsbCBiZSB0b2xkIHRoZSBuYW1lXG4rXHQgKiBpcyBub3QgdGhlcmUuXG4rXHQgKi9cbitcdGZkID0gb3BlbihzZWxmLVx1MDAzZWFic2VudF9wYXRoLCBPX1JET05MWSk7XG4rXHRBU1NFUlRfTFQoZmQsIDApO1xuK1x0RVhQRUNUX0VRKEVOT0VOVCwgZXJybm8pO1xuK31cbitcbitURVNUX0hBUk5FU1NfTUFJTlxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMDA6MDU6MzIuMzI5Mzg3MjE4WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NzMzNzgxOTMwMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhpcyBQYXRjaCBTZXJpZXMgZm9yIEZ1enppbmcgUG90ZW50aWFsKipcblxuT2theSwgc28gdGhlIHRhc2sgYXQgaGFuZCBpcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBMaW51eCBrZXJuZWwgcGF0Y2ggc2VyaWVzIG1lcml0cyBmdXp6aW5nIGF0dGVudGlvbi4gQW5kIGlmIGl0IGRvZXMsIHRoZSBuZXh0IHN0ZXAgaXMgdG8gcGlucG9pbnQgdGhlIGNydWNpYWwgYEZvY3VzU3ltYm9sc2AgYW5kIGBFbmFibGVDb25maWdzYCB0aGF0IHdpbGwgbWFrZSBmdXp6aW5nIG1vc3QgZWZmZWN0aXZlLiBMZXQncyBkaWcgaW4uIFRoZSBpbml0aWFsIGdsYW5jZSBhdCB0aGUgcGF0Y2ggcmV2ZWFscyBpdHMgc2NvcGU6IGl0J3MgcGxheWluZyBpbiB0aGUgYGZzL2Z1c2VgIGRpcmVjdG9yeSwgdG91Y2hpbmcgYGRpci5jYCwgYGZpbGUuY2AsIGBmdXNlX2kuaGAsIGBpbm9kZS5jYCwgYW5kIGB2aXJ0aW9fZnMuY2AsIHBsdXMgYSBjaHVuayBvZiB0aGUgc2VsZi10ZXN0cyBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uLi5gLiBUaGlzIHRlbGxzIG1lIHdlJ3JlIGxvb2tpbmcgYXQgcG90ZW50aWFsbHkgc2Vuc2l0aXZlIGZpbGVzeXN0ZW0gaW50ZXJhY3Rpb25zIHdpdGhpbiB0aGUgRlVTRSAoRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UpIGNvbnRleHQsIHdoaWNoIGlzIGRlZmluaXRlbHkgc29tZXRoaW5nIEkgd2FudCB0byB0YWtlIGEgY2xvc2VyIGxvb2sgYXQuXG5cbk5vdywgaXQncyB0aW1lIHRvIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzOiBJJ2xsIHN0YXJ0IGJ5IGV4YW1pbmluZyB0aGUgcmVsZXZhbnQgYEtjb25maWdgIGZpbGVzLiBUaGF0J3MgdGhlIGdvLXRvIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBkZXBlbmRlbmNpZXMgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhdCBwbGF5LiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byB1c2UgbXkgZ3JlcHBlciBvciBwZXJoYXBzIGEgcXVpY2sgYHJlYWQtZmlsZWAgdG8gZ2V0IGEgaGFuZGxlIG9uIHdoYXQncyBhdmFpbGFibGUgYW5kIGNvbmRpdGlvbmFsIG9uIHRoaXMgc2VjdGlvbiBvZiBjb2RlLiBUaGUgYWltIGlzIHRvIHVuZGVyc3RhbmQgd2hhdCBidWlsZCBmbGFncyBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSByZWxldmFudCBhbmQgaG93IHRoZXkgbWlnaHQgaW5mbHVlbmNlIHRoZSBhdHRhY2sgc3VyZmFjZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAxMzIsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNDcsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQwMDowNTozOS42NjcyMDg3OVoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NDcxMjEyNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJGVVNFX0ZTXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2Z1c2VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZnVzZS9LY29uZmlnLTEtIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuZnMvZnVzZS9LY29uZmlnOjI6Y29uZmlnIEZVU0VfRlNcXG5mcy9mdXNlL0tjb25maWctMy1cXHR0cmlzdGF0ZSBcXFwiRlVTRSAoRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UpIHN1cHBvcnRcXFwiXFxuLS1cXG5mcy9mdXNlL0tjb25maWc9MjI9Y29uZmlnIENVU0VcXG5mcy9mdXNlL0tjb25maWctMjMtXFx0dHJpc3RhdGUgXFxcIkNoYXJhY3RlciBkZXZpY2UgaW4gVXNlcnNwYWNlIHN1cHBvcnRcXFwiXFxuZnMvZnVzZS9LY29uZmlnOjI0OlxcdGRlcGVuZHMgb24gRlVTRV9GU1xcbmZzL2Z1c2UvS2NvbmZpZy0yNS1cXHRoZWxwXFxuLS1cXG5mcy9mdXNlL0tjb25maWc9MzI9Y29uZmlnIFZJUlRJT19GU1xcbmZzL2Z1c2UvS2NvbmZpZy0zMy1cXHR0cmlzdGF0ZSBcXFwiVmlydGlvIEZpbGVzeXN0ZW1cXFwiXFxuZnMvZnVzZS9LY29uZmlnOjM0OlxcdGRlcGVuZHMgb24gRlVTRV9GU1xcbmZzL2Z1c2UvS2NvbmZpZy0zNS1cXHRzZWxlY3QgVklSVElPXFxuLS1cXG5mcy9mdXNlL0tjb25maWc9NTc9Y29uZmlnIEZVU0VfUEFTU1RIUk9VR0hcXG4tLVxcbmZzL2Z1c2UvS2NvbmZpZy01OS1cXHRkZWZhdWx0IHlcXG5mcy9mdXNlL0tjb25maWc6NjA6XFx0ZGVwZW5kcyBvbiBGVVNFX0ZTXFxuZnMvZnVzZS9LY29uZmlnLTYxLVxcdHNlbGVjdCBGU19TVEFDS1xcbi0tXFxuZnMvZnVzZS9LY29uZmlnPTY4PWNvbmZpZyBGVVNFX0lPX1VSSU5HXFxuLS1cXG5mcy9mdXNlL0tjb25maWctNzAtXFx0ZGVmYXVsdCB5XFxuZnMvZnVzZS9LY29uZmlnOjcxOlxcdGRlcGVuZHMgb24gRlVTRV9GU1xcbmZzL2Z1c2UvS2NvbmZpZy03Mi1cXHRkZXBlbmRzIG9uIElPX1VSSU5HXFxuLS1cXG5mcy9mdXNlL01ha2VmaWxlPTc9Y2NmbGFncy15ID0gLUkkKHNyYylcXG5mcy9mdXNlL01ha2VmaWxlLTgtXFxuZnMvZnVzZS9NYWtlZmlsZTo5Om9iai0kKENPTkZJR19GVVNFX0ZTKSArPSBmdXNlLm9cXG5mcy9mdXNlL01ha2VmaWxlLTEwLW9iai0kKENPTkZJR19DVVNFKSArPSBjdXNlLm9cXG4tLVxcbmZzL2Z1c2UvZGlyLmM9MTk0Nj1zdGF0aWMgaW50IGZ1c2VfZGlyX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsXFxuLS1cXG5mcy9mdXNlL2Rpci5jLTE5NTktXFx0aW5vZGVfbG9jayhpbm9kZSk7XFxuZnMvZnVzZS9kaXIuYzoxOTYwOlxcdGVyciA9IGZ1c2VfZnN5bmNfY29tbW9uKGZpbGUsIHN0YXJ0LCBlbmQsIGRhdGFzeW5jLCBGVVNFX0ZTWU5DRElSKTtcXG5mcy9mdXNlL2Rpci5jLTE5NjEtXFx0aWYgKGVyciA9PSAtRU5PU1lTKSB7XFxuLS1cXG5mcy9mdXNlL2ZpbGUuYz01MzE9aW50IGZ1c2VfZnN5bmNfY29tbW9uKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsXFxuLS1cXG5mcy9mdXNlL2ZpbGUuYy01NDEtXFx0aW5hcmcuZmggPSBmZi1cXHUwMDNlZmg7XFxuZnMvZnVzZS9maWxlLmM6NTQyOlxcdGluYXJnLmZzeW5jX2ZsYWdzID0gZGF0YXN5bmMgPyBGVVNFX0ZTWU5DX0ZEQVRBU1lOQyA6IDA7XFxuZnMvZnVzZS9maWxlLmMtNTQzLVxcdGFyZ3Mub3Bjb2RlID0gb3Bjb2RlO1xcbi0tXFxuZnMvZnVzZS9maWxlLmM9NTUxPXN0YXRpYyBpbnQgZnVzZV9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLFxcbi0tXFxuZnMvZnVzZS9maWxlLmMtNTg5LVxcbmZzL2Z1c2UvZmlsZS5jOjU5MDpcXHRlcnIgPSBmdXNlX2ZzeW5jX2NvbW1vbihmaWxlLCBzdGFydCwgZW5kLCBkYXRhc3luYywgRlVTRV9GU1lOQyk7XFxuZnMvZnVzZS9maWxlLmMtNTkxLVxcdGlmIChlcnIgPT0gLUVOT1NZUykge1xcbi0tXFxuZnMvZnVzZS9mdXNlX3RyYWNlLmgtMjctXFx0RU0oIEZVU0VfUkVMRUFTRSxcXHRcXHRcXFwiRlVTRV9SRUxFQVNFXFxcIilcXHRcXHRcXFxcXFxuZnMvZnVzZS9mdXNlX3RyYWNlLmg6Mjg6XFx0RU0oIEZVU0VfRlNZTkMsXFx0XFx0XFx0XFxcIkZVU0VfRlNZTkNcXFwiKVxcdFxcdFxcXFxcXG5mcy9mdXNlL2Z1c2VfdHJhY2UuaC0yOS1cXHRFTSggRlVTRV9TRVRYQVRUUixcXHRcXHRcXFwiRlVTRV9TRVRYQVRUUlxcXCIpXFx0XFxcXFxcbi0tXFxuZnMvZnVzZS9mdXNlX3RyYWNlLmgtMzctXFx0RU0oIEZVU0VfUkVMRUFTRURJUixcXHRcXHRcXFwiRlVTRV9SRUxFQVNFRElSXFxcIilcXHRcXFxcXFxuZnMvZnVzZS9mdXNlX3RyYWNlLmg6Mzg6XFx0RU0oIEZVU0VfRlNZTkNESVIsXFx0XFx0XFxcIkZVU0VfRlNZTkNESVJcXFwiKVxcdFxcXFxcXG5mcy9mdXNlL2Z1c2VfdHJhY2UuaC0zOS1cXHRFTSggRlVTRV9HRVRMSyxcXHRcXHRcXHRcXFwiRlVTRV9HRVRMS1xcXCIpXFx0XFx0XFxcXFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQwMDowNTozOS43MTE5MjQ3MjdaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo1MDc4Mjk4NTA3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byB0aGUgRlVTRSBLZXJuZWwgTW9kdWxlIENvbmZpZ3VyYXRpb24qKlxuXG5SaWdodCwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIExldCdzIHNlZSB3aGF0J3MgYWN0dWFsbHkgZ29pbmcgb24gd2l0aCB0aGUgRlVTRSBrZXJuZWwgbW9kdWxlIGJ1aWxkIGFuZCBjb25maWd1cmF0aW9uLiBNeSBpbml0aWFsIHN0ZXAgaXMgYWx3YXlzIHRvIGdvIHN0cmFpZ2h0IHRvIHRoZSBzb3VyY2UuIEknbSB0aGlua2luZyBJJ2xsIHN0YXJ0IGJ5IGNoZWNraW5nIHRoZSBgZnMvZnVzZS9LY29uZmlnYCBmaWxlLiBUaGF0J3Mgd2hlcmUgYWxsIHRoZSBidWlsZC10aW1lIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgRlVTRSBzaG91bGQgYmUgZGVmaW5lZCDigJMgdGhpbmdzIGxpa2Ugd2hldGhlciBpdCdzIGJ1aWx0LWluLCBhIG1vZHVsZSwgZmVhdHVyZXMgdG8gZW5hYmxlIG9yIGRpc2FibGUsIGFuZCBzbyBvbi4gVW5kZXJzdGFuZGluZyB0aGUgS2NvbmZpZyBvcHRpb25zIGlzIGZ1bmRhbWVudGFsIHRvIGNvbmZpZ3VyaW5nIHRoZSBGVVNFIG1vZHVsZSBhcHByb3ByaWF0ZWx5IGZvciBhIHNwZWNpZmljIGVudmlyb25tZW50IG9yIHVzZSBjYXNlLiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGljaCBvcHRpb25zIGFyZSBhdmFpbGFibGUgYW5kIHdoYXQgdGhleSdyZSBzZXQgdG8uIFRoZW4sIHdpdGggdGhhdCB1bmRlcnN0YW5kaW5nLCBJJ2xsIG1vdmUgb24gdG8gYGZzL2Z1c2UvTWFrZWZpbGVgLiBUaGUgTWFrZWZpbGUgd2lsbCBzaG93IG1lIHRoZSBidWlsZCBwcm9jZXNzIGl0c2VsZjogdGhlIGRlcGVuZGVuY2llcywgdGhlIHNvdXJjZSBmaWxlcyBpbmNsdWRlZCwgY29tcGlsZXIgZmxhZ3MsIGFuZCB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgb2YgaG93IEZVU0UgaXMgY29tcGlsZWQgYW5kIGxpbmtlZCBpbnRvIHRoZSBrZXJuZWwuIEJ5IGV4YW1pbmluZyBib3RoIG9mIHRoZXNlIGZpbGVzLCBJIHNob3VsZCBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIGhvdyBGVVNFIGlzIGludGVuZGVkIHRvIGJlIHVzZWQsIGl0cyBjb21waWxhdGlvbiBwcm9jZXNzLCBhbmQgdGhlIGZsZXhpYmlsaXR5IG9mZmVyZWQgdG8gYW4gZW5kLXVzZXIgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTYxNiwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDAwOjA1OjQ0Ljc5MDIyNTI0NFoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjcxMzg5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2Z1c2UvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiA3NVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbiAgIDI6XFx0Y29uZmlnIEZVU0VfRlNcXG4gICAzOlxcdFxcdHRyaXN0YXRlIFxcXCJGVVNFIChGaWxlc3lzdGVtIGluIFVzZXJzcGFjZSkgc3VwcG9ydFxcXCJcXG4gICA0OlxcdFxcdHNlbGVjdCBGU19QT1NJWF9BQ0xcXG4gICA1OlxcdFxcdHNlbGVjdCBGU19JT01BUFxcbiAgIDY6XFx0XFx0aGVscFxcbiAgIDc6XFx0XFx0ICBXaXRoIEZVU0UgaXQgaXMgcG9zc2libGUgdG8gaW1wbGVtZW50IGEgZnVsbHkgZnVuY3Rpb25hbCBmaWxlc3lzdGVtXFxuICAgODpcXHRcXHQgIGluIGEgdXNlcnNwYWNlIHByb2dyYW0uXFxuICAgOTpcXHRcXG4gIDEwOlxcdFxcdCAgVGhlcmUncyBhbHNvIGEgY29tcGFuaW9uIGxpYnJhcnk6IGxpYmZ1c2UyLiAgVGhpcyBsaWJyYXJ5IGlzIGF2YWlsYWJsZVxcbiAgMTE6XFx0XFx0ICBmcm9tIHRoZSBGVVNFIGhvbWVwYWdlOlxcbiAgMTI6XFx0XFx0ICBcXHUwMDNjaHR0cHM6Ly9naXRodWIuY29tL2xpYmZ1c2UvXFx1MDAzZVxcbiAgMTM6XFx0XFx0ICBhbHRob3VnaCBjaGFuY2VzIGFyZSB5b3VyIGRpc3RyaWJ1dGlvbiBhbHJlYWR5IGhhcyB0aGF0IGxpYnJhcnlcXG4gIDE0OlxcdFxcdCAgaW5zdGFsbGVkIGlmIHlvdSd2ZSBpbnN0YWxsZWQgdGhlIFxcXCJmdXNlXFxcIiBwYWNrYWdlIGl0c2VsZi5cXG4gIDE1OlxcdFxcbiAgMTY6XFx0XFx0ICBTZWUgXFx1MDAzY2ZpbGU6RG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9mdXNlL2Z1c2UucnN0XFx1MDAzZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cXG4gIDE3OlxcdFxcdCAgU2VlIFxcdTAwM2NmaWxlOkRvY3VtZW50YXRpb24vQ2hhbmdlc1xcdTAwM2UgZm9yIG5lZWRlZCBsaWJyYXJ5L3V0aWxpdHkgdmVyc2lvbi5cXG4gIDE4OlxcdFxcbiAgMTk6XFx0XFx0ICBJZiB5b3Ugd2FudCB0byBkZXZlbG9wIGEgdXNlcnNwYWNlIEZTLCBvciBpZiB5b3Ugd2FudCB0byB1c2VcXG4gIDIwOlxcdFxcdCAgYSBmaWxlc3lzdGVtIGJhc2VkIG9uIEZVU0UsIGFuc3dlciBZIG9yIE0uXFxuICAyMTpcXHRcXG4gIDIyOlxcdGNvbmZpZyBDVVNFXFxuICAyMzpcXHRcXHR0cmlzdGF0ZSBcXFwiQ2hhcmFjdGVyIGRldmljZSBpbiBVc2Vyc3BhY2Ugc3VwcG9ydFxcXCJcXG4gIDI0OlxcdFxcdGRlcGVuZHMgb24gRlVTRV9GU1xcbiAgMjU6XFx0XFx0aGVscFxcbiAgMjY6XFx0XFx0ICBUaGlzIEZVU0UgZXh0ZW5zaW9uIGFsbG93cyBjaGFyYWN0ZXIgZGV2aWNlcyB0byBiZVxcbiAgMjc6XFx0XFx0ICBpbXBsZW1lbnRlZCBpbiB1c2Vyc3BhY2UuXFxuICAyODpcXHRcXG4gIDI5OlxcdFxcdCAgSWYgeW91IHdhbnQgdG8gZGV2ZWxvcCBvciB1c2UgYSB1c2Vyc3BhY2UgY2hhcmFjdGVyIGRldmljZVxcbiAgMzA6XFx0XFx0ICBiYXNlZCBvbiBDVVNFLCBhbnN3ZXIgWSBvciBNLlxcbiAgMzE6XFx0XFxuICAzMjpcXHRjb25maWcgVklSVElPX0ZTXFxuICAzMzpcXHRcXHR0cmlzdGF0ZSBcXFwiVmlydGlvIEZpbGVzeXN0ZW1cXFwiXFxuICAzNDpcXHRcXHRkZXBlbmRzIG9uIEZVU0VfRlNcXG4gIDM1OlxcdFxcdHNlbGVjdCBWSVJUSU9cXG4gIDM2OlxcdFxcdGhlbHBcXG4gIDM3OlxcdFxcdCAgVGhlIFZpcnRpbyBGaWxlc3lzdGVtIGFsbG93cyBndWVzdHMgdG8gbW91bnQgZmlsZSBzeXN0ZW1zIGZyb20gdGhlXFxuICAzODpcXHRcXHQgIGhvc3QuXFxuICAzOTpcXHRcXG4gIDQwOlxcdFxcdCAgSWYgeW91IHdhbnQgdG8gc2hhcmUgZmlsZXMgYmV0d2VlbiBndWVzdHMgb3Igd2l0aCB0aGUgaG9zdCwgYW5zd2VyIFlcXG4gIDQxOlxcdFxcdCAgb3IgTS5cXG4gIDQyOlxcdFxcbiAgNDM6XFx0Y29uZmlnIEZVU0VfREFYXFxuICA0NDpcXHRcXHRib29sIFxcXCJWaXJ0aW8gRmlsZXN5c3RlbSBEaXJlY3QgSG9zdCBNZW1vcnkgQWNjZXNzIHN1cHBvcnRcXFwiXFxuICA0NTpcXHRcXHRkZWZhdWx0IHlcXG4gIDQ2OlxcdFxcdHNlbGVjdCBJTlRFUlZBTF9UUkVFXFxuICA0NzpcXHRcXHRkZXBlbmRzIG9uIFZJUlRJT19GU1xcbiAgNDg6XFx0XFx0ZGVwZW5kcyBvbiBGU19EQVhcXG4gIDQ5OlxcdFxcdGRlcGVuZHMgb24gREFYXFxuICA1MDpcXHRcXHRoZWxwXFxuICA1MTpcXHRcXHQgIFRoaXMgYWxsb3dzIGJ5cGFzc2luZyBndWVzdCBwYWdlIGNhY2hlIGFuZCBhbGxvd3MgbWFwcGluZyBob3N0IHBhZ2VcXG4gIDUyOlxcdFxcdCAgY2FjaGUgZGlyZWN0bHkgaW4gZ3Vlc3QgYWRkcmVzcyBzcGFjZS5cXG4gIDUzOlxcdFxcbiAgNTQ6XFx0XFx0ICBJZiB5b3Ugd2FudCB0byBhbGxvdyBtb3VudGluZyBhIFZpcnRpbyBGaWxlc3lzdGVtIHdpdGggdGhlIFxcXCJkYXhcXFwiXFxuICA1NTpcXHRcXHQgIG9wdGlvbiwgYW5zd2VyIFkuXFxuICA1NjpcXHRcXG4gIDU3OlxcdGNvbmZpZyBGVVNFX1BBU1NUSFJPVUdIXFxuICA1ODpcXHRcXHRib29sIFxcXCJGVVNFIHBhc3N0aHJvdWdoIG9wZXJhdGlvbnMgc3VwcG9ydFxcXCJcXG4gIDU5OlxcdFxcdGRlZmF1bHQgeVxcbiAgNjA6XFx0XFx0ZGVwZW5kcyBvbiBGVVNFX0ZTXFxuICA2MTpcXHRcXHRzZWxlY3QgRlNfU1RBQ0tcXG4gIDYyOlxcdFxcdGhlbHBcXG4gIDYzOlxcdFxcdCAgVGhpcyBhbGxvd3MgYnlwYXNzaW5nIEZVU0Ugc2VydmVyIGJ5IG1hcHBpbmcgc3BlY2lmaWMgRlVTRSBvcGVyYXRpb25zXFxuICA2NDpcXHRcXHQgIHRvIGJlIHBlcmZvcm1lZCBkaXJlY3RseSBvbiBhIGJhY2tpbmcgZmlsZS5cXG4gIDY1OlxcdFxcbiAgNjY6XFx0XFx0ICBJZiB5b3Ugd2FudCB0byBhbGxvdyBwYXNzdGhyb3VnaCBvcGVyYXRpb25zLCBhbnN3ZXIgWS5cXG4gIDY3OlxcdFxcbiAgNjg6XFx0Y29uZmlnIEZVU0VfSU9fVVJJTkdcXG4gIDY5OlxcdFxcdGJvb2wgXFxcIkZVU0UgY29tbXVuaWNhdGlvbiBvdmVyIGlvLXVyaW5nXFxcIlxcbiAgNzA6XFx0XFx0ZGVmYXVsdCB5XFxuICA3MTpcXHRcXHRkZXBlbmRzIG9uIEZVU0VfRlNcXG4gIDcyOlxcdFxcdGRlcGVuZHMgb24gSU9fVVJJTkdcXG4gIDczOlxcdFxcdGhlbHBcXG4gIDc0OlxcdFxcdCAgVGhpcyBhbGxvd3Mgc2VuZGluZyBGVVNFIHJlcXVlc3RzIG92ZXIgdGhlIGlvLXVyaW5nIGludGVyZmFjZSBhbmRcXG4gIDc1OlxcdCAgICAgICAgICBhbHNvIGFkZHMgcmVxdWVzdCBjb3JlIGFmZmluaXR5LlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQwMDowNTo0NC43OTAyOTg0NjRaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxODM0NTE2MjI0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czpcblxuKipBbmFseXppbmcgdGhlIEZ1c2UgTWFrZWZpbGUgZm9yIEJ1aWxkIENvbmZpZ3VyYXRpb25zKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoZSBgZnMvZnVzZS9NYWtlZmlsZWAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBidWlsZCBwcm9jZXNzIGZvciB0aGUgRlVTRSBtb2R1bGUuIEknbSBzcGVjaWZpY2FsbHkgaW50ZXJlc3RlZCBpbiBob3cgdGhlIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYWZmZWN0IHdoaWNoIGZpbGVzIGFyZSBjb21waWxlZCBhbmQgbGlua2VkLiBJIHdhbnQgdG8gc2VlIHdoaWNoIHNvdXJjZSBmaWxlcyBnZXQgaW5jbHVkZWQgb3IgZXhjbHVkZWQgYmFzZWQgb24gZGlmZmVyZW50IGtlcm5lbCBjb25maWdzLiBUaGlzIGxldmVsIG9mIGdyYW51bGFyIHVuZGVyc3RhbmRpbmcgaXMgY3JpdGljYWwgZm9yIGRlYnVnZ2luZyBhbmQgb3B0aW1pemF0aW9uLiBBIHRob3JvdWdoIHJldmlldyBvZiB0aGUgTWFrZWZpbGUgaXMgdGhlIGJlc3Qgd2F5IHRvIGdldCB0aGF0IGJpcmQncy1leWUgdmlldyBvZiB0aGUgYnVpbGQgcHJvY2Vzcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTI5MTEsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDAwOjA1OjQ2LjYyNDgxNjQ1OVoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU3MDExLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2Z1c2UvTWFrZWZpbGVcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogMjVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4gICAyOlxcdCNcXG4gICAzOlxcdCMgTWFrZWZpbGUgZm9yIHRoZSBGVVNFIGZpbGVzeXN0ZW0uXFxuICAgNDpcXHQjXFxuICAgNTpcXHRcXG4gICA2OlxcdCMgTmVlZGVkIGZvciB0cmFjZSBldmVudHNcXG4gICA3OlxcdGNjZmxhZ3MteSA9IC1JJChzcmMpXFxuICAgODpcXHRcXG4gICA5OlxcdG9iai0kKENPTkZJR19GVVNFX0ZTKSArPSBmdXNlLm9cXG4gIDEwOlxcdG9iai0kKENPTkZJR19DVVNFKSArPSBjdXNlLm9cXG4gIDExOlxcdG9iai0kKENPTkZJR19WSVJUSU9fRlMpICs9IHZpcnRpb2ZzLm9cXG4gIDEyOlxcdFxcbiAgMTM6XFx0ZnVzZS15IDo9IHRyYWNlLm9cXHQjIHB1dCB0cmFjZS5vIGZpcnN0IHNvIHdlIHNlZSBmdHJhY2UgZXJyb3JzIHNvb25lclxcbiAgMTQ6XFx0ZnVzZS15ICs9IGRldi5vIGRpci5vIGZpbGUubyBpbm9kZS5vIGNvbnRyb2wubyB4YXR0ci5vIGFjbC5vIHJlYWRkaXIubyBpb2N0bC5vIHJlcV90aW1lb3V0Lm8gcmVxLm9cXG4gIDE1OlxcdGZ1c2UteSArPSBwb2xsLm8gbm90aWZ5Lm9cXG4gIDE2OlxcdGZ1c2UteSArPSBpb21vZGUub1xcbiAgMTc6XFx0ZnVzZS0kKENPTkZJR19GVVNFX0RBWCkgKz0gZGF4Lm9cXG4gIDE4OlxcdGZ1c2UtJChDT05GSUdfRlVTRV9QQVNTVEhST1VHSCkgKz0gcGFzc3Rocm91Z2gubyBiYWNraW5nLm9cXG4gIDE5OlxcdGZ1c2UtJChDT05GSUdfU1lTQ1RMKSArPSBzeXNjdGwub1xcbiAgMjA6XFx0ZnVzZS0kKENPTkZJR19GVVNFX0lPX1VSSU5HKSArPSBkZXZfdXJpbmcub1xcbiAgMjE6XFx0XFxuICAyMjpcXHR2aXJ0aW9mcy15IDo9IHZpcnRpb19mcy5vXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDAwOjA1OjQ2LjYyNDg3NDkzOVoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQwNjAyOTkxNzY0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgRlVTRSBQYXRjaDogQSBGdXp6aW5nIE9wcG9ydHVuaXR5KipcblxuT2theSwgbGV0J3MgYnJlYWsgZG93biB0aGlzIHBhdGNoLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCBpdCdzIGZvY3VzaW5nIG9uIGVuaGFuY2luZyBGVVNFIGFuZCB2aXJ0aW8tZnMgZXJyb3IgaGFuZGxpbmcsIHNwZWNpZmljYWxseSBjb25jZXJuaW5nIEVOT0VOVCBlcnJvcnMgd2hlbiBkZWFsaW5nIHdpdGggbGl2ZSBub2RlIElEcy4gSXQgc2VlbXMgbGlrZSB0aGUgY29yZSBpc3N1ZSBpcyBob3cgd2UncmUgaGFuZGxpbmcgc3RhbGUgaW5vZGVzLCBhaW1pbmcgdG8gcHJvdmlkZSBtb3JlIHJvYnVzdCBlcnJvciBzaWduYWxpbmcuXG5cbk15IGtleSBjb25jZXJuIGlzIGhvdyB0aGlzIGVycm9yIGhhbmRsaW5nIHBlcmNvbGF0ZXMgdXAgdGhyb3VnaCB0aGUgVkZTLiBUaGlzIHBhdGNoIGlzIG1vZGlmeWluZyBzZXZlcmFsIGtleSBhcmVhczogYGZzL2Z1c2UvZGlyLmNgLCBgZnMvZnVzZS9maWxlLmNgLCBgZnMvZnVzZS9mdXNlX2kuaGAsIGBmcy9mdXNlL2lub2RlLmNgLCBhbmQgYGZzL2Z1c2UvdmlydGlvX2ZzLmNgLiBJdCBsb29rcyBsaWtlIEVOT0VOVCBpcyBiZWluZyBjb252ZXJ0ZWQgdG8gRVNUQUxFIG9yIEVPUEVOU1RBTEUgaW4gc2V2ZXJhbCBjb250ZXh0czogYGZ1c2VfZG9fZ2V0YXR0cmAsIGBmdXNlX3JlYWRsaW5rX2ZvbGlvYCwgYGZ1c2VfZGlyX29wZW5gLCBgZnVzZV9kb19zZXRhdHRyYCwgYGZ1c2Vfb3BlbmAsIGFuZCBgZnVzZV9zdGF0ZnNgLCB3aXRoIHNwZWNpZmljIGhhbmRsaW5nIGluIGB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZWAuIFRoZSBhZGRpdGlvbiBvZiBuZXcgdGVzdHMgaXMgcHJvbWlzaW5nLCBidXQgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvdmVyYWdlIGFuZCBmb2N1cy5cblxuVGhlIHNpZ25pZmljYW50IGNoYW5nZXMgYXJlOlxuKiAgIEluIGBmcy9mdXNlL2Rpci5jYCwgYGZ1c2VfZG9fZ2V0YXR0cmAsIGBmdXNlX3JlYWRsaW5rX2ZvbGlvYCwgYGZ1c2VfZGlyX29wZW5gLCBhbmQgYGZ1c2VfZG9fc2V0YXR0cmAuXG4qICAgSW4gYGZzL2Z1c2UvZmlsZS5jYCwgYGZ1c2Vfb3BlbmAuXG4qICAgQSBuZXcgaGVscGVyIGBmdXNlX3N0YWxlX2lub2RlX2VycigpYCBpbiBgZnMvZnVzZS9mdXNlX2kuaGAuXG4qICAgSW4gYGZzL2Z1c2UvaW5vZGUuY2AsIGBmdXNlX3N0YXRmc2AuXG4qICAgSW4gYGZzL2Z1c2UvdmlydGlvX2ZzLmNgLCBgdmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGVgLlxuXG5Ob3csIGRvZXMgdGhpcyBtZXJpdCBmdXp6aW5nPyBBYnNvbHV0ZWx5LCB5ZXMhIFRoZSBGVVNFIGVycm9yIGhhbmRsaW5nIGFuZCByZXR1cm4gY29kZXMgKEVTVEFMRSwgRU9QRU5TVEFMRSwgYW5kIHRoZSBFTk9FTlQgcmV0cnkgbG9naWMpIGRpcmVjdGx5IGltcGFjdCBWRlMgcGF0aCByZXNvbHV0aW9uIGFuZCBmaWxlIG9wZXJhdGlvbnMgYWNyb3NzIHRoZSBib2FyZC4gT3BlcmF0aW9ucyBsaWtlIG9wZW4sIGdldGF0dHIsIHNldGF0dHIsIHN0YXRmcywgYW5kIHJlYWRsaW5rIHdpbGwgYmUgZGlyZWN0bHkgYWZmZWN0ZWQgYnkgdGhlc2UgY2hhbmdlcyB3aGVuIGludGVyYWN0aW5nIHdpdGggdXNlcnNwYWNlIEZVU0Ugc2VydmVycyBvciB2aXJ0aW8tZnMuIFRoaXMgaXMgYWNjZXNzaWJsZSBmcm9tIHByZXR0eSBzdGFuZGFyZCB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMsIHN1Y2ggYXMgUUVNVSBvciBHQ0UuXG5cbkkgbmVlZCB0byBjb25maXJtIHRoZSBzY29wZSBvZiB0aGlzLiBJJ20gZm9jdXNpbmcgb24gdGhvc2UgbW9kaWZpY2F0aW9uczogYGZ1c2VfZG9fc2V0YXR0cmAsIGBmdXNlX2RvX2dldGF0dHJgLCBgZnVzZV9kaXJfb3BlbmAsIGBmdXNlX29wZW5gLCBgZnVzZV9yZWFkbGlua19mb2xpb2AsIGBmdXNlX3N0YXRmc2AsIGFuZCBgdmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGVgLiBUaGUgbm9uLXN0YXRpYyBuYXR1cmUgb2YgYGZ1c2VfZG9fc2V0YXR0cmAgaXMgd29ydGggYSBkZWVwZXIgZGl2ZS4gSSB3YW50IHRvIGNoZWNrIGl0cyBkZWNsYXJhdGlvbnMsIGNhbGxlcnMsIGFuZCBvdmVyYWxsIHVzYWdlIGFjcm9zcyBGVVNFIGZpbGVzLiBMZXQncyBhbmFseXplIHRoZSBjYWxsZXJzIG9mIHRoZSBgc3RhdGljYCBmdW5jdGlvbnMgYXMgd2VsbC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNhbGwgY2hhaW5zIGFuZCBob3cgdGhlc2UgZXJyb3IgY29kZXMgYXJlIHByb3BhZ2F0ZWQuIEdpdmVuIHRoYXQgdGhlc2UgZnVuY3Rpb25zIGFyZSBkZWVwbHkgaW52b2x2ZWQgd2l0aCBmaWxlIG9wZXJhdGlvbnMsIHRoZXkgcmVwcmVzZW50IGZlcnRpbGUgZ3JvdW5kIGZvciBmdXp6aW5nIHRvIHVuY292ZXIgcG90ZW50aWFsIGlzc3VlcywgZXNwZWNpYWxseSByYWNlIGNvbmRpdGlvbnMgb3IgaW5jb3JyZWN0IGVycm9yIHByb3BhZ2F0aW9uLlxuXG5TbywgbGV0J3MgbWFwIG91dCB0aGUgZnVuY3Rpb25zLiBJJ2xsIG5lZWQgdG8gY2hlY2sgdGhlIGV4YWN0IGRlY2xhcmF0aW9ucywgd2hlcmUgdGhleSdyZSBkZWZpbmVkLCBhbmQgdGhlIGNhbGxlcnMgb2YgZWFjaC4gQSB0aG9yb3VnaCBhbmFseXNpcyBoZXJlIHdpbGwgcmV2ZWFsIHBvdGVudGlhbCBlbnRyeSBwb2ludHMgZm9yIGZ1enppbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNDY0LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzA3LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMDA6MDY6MjcuMjI3ODY5MzQyWiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNTc2MDU2MzQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZnVzZV9kb19zZXRhdHRyXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2Z1c2VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZnVzZS9kaXIuYz0yMTE5PWludCBmdXNlX2ZsdXNoX3RpbWVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmdXNlX2ZpbGUgKmZmKVxcbi0tXFxuZnMvZnVzZS9kaXIuYy0yMTUzLSAqL1xcbmZzL2Z1c2UvZGlyLmM6MjE1NDppbnQgZnVzZV9kb19zZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksXFxuZnMvZnVzZS9kaXIuYy0yMTU1LVxcdFxcdCAgICBzdHJ1Y3QgaWF0dHIgKmF0dHIsIHN0cnVjdCBmaWxlICpmaWxlKVxcbi0tXFxuZnMvZnVzZS9kaXIuYz0yMzM2PXN0YXRpYyBpbnQgZnVzZV9zZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSxcXG4tLVxcbmZzL2Z1c2UvZGlyLmMtMjM4Mi1cXG5mcy9mdXNlL2Rpci5jOjIzODM6XFx0cmV0ID0gZnVzZV9kb19zZXRhdHRyKGlkbWFwLCBlbnRyeSwgYXR0ciwgZmlsZSk7XFxuZnMvZnVzZS9kaXIuYy0yMzg0LVxcdGlmICghcmV0KSB7XFxuLS1cXG5mcy9mdXNlL2ZpbGUuYz0yNzEyPXN0YXRpYyB2b2lkIGZ1c2VfZG9fdHJ1bmNhdGUoc3RydWN0IGZpbGUgKmZpbGUpXFxuLS1cXG5mcy9mdXNlL2ZpbGUuYy0yNzIyLVxcbmZzL2Z1c2UvZmlsZS5jOjI3MjM6XFx0ZnVzZV9kb19zZXRhdHRyKGZpbGVfbW50X2lkbWFwKGZpbGUpLCBmaWxlX2RlbnRyeShmaWxlKSwgXFx1MDAyNmF0dHIsIGZpbGUpO1xcbmZzL2Z1c2UvZmlsZS5jLTI3MjQtfVxcbi0tXFxuZnMvZnVzZS9mdXNlX2kuaD0xMTkwPWludCBmdXNlX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKTtcXG5mcy9mdXNlL2Z1c2VfaS5oLTExOTEtXFxuZnMvZnVzZS9mdXNlX2kuaDoxMTkyOmludCBmdXNlX2RvX3NldGF0dHIoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSxcXG5mcy9mdXNlL2Z1c2VfaS5oLTExOTMtXFx0XFx0ICAgIHN0cnVjdCBpYXR0ciAqYXR0ciwgc3RydWN0IGZpbGUgKmZpbGUpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQwMDowNjoyNy41ODU0ODI5NDZaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6ODM2NjQ4ODI5NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgZnVuY3Rpb25zLlxuXG4qKkluaXRpYWwgQ29uc2lkZXJhdGlvbnMgZm9yIEZVU0UgS2VybmVsIE1vZHVsZSBSZXZpZXcqKlxuXG5BbHJpZ2h0LCBiZWZvcmUgSSBkaXZlIGluIHRvbyBkZWVwLCBsZXQncyBlc3RhYmxpc2ggb3VyIGltbWVkaWF0ZSBwcmlvcml0aWVzLiBNeSBtaW5kIGlzIGFscmVhZHkgcnVubmluZyB0aHJvdWdoIGEgcXVpY2sgY2hlY2tsaXN0IG9mIGNyaXRpY2FsIEZVU0UgZnVuY3Rpb25zIHRoYXQgZGVtYW5kIG15IGF0dGVudGlvbi4gU3BlY2lmaWNhbGx5LCBJJ20gdGhpbmtpbmcgYWJvdXQgYGZ1c2Vfb3BlbmAsIGBmdXNlX2Rpcl9vcGVuYCwgYGZ1c2Vfc3RhdGZzYCwgYGZ1c2VfZ2V0YXR0cmAsIGFuZCBgZnVzZV9zZXRhdHRyYC4gVGhlc2UgYXJlIHRoZSBjb3JlIGJ1aWxkaW5nIGJsb2NrcyBmb3IgZmlsZSBhY2Nlc3MsIGRpcmVjdG9yeSB0cmF2ZXJzYWwsIGZpbGVzeXN0ZW0gc3RhdGlzdGljcywgYXR0cmlidXRlIHJldHJpZXZhbCwgYW5kIGF0dHJpYnV0ZSBtb2RpZmljYXRpb24sIHJlc3BlY3RpdmVseS4gVGhlbiB0aGVyZSdzIHRoZSBmb2xpby1zcGVjaWZpYyBoYW5kbGluZywgd2hpY2ggYWxzbyBuZWVkcyBhIGxvb2sgYXQgYGZ1c2VfcmVhZGxpbmtfZm9saW9gLCBhbmQgYGZ1c2Vfc3ltbGlua19yZWFkX2ZvbGlvYCwgYW5kIGZpbmFsbHkgbGV0J3MgdGhyb3cgaW4gYHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlYCwgdG8gZW5zdXJlIGEgY29tcGxldGUgcGljdHVyZS4gV2l0aCB0aG9zZSBpbiBtaW5kLCBJIG5lZWQgdG8ga25vdyB0aGUgZXhhY3QgZGVmaW5pdGlvbnMgb2YgdGhlc2UgaW4gdGhlIEZVU0Uga2VybmVsIG1vZHVsZS4gTG9va3MgbGlrZSB0aGUgbG9naWNhbCBmaXJzdCBzdGVwIGlzIHRvIGltbWVkaWF0ZWx5IHB1bGwgdXAgYGZzL2Z1c2UvYCBhbmQgYmVnaW4gdGhlIGNvZGUgcmV2aWV3LiBUaGF0J2xsIGJlIGEgZ29vZCBzdGFydGluZyBwb2ludC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTUzNzMsIk91dHB1dFRva2VucyI6NTQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQwMDowNjozNS45NTE5NzUwMDNaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUxMjI5NzI2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl4oc3RhdGljICk/KGludHx2b2lkKSBmdXNlXyhvcGVufGRpcl9vcGVufHN0YXRmc3xnZXRhdHRyfHNldGF0dHJ8c3ltbGlua19yZWFkX2ZvbGlvKVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9mdXNlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2Z1c2UvZGlyLmM9MTg2Nj1zdGF0aWMgY29uc3QgY2hhciAqZnVzZV9nZXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9mdXNlL2Rpci5jLTE5MDItXFxuZnMvZnVzZS9kaXIuYzoxOTAzOnN0YXRpYyBpbnQgZnVzZV9kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcXG5mcy9mdXNlL2Rpci5jLTE5MDQte1xcbi0tXFxuZnMvZnVzZS9kaXIuYz0yMDkyPXZvaWQgZnVzZV9yZWxlYXNlX25vd3JpdGUoc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2Z1c2UvZGlyLmMtMjEwMC1cXG5mcy9mdXNlL2Rpci5jOjIxMDE6c3RhdGljIHZvaWQgZnVzZV9zZXRhdHRyX2ZpbGwoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX2FyZ3MgKmFyZ3MsXFxuZnMvZnVzZS9kaXIuYy0yMTAyLVxcdFxcdFxcdCAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9mdXNlL2Rpci5jPTIxNTQ9aW50IGZ1c2VfZG9fc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxcbi0tXFxuZnMvZnVzZS9kaXIuYy0yMzM1LVxcbmZzL2Z1c2UvZGlyLmM6MjMzNjpzdGF0aWMgaW50IGZ1c2Vfc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZW50cnksXFxuZnMvZnVzZS9kaXIuYy0yMzM3LVxcdFxcdFxcdHN0cnVjdCBpYXR0ciAqYXR0cilcXG4tLVxcbmZzL2Z1c2UvZGlyLmMtMjM5OC1cXG5mcy9mdXNlL2Rpci5jOjIzOTk6c3RhdGljIGludCBmdXNlX2dldGF0dHIoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsXFxuZnMvZnVzZS9kaXIuYy0yNDAwLVxcdFxcdFxcdGNvbnN0IHN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3Qga3N0YXQgKnN0YXQsXFxuLS1cXG5mcy9mdXNlL2Rpci5jPTI0ODM9dm9pZCBmdXNlX2luaXRfZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9mdXNlL2Rpci5jLTI0OTYtXFxuZnMvZnVzZS9kaXIuYzoyNDk3OnN0YXRpYyBpbnQgZnVzZV9zeW1saW5rX3JlYWRfZm9saW8oc3RydWN0IGZpbGUgKm51bGwsIHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuZnMvZnVzZS9kaXIuYy0yNDk4LXtcXG4tLVxcbmZzL2Z1c2UvZmlsZS5jPTIzNz1zdGF0aWMgdm9pZCBmdXNlX3RydW5jYXRlX3VwZGF0ZV9hdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbi0tXFxuZnMvZnVzZS9maWxlLmMtMjQ5LVxcbmZzL2Z1c2UvZmlsZS5jOjI1MDpzdGF0aWMgaW50IGZ1c2Vfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcXG5mcy9mdXNlL2ZpbGUuYy0yNTEte1xcbi0tXFxuZnMvZnVzZS9pbm9kZS5jPTYzMj1zdGF0aWMgdm9pZCBjb252ZXJ0X2Z1c2Vfc3RhdGZzKHN0cnVjdCBrc3RhdGZzICpzdGJ1Ziwgc3RydWN0IGZ1c2Vfa3N0YXRmcyAqYXR0cilcXG4tLVxcbmZzL2Z1c2UvaW5vZGUuYy02NDUtXFxuZnMvZnVzZS9pbm9kZS5jOjY0NjpzdGF0aWMgaW50IGZ1c2Vfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZilcXG5mcy9mdXNlL2lub2RlLmMtNjQ3LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMDA6MDY6MzYuMDAzMjExOTE5WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjY5NjQzNjk2MTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDpcblxuKipEaWdnaW5nIGludG8gdmlydGlvX2ZzLmMgZm9yIENvbXBsZXRpb24gSGFuZGxpbmcqKlxuXG5Pa2F5LCBzbyB3ZSdyZSBsb29raW5nIGF0IGNvbXBsZXRpb24gaGFuZGxpbmcgd2l0aGluIHZpcnRpby1mcy4gTXkgaW5pdGlhbCBmb2N1cyBpcyBkZWZpbml0ZWx5IGdvaW5nIHRvIGJlIG9uIGB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZWAuIFRoYXQncyB3aGVyZSB0aGUgcnViYmVyIG1lZXRzIHRoZSByb2FkLCB3aGVyZSB0aGUga2VybmVsIHNpZ25hbHMgYSByZXF1ZXN0IGlzIGZpbmlzaGVkLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0aGUgZGF0YSBnZXRzIGNsZWFuZWQgdXAsIGhvdyBlcnJvcnMgYXJlIHJlcG9ydGVkIGJhY2sgKGlmIGFueSksIGFuZCBob3cgdGhlIHdob2xlIHRoaW5nIHRyYW5zaXRpb25zIHRvIHRoZSBuZXh0IHBoYXNlIGluIHRoZSByZXF1ZXN0IGxpZmVjeWNsZS4gSSdsbCBsaWtlbHkgYmUgY2hlY2tpbmcgdGhlIHN1cnJvdW5kaW5nIGNvZGUgZm9yIGhvdyB0aGF0IGZ1bmN0aW9uIGlzIGNhbGxlZCBhbmQgd2hlcmUgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBjb21wbGV0ZSB0aGUgcmVxdWVzdCBjb21lcyBmcm9tIGluIHRoZSBmaXJzdCBwbGFjZS4gSeKAmW0gdGhpbmtpbmcgdGhlcmUgbWlnaHQgYmUgc2V2ZXJhbCBjcml0aWNhbCBwb2ludHMgdGhlcmUuIEFuZCBJJ2xsIGJlIGtlZXBpbmcgYW4gZXllIG91dCBmb3IgYW55IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMgb3IgZWRnZSBjYXNlcy4gVGltZSB0byBkaWcgaW4hXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2NDIzLCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMDA6MDY6NDIuOTY3NTg0MDU5WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NjA4MDQ2NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9mdXNlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2Z1c2UvdmlydGlvX2ZzLmM9ODEzPXN0YXRpYyB2b2lkIHZpcnRpb19mc19maXh1cF9zdGFsZV9lcnJvcihzdHJ1Y3QgZnVzZV9yZXEgKnJlcSlcXG4tLVxcbmZzL2Z1c2UvdmlydGlvX2ZzLmMtODQzLS8qIFdvcmsgZnVuY3Rpb24gZm9yIHJlcXVlc3QgY29tcGxldGlvbiAqL1xcbmZzL2Z1c2UvdmlydGlvX2ZzLmM6ODQ0OnN0YXRpYyB2b2lkIHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlKHN0cnVjdCBmdXNlX3JlcSAqcmVxLFxcbmZzL2Z1c2UvdmlydGlvX2ZzLmMtODQ1LVxcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgdmlydGlvX2ZzX3ZxICpmc3ZxKVxcbi0tXFxuZnMvZnVzZS92aXJ0aW9fZnMuYz04ODE9c3RhdGljIHZvaWQgdmlydGlvX2ZzX2NvbXBsZXRlX3JlcV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4tLVxcbmZzL2Z1c2UvdmlydGlvX2ZzLmMtODg1LVxcbmZzL2Z1c2UvdmlydGlvX2ZzLmM6ODg2OlxcdHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlKHctXFx1MDAzZXJlcSwgdy1cXHUwMDNlZnN2cSk7XFxuZnMvZnVzZS92aXJ0aW9fZnMuYy04ODctXFx0a2ZyZWUodyk7XFxuLS1cXG5mcy9mdXNlL3ZpcnRpb19mcy5jPTg5MD1zdGF0aWMgdm9pZCB2aXJ0aW9fZnNfcmVxdWVzdHNfZG9uZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4tLVxcbmZzL2Z1c2UvdmlydGlvX2ZzLmMtOTMxLVxcdFxcdH0gZWxzZSB7XFxuZnMvZnVzZS92aXJ0aW9fZnMuYzo5MzI6XFx0XFx0XFx0dmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGUocmVxLCBmc3ZxKTtcXG5mcy9mdXNlL3ZpcnRpb19mcy5jLTkzMy1cXHRcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDAwOjA2OjQzLjAxMzY2NzYyNloiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNDEwNTc5NDg2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgRlVTRS9WaXJ0aW9GUyBTeW1ib2wgVmlzaWJpbGl0eSoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgcHJpbWFyeSBjb25jZXJuIGlzIHRoZSB2aXNpYmlsaXR5IG9mIGNlcnRhaW4gRlVTRSBhbmQgVmlydGlvRlMgZnVuY3Rpb25zLCBzcGVjaWZpY2FsbHkgdG8gZGV0ZXJtaW5lIHdoaWNoIG9uZXMgYXJlIGV4cG9zZWQgYXMgcHJvcGVyIHN5bWJvbHMuIFRoZSBnb2FsIGlzIHRvIGlkZW50aWZ5IEFQSSBlbnRyeSBwb2ludHMsIGZhdm9yaW5nIHRob3NlIHRoYXQgYXJlIG5vbi1zdGF0aWMgYW5kIG5vdCBpbmxpbmVkIGJlY2F1c2UgdGhlc2UgYXJlIG1vcmUgbGlrZWx5IHRvIGJlIGFjY2Vzc2libGUgaW4gYSBwcmVkaWN0YWJsZSB3YXkuXG5cbkZpcnN0LCBJIGNvbmZpcm1lZCB0aGF0IGBmdXNlX2RvX3NldGF0dHJgIGlzIGluZGVlZCBub24tc3RhdGljLCBhIGdvb2Qgc3RhcnQuIFRoZW4sIEkgcXVpY2tseSBzY2FubmVkIG90aGVyIGZ1bmN0aW9ucyB3aXRoaW4gYGZzL2Z1c2UvZGlyLmNgLCBhbmQgYGZzL2Z1c2UvZmlsZS5jYCB0byBpZGVudGlmeSBvdGhlciBmdW5jdGlvbnMgb2YgaW50ZXJlc3Q6IGBmdXNlX29wZW5gLCBgZnVzZV9kaXJfb3BlbmAsIGBmdXNlX2RvX2dldGF0dHJgLCBgZnVzZV9zdGF0ZnNgLCBgZnVzZV9yZWFkbGlua19mb2xpb2AsIGFuZCBgdmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGVgLlxuXG5Mb29raW5nIGF0IHRoZSBkaWZmLCBpdCBzZWVtcyBzZXZlcmFsIG9mIHRoZXNlIGhhdmUgYmVlbiBtb2RpZmllZDogYGZ1c2VfZG9fZ2V0YXR0cmAsIGBmdXNlX3JlYWRsaW5rX2ZvbGlvYCwgYGZ1c2VfZGlyX29wZW5gLCBgZnVzZV9kb19zZXRhdHRyYCAoaW4gYGZzL2Z1c2UvZGlyLmNgKSBhbmQgYGZ1c2Vfb3BlbmAgKGluIGBmcy9mdXNlL2ZpbGUuY2ApLiBBZGRpdGlvbmFsbHksIGBmdXNlX3N0YXRmc2AgaXMgY2hhbmdlZCBpbiBgZnMvZnVzZS9pbm9kZS5jYCwgYW5kIHRoZXJlIGFyZSBjaGFuZ2VzIGluIGBmcy9mdXNlL3ZpcnRpb19mcy5jYCByZWxhdGVkIHRvIGB2aXJ0aW9fZnNfZml4dXBfc3RhbGVfZXJyb3JgIGFuZCBgdmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGVgLiBUaGUgYGZ1c2Vfc3RhbGVfaW5vZGVfZXJyYCBmdW5jdGlvbiBpcyBhbHNvIG5vdyBhbiBpbmxpbmUgZnVuY3Rpb24gZGVmaW5lZCBpbiBgZnMvZnVzZS9mdXNlX2kuaGAuXG5cbkkgdGhlbiBtYWRlIGEgbm90ZSBvZiB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbiBvcHRpb25zOiBgRlVTRV9GU2AgYW5kIGBWSVJUSU9fRlNgLiBBIHF1aWNrIGNyb3NzLXJlZmVyZW5jZSBvZiB0aGUgS2NvbmZpZyBzaG93ZWQgdGhhdCBgVklSVElPX0ZTYCBkZXBlbmRzIG9uIGBGVVNFX0ZTYCBhbmQgYEZVU0VfRlNgIHNlbGVjdHMgYEZTX1BPU0lYX0FDTGAgYW5kIGBGU19JT01BUGAuXG5cbk5vdywgdGhlIGZvY3VzIGlzIG9uIGEgc3Vic2V0IG9mIHN5bWJvbHM6IGBmdXNlX2RvX3NldGF0dHJgLCBgZnVzZV9kb19nZXRhdHRyYCwgYGZ1c2VfZGlyX29wZW5gLCBgZnVzZV9vcGVuYCwgYGZ1c2VfcmVhZGxpbmtfZm9saW9gLCBgZnVzZV9zdGF0ZnNgLCBhbmQgYHZpcnRpb19mc19yZXF1ZXN0X2NvbXBsZXRlYC4gSSBuZWVkIHRvIGRldGVybWluZSBpZiB0aGVzZSBhcmUgY29tcGlsZWQgYXMgZGlzdGluY3Qgc3ltYm9scy5cblxuYGZ1c2VfZG9fc2V0YXR0cmAgaGFzIGFscmVhZHkgYmVlbiBlc3RhYmxpc2hlZCBhcyBub24tc3RhdGljLiBIb3dldmVyLCBhZnRlciBjYXJlZnVsIHJldmlldywgaXQgbG9va3MgbGlrZSBgZnVzZV9vcGVuYCwgYGZ1c2VfZGlyX29wZW5gLCBhbmQgYGZ1c2Vfc3RhdGZzYCBhcmUgc3RhdGljIGZpbGVfb3BlcmF0aW9ucy9zdXBlcl9vcGVyYXRpb25zIGNhbGxiYWNrcy4gVGhpcyBpcyBnb29kIGJlY2F1c2UgZXZlbiB0aG91Z2ggdGhleSBhcmUgc3RhdGljLCBiZWNhdXNlIHRoZWlyIGFkZHJlc3MgaXMgdGFrZW4gYW5kIGFzc2lnbmVkIGludG8gYSBzdHJ1Y3QgZnVuY3Rpb24gcG9pbnRlciwgdGhleSBhcmUgbm90IGlubGluZWQuIGBmdXNlX2RvX2dldGF0dHJgIGFuZCBgZnVzZV9yZWFkbGlua19mb2xpb2AgYXJlIGJvdGggc3RhdGljIGhlbHBlcnMuIEFuZCBgdmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGVgIGlzIHN0YXRpYyBhcyB3ZWxsLlxuXG5UaGVyZWZvcmUsIGBmdXNlX2RvX3NldGF0dHJgLCBgZnVzZV9vcGVuYCwgYGZ1c2VfZGlyX29wZW5gLCBhbmQgYGZ1c2Vfc3RhdGZzYCBhcmUgdGhlIHNpZ25pZmljYW50IHN5bWJvbHMgdG8gZm9jdXMgb24uIFRoZXkgYXJlICpsaWtlbHkqIHRoZSBwcmltYXJ5IGV4cG9zZWQgQVBJIGVudHJ5IHBvaW50cyBpbiB0aGUgbW9kdWxlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzAzMSwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEwMDksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMDA6MDc6MDcuMTE5NDY0NTU5WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0ODAzMjAwNiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJmdXNlX29wZW5cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvZnVzZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9mdXNlL2Rldi5jPTc3Mz1zdGF0aWMgdm9pZCBmdXNlX2FkanVzdF9jb21wYXQoc3RydWN0IGZ1c2VfY2hhbiAqZmNoLCBzdHJ1Y3QgZnVzZV9hcmdzICphcmdzKVxcbi0tXFxuZnMvZnVzZS9kZXYuYy03OTYtXFx0XFx0Y2FzZSBGVVNFX0NSRUFURTpcXG5mcy9mdXNlL2Rldi5jOjc5NzpcXHRcXHRcXHRhcmdzLVxcdTAwM2Vpbl9hcmdzWzBdLnNpemUgPSBzaXplb2Yoc3RydWN0IGZ1c2Vfb3Blbl9pbik7XFxuZnMvZnVzZS9kZXYuYy03OTgtXFx0XFx0XFx0YnJlYWs7XFxuLS1cXG5mcy9mdXNlL2Rpci5jPTgyMz1zdGF0aWMgaW50IGZ1c2VfY3JlYXRlX29wZW4oc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBpbm9kZSAqZGlyLFxcbi0tXFxuZnMvZnVzZS9kaXIuYy04MzEtXFx0c3RydWN0IGZ1c2VfY3JlYXRlX2luIGluYXJnO1xcbmZzL2Z1c2UvZGlyLmM6ODMyOlxcdHN0cnVjdCBmdXNlX29wZW5fb3V0ICpvdXRvcGVucDtcXG5mcy9mdXNlL2Rpci5jLTgzMy1cXHRzdHJ1Y3QgZnVzZV9lbnRyeV9vdXQgb3V0ZW50cnk7XFxuLS1cXG5mcy9mdXNlL2Rpci5jPTE5MDM9c3RhdGljIGludCBmdXNlX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbi0tXFxuZnMvZnVzZS9kaXIuYy0xOTE2LVxcdC8qXFxuZnMvZnVzZS9kaXIuYzoxOTE3OlxcdCAqIEFzIGluIGZ1c2Vfb3Blbl9jb21tb24oKTogYSBwYXRoIHdhbGsgc3RhbmRzIGJlaGluZCB0aGlzIG9wZW4sXFxuZnMvZnVzZS9kaXIuYy0xOTE4LVxcdCAqIHNvIHRoZSByZWZ1c2FsIGlzIEVPUEVOU1RBTEUgZm9yIHBhdGhfb3BlbmF0KCkgdG8gYW5zd2VyLlxcbi0tXFxuZnMvZnVzZS9maWxlLmM9MjU9c3RhdGljIGludCBmdXNlX3NlbmRfb3BlbihzdHJ1Y3QgZnVzZV9tb3VudCAqZm0sIHU2NCBub2RlaWQsXFxuZnMvZnVzZS9maWxlLmMtMjYtXFx0XFx0XFx0ICB1bnNpZ25lZCBpbnQgb3Blbl9mbGFncywgaW50IG9wY29kZSxcXG5mcy9mdXNlL2ZpbGUuYzoyNzpcXHRcXHRcXHQgIHN0cnVjdCBmdXNlX29wZW5fb3V0ICpvdXRhcmdwKVxcbmZzL2Z1c2UvZmlsZS5jLTI4LXtcXG5mcy9mdXNlL2ZpbGUuYzoyOTpcXHRzdHJ1Y3QgZnVzZV9vcGVuX2luIGluYXJnO1xcbmZzL2Z1c2UvZmlsZS5jLTMwLVxcdEZVU0VfQVJHUyhhcmdzKTtcXG4tLVxcbmZzL2Z1c2UvZmlsZS5jPTEzMz1zdHJ1Y3QgZnVzZV9maWxlICpmdXNlX2ZpbGVfb3BlbihzdHJ1Y3QgZnVzZV9tb3VudCAqZm0sIHU2NCBub2RlaWQsXFxuLS1cXG5mcy9mdXNlL2ZpbGUuYy0xNTgtXFx0XFx0LyogU3RvcmUgb3V0YXJnIGZvciBmdXNlX2ZpbmlzaF9vcGVuKCkgKi9cXG5mcy9mdXNlL2ZpbGUuYzoxNTk6XFx0XFx0c3RydWN0IGZ1c2Vfb3Blbl9vdXQgKm91dGFyZ3AgPSBcXHUwMDI2ZmYtXFx1MDAzZWFyZ3MtXFx1MDAzZW9wZW5fb3V0YXJnO1xcbmZzL2Z1c2UvZmlsZS5jLTE2MC1cXHRcXHRpbnQgZXJyO1xcbi0tXFxuZnMvZnVzZS9maWxlLmM9MjM3PXN0YXRpYyB2b2lkIGZ1c2VfdHJ1bmNhdGVfdXBkYXRlX2F0dHIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXFxuLS1cXG5mcy9mdXNlL2ZpbGUuYy0yNDktXFxuZnMvZnVzZS9maWxlLmM6MjUwOnN0YXRpYyBpbnQgZnVzZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbmZzL2Z1c2UvZmlsZS5jLTI1MS17XFxuLS1cXG5mcy9mdXNlL2ZpbGUuYz0zMDg4PXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZmlsZV9vcGVyYXRpb25zID0ge1xcbi0tXFxuZnMvZnVzZS9maWxlLmMtMzA5Mi1cXHQubW1hcFxcdFxcdD0gZnVzZV9maWxlX21tYXAsXFxuZnMvZnVzZS9maWxlLmM6MzA5MzpcXHQub3BlblxcdFxcdD0gZnVzZV9vcGVuLFxcbmZzL2Z1c2UvZmlsZS5jLTMwOTQtXFx0LmZsdXNoXFx0XFx0PSBmdXNlX2ZsdXNoLFxcbi0tXFxuZnMvZnVzZS9mdXNlX2kuaD0zMzM9dW5pb24gZnVzZV9maWxlX2FyZ3Mge1xcbmZzL2Z1c2UvZnVzZV9pLmgtMzM0LVxcdC8qIFVzZWQgZHVyaW5nIG9wZW4oKSAqL1xcbmZzL2Z1c2UvZnVzZV9pLmg6MzM1OlxcdHN0cnVjdCBmdXNlX29wZW5fb3V0IG9wZW5fb3V0YXJnO1xcbmZzL2Z1c2UvZnVzZV9pLmgtMzM2LVxcdC8qIFVzZWQgZHVyaW5nIHJlbGVhc2UoKSAqL1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQwMDowNzowNy4xNjc1MDMyMzZaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6OTg2NDY1OTk0OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqRGl2aW5nIGludG8gYGZ1c2VfZGlyX29wZW5gKipcblxuT2theSwgdGltZSB0byBkaXNzZWN0IHRoZSB1c2FnZSBvZiBgZnVzZV9kaXJfb3BlbmAgd2l0aGluIGBmcy9mdXNlL2Rpci5jYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUgYW5kIGhvdyBpdCdzIGJlaW5nIGxldmVyYWdlZCBpbiB0aGUgRlVTRSBmaWxlc3lzdGVtIGxheWVyLiBJJ20gYXNzdW1pbmcgdGhlcmUncyBzb21lIGlzc3VlIHRoYXQgd2FycmFudHMgaW52ZXN0aWdhdGlvbiwgb3IgcGVyaGFwcyBJJ20gbG9va2luZyB0byBvcHRpbWl6ZSBkaXJlY3Rvcnkgb3BlcmF0aW9ucy4gUmVnYXJkbGVzcywgdGhlIGZpcnN0IHN0ZXAgaXMgYWx3YXlzIHRvIGdvIHN0cmFpZ2h0IHRvIHRoZSBzb3VyY2UgYW5kIHNlZSAqaG93KiB0aGlzIGNydWNpYWwgZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVkIGFuZCB3aGF0IGNvbnRleHQgaXMgc2hhcGluZyBpdHMgZXhlY3V0aW9uLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGUgZnVzZSBkYWVtb24gaW50ZXJhY3RzIHdpdGggdGhlIGtlcm5lbCBzcGFjZS4gS25vd2luZyB3aGVyZSBpdCBpcyBiZWluZyBjYWxsZWQgZnJvbSB3aWxsIGhlbHAgaW5mb3JtIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIGludGVyYWN0aW9ucyBiZXR3ZWVuIHVzZXJzcGFjZSBhbmQgdGhlIGtlcm5lbCwgYW5kIHRoZSByZXNvdXJjZXMgdGhhdCBpdCBtYXkgYmUgY29uc3VtaW5nLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIHBvdGVudGlhbCBib3R0bGVuZWNrcywgcmFjZSBjb25kaXRpb25zLCBvciBtYXliZSBldmVuIG9wcG9ydHVuaXRpZXMgdG8gcmVkdWNlIHVubmVjZXNzYXJ5IHN5c3RlbSBjYWxscyBvciBpbXByb3ZlIGNhY2hpbmcgc3RyYXRlZ2llcyByZWxhdGVkIHRvIGRpcmVjdG9yeSBoYW5kbGluZyB3aXRoaW4gdGhlIEZVU0UgZnJhbWV3b3JrLiBMZXQncyBzZWUgd2hhdCdzIHdoYXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5NjM5LCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMDA6MDc6MTcuMDMyMTY1NTU1WiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NDIyMjkyNiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJmdXNlX2Rpcl9vcGVuXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2Z1c2VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZnVzZS9kaXIuYz0xODY2PXN0YXRpYyBjb25zdCBjaGFyICpmdXNlX2dldF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2Z1c2UvZGlyLmMtMTkwMi1cXG5mcy9mdXNlL2Rpci5jOjE5MDM6c3RhdGljIGludCBmdXNlX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbmZzL2Z1c2UvZGlyLmMtMTkwNC17XFxuLS1cXG5mcy9mdXNlL2Rpci5jPTI0NDg9c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnVzZV9kaXJfb3BlcmF0aW9ucyA9IHtcXG4tLVxcbmZzL2Z1c2UvZGlyLmMtMjQ1MS1cXHQuaXRlcmF0ZV9zaGFyZWRcXHQ9IGZ1c2VfcmVhZGRpcixcXG5mcy9mdXNlL2Rpci5jOjI0NTI6XFx0Lm9wZW5cXHRcXHQ9IGZ1c2VfZGlyX29wZW4sXFxuZnMvZnVzZS9kaXIuYy0yNDUzLVxcdC5yZWxlYXNlXFx0PSBmdXNlX2Rpcl9yZWxlYXNlLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQwMDowNzoxNy4wNzYzOTM3NTFaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NzQ2MDA1OTM3OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiB0aGUgRlVTRSBhbmQgVmlydGlvLWZzIENoYW5nZXMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEkgc2VlIHRoYXQgYGZ1c2Vfb3BlbmAgaXMgaG9va2VkIHVwIHRvIGBmdXNlX2ZpbGVfb3BlcmF0aW9ucy5vcGVuYCwgYW5kIGBmdXNlX2Rpcl9vcGVuYCB0byBgZnVzZV9kaXJfb3BlcmF0aW9ucy5vcGVuYC4gYGZ1c2Vfc3RhdGZzYCBpcyBoYW5kbGluZyB0aGUgYHN0YXRfZnNgIHN1cGVyIG9wZXJhdGlvbi4gYGZ1c2VfZG9fc2V0YXR0cmAgaXMgbm93IGV4cG9zZWQsIGFuZCBJIHNlZSBpdCdzIGRlY2xhcmVkIGluIGBmdXNlX2kuaGAsIGFjY2Vzc2libGUgZnJvbSBvdXRzaWRlLCBhbmQgYGZ1c2VfZG9fZ2V0YXR0cmAgaXMgY2FsbGVkIHdpdGhpbiBgZGlyLmNgLiBBbHNvLCBgdmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGVgLCBpcyBiZWluZyBjYWxsZWQgYnkgdGhlIHZpcnRpby1mcyBjb21wbGV0aW9uIHJvdXRpbmVzIGluIGB2aXJ0aW9fZnMuY2AuXG5cbkkndmUgZ290IGEgZ29vZCBoYW5kbGUgb24gd2hlcmUgdGhlc2UgY2hhbmdlcyB0b3VjaCB0aGUgY29kZWJhc2UuIFRoZSBtb2RpZmllZCBmaWxlcyBpbmNsdWRlIGBmcy9mdXNlL2Rpci5jYCwgYGZzL2Z1c2UvZmlsZS5jYCwgYGZzL2Z1c2UvZnVzZV9pLmhgLCBgZnMvZnVzZS9pbm9kZS5jYCwgYW5kIG9mIGNvdXJzZSBgZnMvZnVzZS92aXJ0aW9fZnMuY2AsIHBsdXMgdGhlIHNlbGZ0ZXN0cy5cblxuQXMgZm9yIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMsIGBGVVNFX0ZTYCBhbmQgYFZJUlRJT19GU2AgYXJlIHRoZSBvbmVzIHJlbGV2YW50IHRvIHRoaXMgY2hhbmdlLiBObyBvdGhlciBmaWxlcyBhcmUgbW9kaWZpZWQgaW4ga2VybmVsIHNwYWNlLlxuXG5Ob3csIEkndmUgZ290IGEgc29saWQgbGlzdCBvZiBrZXkgc3ltYm9scyBmb3IgZnVydGhlciBhbmFseXNpczogYGZ1c2VfZG9fc2V0YXR0cmAsIGBmdXNlX29wZW5gLCBgZnVzZV9kaXJfb3BlbmAsIGBmdXNlX2RvX2dldGF0dHJgLCBgZnVzZV9zdGF0ZnNgLCBgZnVzZV9yZWFkbGlua19mb2xpb2AsIGFuZCBgdmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGVgLlxuXG5BbmQgaGVyZSBhcmUgdGhlIHJlbGV2YW50IGNvbmZpZ3MgSSBuZWVkIHRvIGNvbnNpZGVyIGZvciB0ZXN0aW5nOiBgRlVTRV9GU2AsIGFuZCBgVklSVElPX0ZTYC5cblxuVGhpcyBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcuIFRoZSBwYXRjaCBpcyBhYm91dCBpbXByb3ZpbmcgZXJyb3IgaGFuZGxpbmcgaW4gRlVTRSBhbmQgdmlydGlvLWZzLCBzcGVjaWZpY2FsbHkgd2hlbiBsaXZlIG5vZGUgSUQgcmVxdWVzdHMgZmFpbCB3aXRoIC1FTk9FTlQuIEl0J3MgdHJhbnNsYXRpbmcgdGhvc2UgZXJyb3JzIHRvIC1FU1RBTEUgKGZvciBnZXRhdHRyLCBzZXRhdHRyLCByZWFkbGluaywgc3RhdGZzKSBvciAtRU9QRU5TVEFMRSAoZm9yIG9wZW4vb3BlbmRpcikgc28gdGhlIFZGUyBsYXllciBjYW4gcmV0cnkgdGhlIHBhdGggcmVzb2x1dGlvbiB3aXRoIExPT0tVUF9SRVZBTC4gVGhpcyB0b3VjaGVzIGNvcmUgRlVTRSBiZWhhdmlvciBhY3Jvc3Mgc2V2ZXJhbCBvcGVyYXRpb25zLCBib3RoIHN0YW5kYXJkIEZVU0UgbW91bnRzIGFuZCB2aXJ0aW8tZnMuIFRlc3RpbmcgdGhpcyB0aG9yb3VnaGx5IGlzIGltcG9ydGFudC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjAxMjUsIk91dHB1dFRva2VucyI6MTg2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTE2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDAwOjA3OjI0LjUzNjQ1NjY2WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODM0OTEwMTQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkZVU0VfRlNcIixcbiAgICBcIlZJUlRJT19GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImZ1c2VfZG9fc2V0YXR0clwiLFxuICAgIFwiZnVzZV9vcGVuXCIsXG4gICAgXCJmdXNlX2Rpcl9vcGVuXCIsXG4gICAgXCJmdXNlX2RvX2dldGF0dHJcIixcbiAgICBcImZ1c2Vfc3RhdGZzXCIsXG4gICAgXCJmdXNlX3JlYWRsaW5rX2ZvbGlvXCIsXG4gICAgXCJ2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHVwZGF0ZXMgZXJyb3IgaGFuZGxpbmcgZm9yIGxpdmUgbm9kZSBJRHMgaW4gRlVTRSBhbmQgdmlydGlvLWZzIHdoZW4gdGhlIHVzZXIvaG9zdCBzZXJ2ZXIgcmV0dXJucyAtRU5PRU5ULCB0cmFuc2xhdGluZyBpdCB0byAtRVNUQUxFIG9yIC1FT1BFTlNUQUxFIHRvIHRyaWdnZXIgVkZTIHBhdGggbG9va3VwIHJldHJpZXMgKExPT0tVUF9SRVZBTCkuIFRoZXNlIGZ1bmN0aW9uYWwgY2hhbmdlcyBpbXBhY3QgY29yZSBmaWxlIG9wZXJhdGlvbnMgKG9wZW4sIGdldGF0dHIsIHNldGF0dHIsIHJlYWRsaW5rLCBzdGF0ZnMpIGluIEZVU0UgYW5kIHZpcnRpby1mcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJGVVNFX0ZTXCIsXG4gICAgXCJWSVJUSU9fRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJmdXNlX2RvX3NldGF0dHJcIixcbiAgICBcImZ1c2Vfb3BlblwiLFxuICAgIFwiZnVzZV9kaXJfb3BlblwiLFxuICAgIFwiZnVzZV9kb19nZXRhdHRyXCIsXG4gICAgXCJmdXNlX3N0YXRmc1wiLFxuICAgIFwiZnVzZV9yZWFkbGlua19mb2xpb1wiLFxuICAgIFwidmlydGlvX2ZzX3JlcXVlc3RfY29tcGxldGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCB1cGRhdGVzIGVycm9yIGhhbmRsaW5nIGZvciBsaXZlIG5vZGUgSURzIGluIEZVU0UgYW5kIHZpcnRpby1mcyB3aGVuIHRoZSB1c2VyL2hvc3Qgc2VydmVyIHJldHVybnMgLUVOT0VOVCwgdHJhbnNsYXRpbmcgaXQgdG8gLUVTVEFMRSBvciAtRU9QRU5TVEFMRSB0byB0cmlnZ2VyIFZGUyBwYXRoIGxvb2t1cCByZXRyaWVzIChMT09LVVBfUkVWQUwpLiBUaGVzZSBmdW5jdGlvbmFsIGNoYW5nZXMgaW1wYWN0IGNvcmUgZmlsZSBvcGVyYXRpb25zIChvcGVuLCBnZXRhdHRyLCBzZXRhdHRyLCByZWFkbGluaywgc3RhdGZzKSBpbiBGVVNFIGFuZCB2aXJ0aW8tZnMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDAwOjA3OjI0LjYxOTk1NTAyNFoiLCJTZXEiOjIxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjE4NDU2ODYwNjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQwMDowNzoyNC42MjA0OTc3OTNaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoyMTg0NTEzODkyOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggc2VyaWVzIG1vZGlmaWVzIGVycm9yIGNvZGUgaGFuZGxpbmcgaW4gRlVTRSBhbmQgdmlydGlvLWZzIGJ5IHRyYW5zbGF0aW5nIC1FTk9FTlQgcmVzcG9uc2VzIHRvIC1FU1RBTEUgb3IgLUVPUEVOU1RBTEUgZm9yIG9wZXJhdGlvbnMgcmVmZXJlbmNpbmcgaW5vZGVzIGJ5IG5vZGVpZCAoZS5nLiwgRlVTRV9PUEVOLCBGVVNFX09QRU5ESVIsIEZVU0VfR0VUQVRUUiwgRlVTRV9TRVRBVFRSLCBGVVNFX1JFQURMSU5LLCBGVVNFX1NUQVRGUykgdG8gZW5hYmxlIFZGUyBwYXRoIGxvb2t1cCByZXRyaWVzIChyZXRyeV9lc3RhbGUpLlxcblxcblRoaXMgY2hhbmdlIHB1cmVseSBhbHRlcnMgaW50ZWdlciByZXR1cm4gdmFsdWVzL2Vycm5vIGNvZGVzIGluIGVycm9yIHBhdGhzLiBJdCBkb2VzIG5vdCBpbnRyb2R1Y2Ugb3IgbW9kaWZ5IGFueSBtZW1vcnkgYWxsb2NhdGlvbnMsIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbnMsIGJ1ZmZlciBjb3BpZXMgdG8gdXNlcnNwYWNlLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzIG9yIGluZm9ybWF0aW9uIGRpc2Nsb3N1cmUgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOIGRldGVjdGlvbi4gQW55IGNvbnRyb2wgZmxvdyBvciBmdW5jdGlvbmFsIHJlZ3Jlc3Npb24gaXNzdWVzIGFyZSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIHRlc3RpbmcgYW5kIEtBU0FOIGJ1aWxkcy5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBiNGNjYTM0YjZmZWU5NDg2M2IxYmUyMDM5MjA5MzhlMWY0YWY5YmU0XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgMjggMDA6MDU6MzAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9mdXNlL2Rpci5jIGIvZnMvZnVzZS9kaXIuY1xuaW5kZXggZTQ5YjRlODc0YjE1Zi4uMjE3YTAzOTk5MDUwNyAxMDA2NDRcbi0tLSBhL2ZzL2Z1c2UvZGlyLmNcbisrKyBiL2ZzL2Z1c2UvZGlyLmNcbkBAIC0xNTMyLDYgKzE1MzIsOCBAQCBzdGF0aWMgaW50IGZ1c2VfZG9fZ2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGlub2RlICppbm9kZSxcbiBcdFx0XHRpZiAoc3RhdClcbiBcdFx0XHRcdGZ1c2VfZmlsbGF0dHIoaWRtYXAsIGlub2RlLCBcdTAwMjZvdXRhcmcuYXR0ciwgc3RhdCk7XG4gXHRcdH1cbitcdH0gZWxzZSB7XG4rXHRcdGVyciA9IGZ1c2Vfc3RhbGVfaW5vZGVfZXJyKGVycik7XG4gXHR9XG4gXHRyZXR1cm4gZXJyO1xuIH1cbkBAIC0xODQ4LDYgKzE4NTAsNyBAQCBzdGF0aWMgaW50IGZ1c2VfcmVhZGxpbmtfZm9saW8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZvbGlvICpmb2xpbylcbiBcbiBcdGZ1c2VfaW52YWxpZGF0ZV9hdGltZShpbm9kZSk7XG4gXG4rXHRyZXMgPSBmdXNlX3N0YWxlX2lub2RlX2VycihyZXMpO1xuIFx0aWYgKHJlcyBcdTAwM2MgMClcbiBcdFx0cmV0dXJuIHJlcztcbiBcbkBAIC0xOTEwLDYgKzE5MTMsMTIgQEAgc3RhdGljIGludCBmdXNlX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxuIFx0XHRyZXR1cm4gZXJyO1xuIFxuIFx0ZXJyID0gZnVzZV9kb19vcGVuKGZtLCBnZXRfbm9kZV9pZChpbm9kZSksIGZpbGUsIHRydWUpO1xuK1x0LypcbitcdCAqIEFzIGluIGZ1c2Vfb3Blbl9jb21tb24oKTogYSBwYXRoIHdhbGsgc3RhbmRzIGJlaGluZCB0aGlzIG9wZW4sXG4rXHQgKiBzbyB0aGUgcmVmdXNhbCBpcyBFT1BFTlNUQUxFIGZvciBwYXRoX29wZW5hdCgpIHRvIGFuc3dlci5cbitcdCAqL1xuK1x0aWYgKGVyciA9PSAtRU5PRU5UKVxuK1x0XHRlcnIgPSAtRU9QRU5TVEFMRTtcbiBcdGlmICghZXJyKSB7XG4gXHRcdHN0cnVjdCBmdXNlX2ZpbGUgKmZmID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4gXG5AQCAtMjI0OSw2ICsyMjU4LDcgQEAgaW50IGZ1c2VfZG9fc2V0YXR0cihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuIFx0aWYgKGVycikge1xuIFx0XHRpZiAoZXJyID09IC1FSU5UUilcbiBcdFx0XHRmdXNlX2ludmFsaWRhdGVfYXR0cihpbm9kZSk7XG4rXHRcdGVyciA9IGZ1c2Vfc3RhbGVfaW5vZGVfZXJyKGVycik7XG4gXHRcdGdvdG8gZXJyb3I7XG4gXHR9XG4gXG5kaWZmIC0tZ2l0IGEvZnMvZnVzZS9maWxlLmMgYi9mcy9mdXNlL2ZpbGUuY1xuaW5kZXggOGQ2MTM1YTYxMDhhNC4uMzA4YjE1YzMwZjM0ZCAxMDA2NDRcbi0tLSBhL2ZzL2Z1c2UvZmlsZS5jXG4rKysgYi9mcy9mdXNlL2ZpbGUuY1xuQEAgLTI3OSw2ICsyNzksMTcgQEAgc3RhdGljIGludCBmdXNlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG4gXHRcdGZ1c2Vfc2V0X25vd3JpdGUoaW5vZGUpO1xuIFxuIFx0ZXJyID0gZnVzZV9kb19vcGVuKGZtLCBnZXRfbm9kZV9pZChpbm9kZSksIGZpbGUsIGZhbHNlKTtcbitcdC8qXG4rXHQgKiBUaGlzIG9wZW4gcmVhY2hlZCB0aGUgc2VydmVyIHRocm91Z2ggYSBwYXRoIHdhbGssIHNvIGEgcmVmdXNhbFxuK1x0ICogZm9yIHRoZSBsaXZlIG5vZGVpZCBpcyByZXBvcnRlZCBhcyBFT1BFTlNUQUxFIHJhdGhlciB0aGFuIHRoZVxuK1x0ICogRVNUQUxFIHRoZSBub2RlaWQtb25seSByZXF1ZXN0cyBzYXk6IHBhdGhfb3BlbmF0KCkgcGlja3MgdGhlXG4rXHQgKiBjaGVhcGVzdCByZXRyeSBmb3IgdGhlIHdhbGsgaW4gcHJvZ3Jlc3MsIEVDSElMRCB1bmRlciBMT09LVVBfUkNVXG4rXHQgKiBhbmQgRVNUQUxFIG90aGVyd2lzZS4gZnVzZV9maWxlX29wZW4oKSBpcyBsZWZ0IGFsb25lIGJlY2F1c2VcbitcdCAqIGZ1c2VfcHJpdl9pb2N0bF9wcmVwYXJlKCkgcmVhY2hlcyBpdCB0byBzZXJ2ZSBGU19JT0NfR0VURkxBR1MsXG4rXHQgKiB3aXRoIG5vIG9wZW4gYmVoaW5kIGl0IHRvIHRyYW5zbGF0ZSB0aGUgaW50ZXJuYWwgZXJybm8uXG4rXHQgKi9cbitcdGlmIChlcnIgPT0gLUVOT0VOVClcbitcdFx0ZXJyID0gLUVPUEVOU1RBTEU7XG4gXHRpZiAoIWVycikge1xuIFx0XHRmZiA9IGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhO1xuIFx0XHRlcnIgPSBmdXNlX2ZpbmlzaF9vcGVuKGlub2RlLCBmaWxlKTtcbmRpZmYgLS1naXQgYS9mcy9mdXNlL2Z1c2VfaS5oIGIvZnMvZnVzZS9mdXNlX2kuaFxuaW5kZXggYzhkNGM1ZjNhZjdlOC4uZTZiMjU5N2Q2ZGQ2ZiAxMDA2NDRcbi0tLSBhL2ZzL2Z1c2UvZnVzZV9pLmhcbisrKyBiL2ZzL2Z1c2UvZnVzZV9pLmhcbkBAIC0xMjUwLDYgKzEyNTAsMjUgQEAgdm9pZCBmdXNlX2lub2RlX3VuY2FjaGVkX2lvX2VuZChzdHJ1Y3QgZnVzZV9pbm9kZSAqZmkpO1xuIGludCBmdXNlX2ZpbGVfaW9fb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGlub2RlICppbm9kZSk7XG4gdm9pZCBmdXNlX2ZpbGVfaW9fcmVsZWFzZShzdHJ1Y3QgZnVzZV9maWxlICpmZiwgc3RydWN0IGlub2RlICppbm9kZSk7XG4gXG4rLypcbisgKiBSZXBvcnQgYSByZXF1ZXN0IHJlZnVzZWQgZm9yIGEgbGl2ZSBub2RlaWQgYXMgc3RhbGUuXG4rICpcbisgKiBBIHJlcXVlc3QgdGhhdCBuYW1lcyBhIG5vZGVpZCBhbmQgbm90aGluZyBlbHNlIGlzIG9ubHkgc2VudCBmb3IgYW5cbisgKiBpbm9kZSB0aGUgY2xpZW50IGhhcyBsb29rZWQgdXAgYW5kIGhvbGRzIGEgcmVmZXJlbmNlIHRvLCBhbmQgdGhlXG4rICogc2VydmVyIG93ZXMgdGhlIGNsaWVudCB0aGF0IGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuXG4rICogRU5PRU5UIGZyb20gdGhlIHNlcnZlciBkZXNjcmliZXMgdGhlIGlub2RlIGl0c2VsZiByYXRoZXIgdGhhbiBhIG5hbWVcbisgKiB0aGF0IGhhcyBnb25lIGF3YXkuIFJlcG9ydCB0aGUgaGFuZGxlIGFzIHN0YWxlLCB3aGljaCB0aGUgY2FsbGVyXG4rICogYW5zd2VycyBieSByZXNvbHZpbmcgdGhlIG5hbWUgYWdhaW4gdW5kZXIgTE9PS1VQX1JFVkFMIGFuZCBhY3Rpbmcgb25cbisgKiB3aGF0ZXZlciBpdCByZWZlcnMgdG8gbm93LiBBIG5hbWUgdGhhdCByZWFsbHkgaGFzIGdvbmUgZmFpbHMgdGhhdFxuKyAqIHNlY29uZCBsb29rdXAgYW5kIHRoZSBjYWxsZXIgc3RpbGwgc2VlcyBFTk9FTlQuXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgZnVzZV9zdGFsZV9pbm9kZV9lcnIoaW50IGVycilcbit7XG4rXHRpZiAoZXJyID09IC1FTk9FTlQpXG4rXHRcdHJldHVybiAtRVNUQUxFO1xuK1x0cmV0dXJuIGVycjtcbit9XG4rXG4gLyogZmlsZS5jICovXG4gc3RydWN0IGZ1c2VfZmlsZSAqZnVzZV9maWxlX29wZW4oc3RydWN0IGZ1c2VfbW91bnQgKmZtLCB1NjQgbm9kZWlkLFxuIFx0XHRcdFx0IHVuc2lnbmVkIGludCBvcGVuX2ZsYWdzLCBib29sIGlzZGlyKTtcbmRpZmYgLS1naXQgYS9mcy9mdXNlL2lub2RlLmMgYi9mcy9mdXNlL2lub2RlLmNcbmluZGV4IGU5NTUyYmUzNjM3YmMuLmNkZTBhNTMzNTA4OTcgMTAwNjQ0XG4tLS0gYS9mcy9mdXNlL2lub2RlLmNcbisrKyBiL2ZzL2Z1c2UvaW5vZGUuY1xuQEAgLTY2Niw3ICs2NjYsNyBAQCBzdGF0aWMgaW50IGZ1c2Vfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZilcbiBcdGVyciA9IGZ1c2Vfc2ltcGxlX3JlcXVlc3QoZm0sIFx1MDAyNmFyZ3MpO1xuIFx0aWYgKCFlcnIpXG4gXHRcdGNvbnZlcnRfZnVzZV9zdGF0ZnMoYnVmLCBcdTAwMjZvdXRhcmcuc3QpO1xuLVx0cmV0dXJuIGVycjtcbitcdHJldHVybiBmdXNlX3N0YWxlX2lub2RlX2VycihlcnIpO1xuIH1cbiBcbiBzdGF0aWMgc3RydWN0IGZ1c2Vfc3luY19idWNrZXQgKmZ1c2Vfc3luY19idWNrZXRfYWxsb2Modm9pZClcbmRpZmYgLS1naXQgYS9mcy9mdXNlL3ZpcnRpb19mcy5jIGIvZnMvZnVzZS92aXJ0aW9fZnMuY1xuaW5kZXggZjE1ZTUxNmViY2I1Yy4uN2IwM2JmODdjMmFlOCAxMDA2NDRcbi0tLSBhL2ZzL2Z1c2UvdmlydGlvX2ZzLmNcbisrKyBiL2ZzL2Z1c2UvdmlydGlvX2ZzLmNcbkBAIC03ODAsNiArNzgwLDY2IEBAIHN0YXRpYyBib29sIHZpcnRpb19mc192ZXJpZnlfcmVzcG9uc2Uoc3RydWN0IGZ1c2VfcmVxICpyZXEsIHVuc2lnbmVkIGludCBsZW4pXG4gXHRyZXR1cm4gdHJ1ZTtcbiB9XG4gXG4rLypcbisgKiBSZXBvcnQgYSByZXF1ZXN0IHJlZnVzZWQgZm9yIGEgbGl2ZSBub2RlaWQgYXMgc3RhbGUuXG4rICpcbisgKiBUaGVzZSByZXF1ZXN0cyBjYXJyeSBhIG5vZGVpZCBhbmQgbm8gbmFtZSwgc28gdGhlIGNsaWVudCBvbmx5IHNlbmRzIHRoZW0gZm9yXG4rICogYW4gaW5vZGUgaXQgaGFzIGFscmVhZHkgbG9va2VkIHVwIGFuZCBob2xkcyBhIHJlZmVyZW5jZSB0bywgYW5kIGEgc2VydmVyIG93ZXNcbisgKiB0aGUgY2xpZW50IHRoYXQgaW5vZGUgdW50aWwgaXQgaXMgc2VudCBGVVNFX0ZPUkdFVC4gQSBzZXJ2ZXIgYW5zd2VyaW5nIHdpdGhcbisgKiBFTk9FTlQgaXMgZGVzY3JpYmluZyBhIGhhbmRsZSBpdCB3YXMgb2JsaWdlZCB0byBob25vdXIgcmF0aGVyIHRoYW4gYSBuYW1lXG4rICogdGhhdCBoYXMgZ29uZSBhd2F5LCBhbmQgdGhlIGNhbGxlciBoYXMgbm8gcmVhc29uIHRvIGRvdWJ0IGl0LlxuKyAqXG4rICogU2F5aW5nIHRoZSBoYW5kbGUgaXMgc3RhbGUgaXMgc29tZXRoaW5nIHRoZSBjYWxsZXIga25vd3MgaG93IHRvIGFuc3dlcjogaXRcbisgKiByZXBlYXRzIHRoZSBsb29rdXAgdW5kZXIgTE9PS1VQX1JFVkFMIGFuZCBhY3RzIG9uIHdoYXRldmVyIHRoZSBuYW1lIHJlZmVycyB0b1xuKyAqIG5vdy4gQSBuYW1lIHRoYXQgZ2VudWluZWx5IGhhcyBnb25lIGZhaWxzIHRoZSByZXRyaWVkIGxvb2t1cCwgc28gYSBjYWxsZXJcbisgKiBzdGlsbCBsZWFybnMgaXQgaXMgZ29uZS4gcmV0cnlfZXN0YWxlKCkgaXMgd2hhdCBkb2VzIHRoaXMsIGFuZCBmcy9uYW1laS5jLFxuKyAqIGZzL29wZW4uYywgZnMvc3RhdC5jLCBmcy9zdGF0ZnMuYywgZnMvdXRpbWVzLmMgYW5kIGZzL3hhdHRyLmMgYWxsIHJlYWNoIGl0LFxuKyAqIHdoaWNoIGlzIHdoYXQgbWFrZXMgdGhlIGNvbnZlcnNpb24gdXNlZnVsIHJhdGhlciB0aGFuIGEgcmVuYW1lIG9mIHRoZSBlcnJvci5cbisgKlxuKyAqIEEgcmVxdWVzdCB0aGF0IG5hbWVzIHNvbWV0aGluZyB3aGljaCBjYW4gaXRzZWxmIGJlIGFic2VudCBpcyBsZWZ0IGFsb25lLFxuKyAqIGJlY2F1c2UgRU5PRU5UIGlzIHRoZW4gYW1iaWd1b3VzIGFuZCBpcyBmcmVxdWVudGx5IHRoZSBhbnN3ZXIgdGhlIGNhbGxlclxuKyAqIGFza2VkIGZvci4gRlVTRV9MT09LVVAgcmVwb3J0cyBhIG1pc3NpbmcgbmFtZSBpbiBhIGxpdmluZyBkaXJlY3RvcnkgYW5kIHRoZVxuKyAqIGRpcmVjdG9yeSBvcGVyYXRpb25zIGNhcnJ5IGEgcGFyZW50IG5vZGVpZCBiZXNpZGUgb25lLCBzbyBuZWl0aGVyIGNhbiBiZVxuKyAqIHJlYWQgYXMgYSBzdGF0ZW1lbnQgYWJvdXQgdGhlIGlub2RlLiBUaGUgZXh0ZW5kZWQgYXR0cmlidXRlIHJlcXVlc3RzIGJlbG9uZ1xuKyAqIHdpdGggdGhlbTogdGhleSBjYXJyeSBhbiBhdHRyaWJ1dGUgbmFtZSwgYW5kIHdoaWxlIGEgc2VydmVyIHNob3VsZCByZXBvcnQgYVxuKyAqIG1pc3NpbmcgYXR0cmlidXRlIGFzIEVOT0RBVEEsIG9uZSB0aGF0IGFuc3dlcnMgRU5PRU5UIGluc3RlYWQgd291bGQgaGF2ZSBhXG4rICogY29ycmVjdCByZXBseSB0dXJuZWQgaW50byBhIHJldHJ5IHRoYXQgY2Fubm90IHN1Y2NlZWQuXG4rICpcbisgKiBSZXF1ZXN0cyBhZ2FpbnN0IGFuIGFscmVhZHkgb3BlbiBkZXNjcmlwdG9yIGFyZSBhbHNvIGxlZnQgYWxvbmUsIHNpbmNlIHRoZXJlXG4rICogaXMgbm8gZXF1aXZhbGVudCByZXRyeSB0byByZWFjaCBhbmQgY29udmVydGluZyB0aGUgZXJyb3Igd291bGQgcmVuYW1lIGFcbisgKiBmYWlsdXJlIHJhdGhlciB0aGFuIHJlcGFpciBpdCwgYW5kIEZVU0VfSU9DVEwgYW5kIEZVU0VfUE9MTCBoYW5kIHRoZVxuKyAqIHNlcnZlcidzIGVycm5vIHRvIHVzZXJzcGFjZSB2ZXJiYXRpbS5cbisgKi9cbitzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfZml4dXBfc3RhbGVfZXJyb3Ioc3RydWN0IGZ1c2VfcmVxICpyZXEpXG4re1xuK1x0aWYgKHJlcS1cdTAwM2VvdXQuaC5lcnJvciAhPSAtRU5PRU5UKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRzd2l0Y2ggKHJlcS1cdTAwM2Vpbi5oLm9wY29kZSkge1xuK1x0Y2FzZSBGVVNFX09QRU46XG4rXHRjYXNlIEZVU0VfT1BFTkRJUjpcbitcdFx0LypcbitcdFx0ICogQW4gb3BlbiBzYXlzIEVPUEVOU1RBTEUsIGFuZCBwYXRoX29wZW5hdCgpIGRlY2lkZXMgd2hhdCB0aGVcbitcdFx0ICogd2FsayBpbiBwcm9ncmVzcyBzaG91bGQgbWFrZSBvZiBpdDogRUNISUxEIHVuZGVyIExPT0tVUF9SQ1VcbitcdFx0ICogc28gaXQgZHJvcHMgdG8gUkVGLXdhbGssIEVTVEFMRSBvdGhlcndpc2Ugc28gdGhlIG5hbWUgaXNcbitcdFx0ICogcmVzb2x2ZWQgYWdhaW4gdW5kZXIgTE9PS1VQX1JFVkFMLiBOYW1pbmcgRVNUQUxFIGhlcmUgd291bGRcbitcdFx0ICogdGFrZSB0aGUgc2Vjb25kIGluIGJvdGggY2FzZXMgYW5kIHNraXAgYSBjaGVhcGVyIHJldHJ5LlxuK1x0XHQgKi9cbitcdFx0cmVxLVx1MDAzZW91dC5oLmVycm9yID0gLUVPUEVOU1RBTEU7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBGVVNFX0dFVEFUVFI6XG4rXHRjYXNlIEZVU0VfU0VUQVRUUjpcbitcdGNhc2UgRlVTRV9SRUFETElOSzpcbitcdGNhc2UgRlVTRV9TVEFURlM6XG4rXHRcdC8qXG4rXHRcdCAqIE5vdGhpbmcgdHJhbnNsYXRlcyBFT1BFTlNUQUxFIG91dHNpZGUgdGhlIG9wZW4gcGF0aCwgc29cbitcdFx0ICogdGhlc2Ugc2F5IEVTVEFMRSBkaXJlY3RseSwgd2hpY2ggcmV0cnlfZXN0YWxlKCkgYW5zd2Vycy5cbitcdFx0ICovXG4rXHRcdHJlcS1cdTAwM2VvdXQuaC5lcnJvciA9IC1FU1RBTEU7XG4rXHRcdGJyZWFrO1xuK1x0fVxuK31cbitcbiAvKiBXb3JrIGZ1bmN0aW9uIGZvciByZXF1ZXN0IGNvbXBsZXRpb24gKi9cbiBzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZShzdHJ1Y3QgZnVzZV9yZXEgKnJlcSxcbiBcdFx0XHRcdCAgICAgICBzdHJ1Y3QgdmlydGlvX2ZzX3ZxICpmc3ZxKVxuQEAgLTgxMCw2ICs4NzAsOCBAQCBzdGF0aWMgdm9pZCB2aXJ0aW9fZnNfcmVxdWVzdF9jb21wbGV0ZShzdHJ1Y3QgZnVzZV9yZXEgKnJlcSxcbiBcbiBcdGNsZWFyX2JpdChGUl9TRU5ULCBcdTAwMjZyZXEtXHUwMDNlZmxhZ3MpO1xuIFxuK1x0dmlydGlvX2ZzX2ZpeHVwX3N0YWxlX2Vycm9yKHJlcSk7XG4rXG4gXHRmdXNlX3JlcXVlc3RfZW5kKHJlcSk7XG4gXHRzcGluX2xvY2soXHUwMDI2ZnN2cS1cdTAwM2Vsb2NrKTtcbiBcdGRlY19pbl9mbGlnaHRfcmVxKGZzdnEpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZVxuaW5kZXggZmI1MTYwM2ZlNDE5OC4uOWNiMzA0ODEyOGQ1YiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvLmdpdGlnbm9yZVxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS8uZ2l0aWdub3JlXG5AQCAtMSw0ICsxLDYgQEBcbiAjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbitmdXNlX2FjbF9jYWNoZV90ZXN0XG4gZnVzZV9tbnRcbitmdXNlX2VzdGFsZV90ZXN0XG4gZnVzZWN0bF90ZXN0XG4gd3JpdGVfZXh0ZW5kX2VvZl90ZXN0XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvTWFrZWZpbGVcbmluZGV4IDk1YTFlZTk0N2NhNzYuLmY1NjRjYjM3YjNhNWIgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL01ha2VmaWxlXG5AQCAtNiwxMSArNiwxMiBAQCBURVNUX0dFTl9QUk9HUyA6PSBmdXNlY3RsX3Rlc3RcbiBURVNUX0dFTl9QUk9HUyArPSB3cml0ZV9leHRlbmRfZW9mX3Rlc3RcbiBURVNUX0dFTl9GSUxFUyA6PSBmdXNlX21udFxuIFxuLSMgZnVzZV9hY2xfY2FjaGVfdGVzdCByZXF1aXJlcyBsaWJmdXNlMzsgYWRkIGl0IG9ubHkgd2hlbiB0aGUgbGlicmFyeSBpcyBwcmVzZW50LlxuLUFDTF9DRkxBR1MgOj0gJChzaGVsbCBwa2ctY29uZmlnIGZ1c2UzIC0tY2ZsYWdzIDJcdTAwM2UvZGV2L251bGwpXG4tQUNMX0xETElCUyA6PSAkKHNoZWxsIHBrZy1jb25maWcgZnVzZTMgLS1saWJzIDJcdTAwM2UvZGV2L251bGwpXG4taWZuZXEgKCQoQUNMX0NGTEFHUyksKVxuKyMgVGhlc2UgdGVzdHMgcmVxdWlyZSBsaWJmdXNlMzsgYWRkIHRoZW0gb25seSB3aGVuIHRoZSBsaWJyYXJ5IGlzIHByZXNlbnQuXG4rRlVTRTNfQ0ZMQUdTIDo9ICQoc2hlbGwgcGtnLWNvbmZpZyBmdXNlMyAtLWNmbGFncyAyXHUwMDNlL2Rldi9udWxsKVxuK0ZVU0UzX0xETElCUyA6PSAkKHNoZWxsIHBrZy1jb25maWcgZnVzZTMgLS1saWJzIDJcdTAwM2UvZGV2L251bGwpXG4raWZuZXEgKCQoRlVTRTNfQ0ZMQUdTKSwpXG4gVEVTVF9HRU5fUFJPR1MgKz0gZnVzZV9hY2xfY2FjaGVfdGVzdFxuK1RFU1RfR0VOX1BST0dTICs9IGZ1c2VfZXN0YWxlX3Rlc3RcbiBlbmRpZlxuIFxuIGluY2x1ZGUgLi4vLi4vbGliLm1rXG5AQCAtMzAsNSArMzEsOCBAQCBlbmRpZlxuICQoT1VUUFVUKS9mdXNlX21udDogQ0ZMQUdTICs9ICQoVkFSX0NGTEFHUylcbiAkKE9VVFBVVCkvZnVzZV9tbnQ6IExETElCUyArPSAkKFZBUl9MRExJQlMpXG4gXG4tJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IENGTEFHUyArPSAkKEFDTF9DRkxBR1MpXG4tJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IExETElCUyArPSAkKEFDTF9MRExJQlMpXG4rJChPVVRQVVQpL2Z1c2VfYWNsX2NhY2hlX3Rlc3Q6IENGTEFHUyArPSAkKEZVU0UzX0NGTEFHUylcbiskKE9VVFBVVCkvZnVzZV9hY2xfY2FjaGVfdGVzdDogTERMSUJTICs9ICQoRlVTRTNfTERMSUJTKVxuK1xuKyQoT1VUUFVUKS9mdXNlX2VzdGFsZV90ZXN0OiBDRkxBR1MgKz0gJChGVVNFM19DRkxBR1MpXG4rJChPVVRQVVQpL2Z1c2VfZXN0YWxlX3Rlc3Q6IExETElCUyArPSAkKEZVU0UzX0xETElCUylcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mdXNlL2Z1c2VfZXN0YWxlX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2Z1c2UvZnVzZV9lc3RhbGVfdGVzdC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uODJiODQyZDNhNWY3YlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZnVzZS9mdXNlX2VzdGFsZV90ZXN0LmNcbkBAIC0wLDAgKzEsNDUwIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIFRlc3Q6IGEgcmVxdWVzdCByZWZ1c2VkIGZvciBhbiBpbm9kZSB0aGUgY2xpZW50IHN0aWxsIGhvbGRzIGEgcmVmZXJlbmNlIHRvXG4rICpcbisgKiBGVVNFX09QRU4sIEZVU0VfR0VUQVRUUiwgRlVTRV9TRVRBVFRSLCBGVVNFX1JFQURMSU5LIGFuZCBGVVNFX1NUQVRGUyBjYXJyeSBhXG4rICogbm9kZWlkIHJhdGhlciB0aGFuIGEgcGF0aC4gIFRoZSBjbGllbnQgb25seSBzZW5kcyB0aGVtIGZvciBhbiBpbm9kZSBpdCBoYXNcbisgKiBhbHJlYWR5IGxvb2tlZCB1cCBhbmQgaG9sZHMgYSByZWZlcmVuY2UgdG8sIGFuZCBhIHNlcnZlciBvd2VzIHRoZSBjbGllbnQgdGhhdFxuKyAqIGlub2RlIHVudGlsIGl0IGlzIHNlbnQgRlVTRV9GT1JHRVQuICBBIHNlcnZlciB0aGF0IGxldHMgdGhlIGlub2RlIGdvIGVhcmx5LFxuKyAqIGFzIG9uZSBiYWNraW5nIGEgc2hhcmVkIGRpcmVjdG9yeSBkb2VzIHdoZW4gdGhlIG5hbWUgaXMgcmVuYW1lZCBvdmVyLCBhbnN3ZXJzXG4rICogd2l0aCBFTk9FTlQuXG4rICpcbisgKiBPbiBhbiB1bmZpeGVkIGtlcm5lbCB0aGF0IEVOT0VOVCBpcyBwYXNzZWQgb3V0IHVuY2hhbmdlZC4gIFRoZSBwYXRoIHdhbGsgaGFzXG4rICogbm8gcmVhc29uIHRvIGRvdWJ0IGl0IGFuZCB0aGUgY2FsbGVyIGlzIHRvbGQgYSBmaWxlIGlzIG1pc3Npbmcgd2hlbiBpdCBuZXZlclxuKyAqIHN0b3BwZWQgZXhpc3RpbmcuICBDYWxsZXJzIHRoYXQgcmVhZCBhIG1pc3NpbmcgZmlsZSBhcyBhbiBlbXB0eSBvbmUgYWN0IG9uXG4rICogdGhlIGVtcHRpbmVzcy5cbisgKlxuKyAqIEZpeGVkIChmcy9mdXNlL2ZpbGUuYyBhbmQgZnMvZnVzZS9kaXIuYyk6IEVOT0VOVCBiZWNvbWVzIEVTVEFMRSwgd2hpY2hcbisgKiBkZXNjcmliZXMgdGhlIGhhbmRsZSByYXRoZXIgdGhhbiB0aGUgbmFtZS4gIGZpbGVuYW1lX2xvb2t1cCgpIGFuZFxuKyAqIGRvX2ZpbHBfb3BlbigpIGFscmVhZHkgcmV0cnkgd2l0aCBMT09LVVBfUkVWQUwgb24gRVNUQUxFLCBzbyB0aGUgbmFtZSBpc1xuKyAqIHJlc29sdmVkIGFnYWluIGFuZCB0aGUgaW5vZGUgaXQgcmVmZXJzIHRvIG5vdyBpcyB1c2VkLiAgQSBuYW1lIHRoYXQgaGFzXG4rICogZ2VudWluZWx5IGdvbmUgYXdheSBmYWlscyB0aGUgcmV0cmllZCBsb29rdXAsIHNvIEVOT0VOVCBzdGlsbCByZWFjaGVzIGFcbisgKiBjYWxsZXIgdGhhdCBkZXNlcnZlcyBpdC5cbisgKlxuKyAqIE9ubHkgcmVxdWVzdHMgcmVhY2hhYmxlIHRocm91Z2ggYSBwYXRoIHdhbGsgYXJlIGNvdmVyZWQsIGJlY2F1c2UgdGhlIHJldHJ5XG4rICogaXMgd2hhdCBtYWtlcyBFU1RBTEUgdXNlZnVsIGFuZCB0aGUgd2FsayBpcyB3aGF0IHBlcmZvcm1zIGl0LiAgQW4gb3BlcmF0aW9uXG4rICogb24gYSBkZXNjcmlwdG9yIGFscmVhZHkgb3BlbiBoYXMgbm8gZXF1aXZhbGVudCByZWNvdmVyeS5cbisgKlxuKyAqIFRlc3Qgb3V0bGluZTpcbisgKiAgMS4gTW91bnQgYSBtaW5pbWFsIEZVU0UgZnMgaG9sZGluZyBvbmUgZmlsZS5cbisgKiAgMi4gVGhlIHNlcnZlciByZWZ1c2VzIHRoZSBmaXJzdCByZXF1ZXN0IG9mIHRoZSBraW5kIHVuZGVyIHRlc3QgYW5kIGFsbG93c1xuKyAqICAgICBldmVyeSBvbmUgYWZ0ZXIgaXQsIHN0YW5kaW5nIGluIGZvciBhIHNlcnZlciB0aGF0IHJlbGVhc2VkIHRoZSBpbm9kZSBhbmRcbisgKiAgICAgaGFzIHNpbmNlIHJlc29sdmVkIHRoZSBuYW1lIGFnYWluLlxuKyAqICAzLiBvcGVuYXQoKSB0aGUgZmlsZS5cbisgKiAgICAgQnVnZ3k6ICBFTk9FTlQgcmVhY2hlcyB0aGUgY2FsbGVyLCBvbmUgb3BlbiB3YXMgYXNrZWQgZm9yLiAgRkFJTC5cbisgKiAgICAgRml4ZWQ6ICB0aGUgd2FsayByZXRyaWVzLCB0aGUgc2Vjb25kIG9wZW4gaXMgYWxsb3dlZCwgdGhlIGRlc2NyaXB0b3IgaXNcbisgKiAgICAgICAgICAgICByZXR1cm5lZCwgdHdvIG9wZW5zIHdlcmUgYXNrZWQgZm9yLiAgUEFTUy5cbisgKiAgNC4gc3RhdCgpLCBjaG1vZCgpLCByZWFkbGluaygpIGFuZCBzdGF0ZnMoKSBieSBuYW1lLCB3aGljaCBhcmUgdGhlIHNhbWVcbisgKiAgICAgcmVjb3ZlcnkgdGhyb3VnaCBGVVNFX0dFVEFUVFIsIEZVU0VfU0VUQVRUUiwgRlVTRV9SRUFETElOSyBhbmRcbisgKiAgICAgRlVTRV9TVEFURlMuICBFYWNoIGlzIHJlYWNoZWQgdGhyb3VnaCBhIHBhdGggd2Fsaywgd2hpY2ggaXMgd2hhdCBtYWtlc1xuKyAqICAgICB0aGUgcmV0cnkgYXZhaWxhYmxlLlxuKyAqICA1LiBPcGVuIGEgbmFtZSB0aGUgc2VydmVyIGRvZXMgbm90IGhhdmUgYXQgYWxsLlxuKyAqICAgICBCb3RoOiAgIEVOT0VOVCwgYmVjYXVzZSB0aGUgbG9va3VwIGZhaWxzIHJhdGhlciB0aGFuIHRoZSBvcGVuLCBhbmQgYVxuKyAqICAgICAgICAgICAgIGZpbGUgdGhhdCBpcyBhYnNlbnQgbXVzdCBzdGlsbCBsb29rIGFic2VudC5cbisgKi9cbitcbisjZGVmaW5lIF9HTlVfU09VUkNFXG4rI2RlZmluZSBGVVNFX1VTRV9WRVJTSU9OIDM0XG4rXG4rI2luY2x1ZGUgXHUwMDNjZXJybm8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NmdXNlX2xvd2xldmVsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9saW1pdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGJvb2wuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3N0YXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0dmZzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvdmZzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwiLi4vLi4va3NlbGZ0ZXN0X2hhcm5lc3MuaFwiXG4rXG4rI2RlZmluZSBGSUxFX05BTUVcdFwiaGVsZFwiXG4rI2RlZmluZSBMSU5LX05BTUVcdFwiaGVsZC1saW5rXCJcbisjZGVmaW5lIEFCU0VOVF9OQU1FXHRcIm5vLXN1Y2gtZmlsZVwiXG4rI2RlZmluZSBGSUxFX0lOT1x0MlxuKyNkZWZpbmUgTElOS19JTk9cdDNcbisjZGVmaW5lIENPTlRFTlRTXHRcInByZXNlbnRcXG5cIlxuKyNkZWZpbmUgTElOS19UQVJHRVRcdEZJTEVfTkFNRVxuK1xuKy8qXG4rICogV2hpY2ggcmVxdWVzdCB0aGUgc2VydmVyIHJlZnVzZXMsIGFuZCBob3cgbWFueSB0aW1lcy4gIFNoYXJlZCB3aXRoIHRoZVxuKyAqIGRhZW1vbiB0aHJlYWQ7IG9uZSB0ZXN0IHJ1bnMgYXQgYSB0aW1lLCBzbyBwbGFpbiBpbnRzLlxuKyAqXG4rICogRXZlcnkgb25lIG9mIHRoZXNlIG5hbWVzIGFuIGlub2RlIGJ5IG5vZGVpZCByYXRoZXIgdGhhbiBieSBuYW1lLCBzbyBhXG4rICogcmVmdXNhbCBvZiBhbnkgb2YgdGhlbSBpcyBkZXNjcmliaW5nIGEgaGFuZGxlIHJhdGhlciB0aGFuIGEgbWlzc2luZyBmaWxlLlxuKyAqIEZVU0VfTE9PS1VQIGlzIGRlbGliZXJhdGVseSBhYnNlbnQ6IGl0IGNhcnJpZXMgYSBuYW1lLCBzbyBpdHMgRU5PRU5UIGlzIGFuXG4rICogYW5zd2VyIHJhdGhlciB0aGFuIGEgZmF1bHQsIGFuZCBhYnNlbnRfbmFtZV9zdGlsbF9yZXBvcnRzX2Fic2VudCBjb3ZlcnMgaXQuXG4rICovXG4rZW51bSByZWZ1c2Vfd2hhdCB7XG4rXHRSRUZVU0VfTk9USElORyxcbitcdFJFRlVTRV9PUEVOLFxuK1x0UkVGVVNFX0dFVEFUVFIsXG4rXHRSRUZVU0VfU0VUQVRUUixcbitcdFJFRlVTRV9SRUFETElOSyxcbitcdFJFRlVTRV9TVEFURlMsXG4rfTtcbitcbitzdGF0aWMgc3RydWN0IHtcbitcdGVudW0gcmVmdXNlX3doYXQgd2hhdDtcbitcdGludCByZWZ1c2Fsc19sZWZ0O1xuK1x0aW50IG9wZW5zX3NlZW47XG4rXHRpbnQgZ2V0YXR0cnNfc2VlbjtcbitcdGludCBzZXRhdHRyc19zZWVuO1xuK1x0aW50IHJlYWRsaW5rc19zZWVuO1xuK1x0aW50IHN0YXRmc3Nfc2Vlbjtcbit9IGdfZHM7XG4rXG4rLyogVHJ1ZSBvbmNlLCBmb3IgdGhlIHJlcXVlc3QgdW5kZXIgdGVzdCwgYW5kIHRoZW4gbmV2ZXIgYWdhaW4uICovXG4rc3RhdGljIGJvb2wgcmVmdXNlX25vdyhlbnVtIHJlZnVzZV93aGF0IHdoYXQpXG4re1xuK1x0aWYgKGdfZHMud2hhdCAhPSB3aGF0IHx8IGdfZHMucmVmdXNhbHNfbGVmdCBcdTAwM2M9IDApXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdGdfZHMucmVmdXNhbHNfbGVmdC0tO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGZpbGxfYXR0cihmdXNlX2lub190IGlubywgc3RydWN0IHN0YXQgKnN0KVxuK3tcbitcdG1lbXNldChzdCwgMCwgc2l6ZW9mKCpzdCkpO1xuK1x0c3QtXHUwMDNlc3RfaW5vID0gaW5vO1xuK1x0LypcbitcdCAqIE93bmVkIGJ5IHdob2V2ZXIgcnVucyB0aGUgdGVzdCwgc28gdGhhdCBjaG1vZCgpIGlzIGEgcmVxdWVzdCB0aGVcbitcdCAqIGtlcm5lbCB3aWxsIGNhcnJ5IHRocm91Z2ggdG8gdGhlIHNlcnZlciByYXRoZXIgdGhhbiByZWZ1c2UgaXRzZWxmLlxuK1x0ICovXG4rXHRzdC1cdTAwM2VzdF91aWQgPSBnZXR1aWQoKTtcbitcdHN0LVx1MDAzZXN0X2dpZCA9IGdldGdpZCgpO1xuK1x0aWYgKGlubyA9PSBGVVNFX1JPT1RfSUQpIHtcbitcdFx0c3QtXHUwMDNlc3RfbW9kZSA9IFNfSUZESVIgfCAwNzU1O1xuK1x0XHRzdC1cdTAwM2VzdF9ubGluayA9IDI7XG4rXHR9IGVsc2UgaWYgKGlubyA9PSBMSU5LX0lOTykge1xuK1x0XHRzdC1cdTAwM2VzdF9tb2RlID0gU19JRkxOSyB8IDA3Nzc7XG4rXHRcdHN0LVx1MDAzZXN0X25saW5rID0gMTtcbitcdFx0c3QtXHUwMDNlc3Rfc2l6ZSA9IHNpemVvZihMSU5LX1RBUkdFVCkgLSAxO1xuK1x0fSBlbHNlIHtcbitcdFx0c3QtXHUwMDNlc3RfbW9kZSA9IFNfSUZSRUcgfCAwNjQ0O1xuK1x0XHRzdC1cdTAwM2VzdF9ubGluayA9IDE7XG4rXHRcdHN0LVx1MDAzZXN0X3NpemUgPSBzaXplb2YoQ09OVEVOVFMpIC0gMTtcbitcdH1cbit9XG4rXG4rc3RhdGljIHZvaWQgdF9sb29rdXAoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgcGFyZW50LCBjb25zdCBjaGFyICpuYW1lKVxuK3tcbitcdHN0cnVjdCBmdXNlX2VudHJ5X3BhcmFtIGU7XG4rXHRmdXNlX2lub190IGlubztcbitcbitcdGlmIChwYXJlbnQgIT0gRlVTRV9ST09UX0lEKVxuK1x0XHRpbm8gPSAwO1xuK1x0ZWxzZSBpZiAoIXN0cmNtcChuYW1lLCBGSUxFX05BTUUpKVxuK1x0XHRpbm8gPSBGSUxFX0lOTztcbitcdGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgTElOS19OQU1FKSlcbitcdFx0aW5vID0gTElOS19JTk87XG4rXHRlbHNlXG4rXHRcdGlubyA9IDA7XG4rXG4rXHRpZiAoIWlubykge1xuK1x0XHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbitcdG1lbXNldChcdTAwMjZlLCAwLCBzaXplb2YoZSkpO1xuK1x0ZS5pbm8gPSBpbm87XG4rXHRlLmF0dHJfdGltZW91dCA9IDA7XG4rXHRlLmVudHJ5X3RpbWVvdXQgPSAwO1xuK1x0ZmlsbF9hdHRyKGlubywgXHUwMDI2ZS5hdHRyKTtcbitcdGZ1c2VfcmVwbHlfZW50cnkocmVxLCBcdTAwMjZlKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdF9nZXRhdHRyKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubyxcbitcdFx0ICAgICAgc3RydWN0IGZ1c2VfZmlsZV9pbmZvICpmaSlcbit7XG4rXHRzdHJ1Y3Qgc3RhdCBzdDtcbitcbitcdCh2b2lkKWZpO1xuK1x0LyogVGhlIHJvb3QgaXMgbGVmdCBhbG9uZTsgcmVmdXNpbmcgaXQgd291bGQgYnJlYWsgdGhlIG1vdW50IGl0c2VsZi4gKi9cbitcdGlmIChpbm8gPT0gRklMRV9JTk8pIHtcbitcdFx0Z19kcy5nZXRhdHRyc19zZWVuKys7XG4rXHRcdGlmIChyZWZ1c2Vfbm93KFJFRlVTRV9HRVRBVFRSKSkge1xuK1x0XHRcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTtcbitcdFx0XHRyZXR1cm47XG4rXHRcdH1cbitcdH1cbitcdGZpbGxfYXR0cihpbm8sIFx1MDAyNnN0KTtcbitcdGZ1c2VfcmVwbHlfYXR0cihyZXEsIFx1MDAyNnN0LCAwKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgdF9vcGVuKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubywgc3RydWN0IGZ1c2VfZmlsZV9pbmZvICpmaSlcbit7XG4rXHRpZiAoaW5vICE9IEZJTEVfSU5PKSB7XG4rXHRcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuK1x0Z19kcy5vcGVuc19zZWVuKys7XG4rXHRpZiAocmVmdXNlX25vdyhSRUZVU0VfT1BFTikpIHtcbitcdFx0LypcbitcdFx0ICogVGhlIGlub2RlIGlzIGdvbmUgYXMgZmFyIGFzIHRoaXMgc2VydmVyIGlzIGNvbmNlcm5lZCwgZXZlblxuK1x0XHQgKiB0aG91Z2ggdGhlIGNsaWVudCBpcyBob2xkaW5nIGEgcmVmZXJlbmNlIHRvIGl0IGFuZCBhc2tlZCBieVxuK1x0XHQgKiBub2RlaWQgcmF0aGVyIHRoYW4gYnkgbmFtZS5cbitcdFx0ICovXG4rXHRcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRU5PRU5UKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1x0ZnVzZV9yZXBseV9vcGVuKHJlcSwgZmkpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0X3JlYWQoZnVzZV9yZXFfdCByZXEsIGZ1c2VfaW5vX3QgaW5vLCBzaXplX3Qgc2l6ZSwgb2ZmX3Qgb2ZmLFxuK1x0XHQgICBzdHJ1Y3QgZnVzZV9maWxlX2luZm8gKmZpKVxuK3tcbitcdHNpemVfdCBsZW4gPSBzaXplb2YoQ09OVEVOVFMpIC0gMTtcbitcbitcdCh2b2lkKWZpO1xuK1x0aWYgKGlubyAhPSBGSUxFX0lOTykge1xuK1x0XHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdGlmICgoc2l6ZV90KW9mZiBcdTAwM2U9IGxlbikge1xuK1x0XHRmdXNlX3JlcGx5X2J1ZihyZXEsIE5VTEwsIDApO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXHRpZiAob2ZmICsgc2l6ZSBcdTAwM2UgbGVuKVxuK1x0XHRzaXplID0gbGVuIC0gb2ZmO1xuK1x0ZnVzZV9yZXBseV9idWYocmVxLCBDT05URU5UUyArIG9mZiwgc2l6ZSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRfc2V0YXR0cihmdXNlX3JlcV90IHJlcSwgZnVzZV9pbm9fdCBpbm8sIHN0cnVjdCBzdGF0ICphdHRyLFxuK1x0XHQgICAgICBpbnQgdG9fc2V0LCBzdHJ1Y3QgZnVzZV9maWxlX2luZm8gKmZpKVxuK3tcbitcdHN0cnVjdCBzdGF0IHN0O1xuK1xuK1x0KHZvaWQpYXR0cjtcbitcdCh2b2lkKXRvX3NldDtcbitcdCh2b2lkKWZpO1xuK1x0aWYgKGlubyA9PSBGSUxFX0lOTykge1xuK1x0XHRnX2RzLnNldGF0dHJzX3NlZW4rKztcbitcdFx0aWYgKHJlZnVzZV9ub3coUkVGVVNFX1NFVEFUVFIpKSB7XG4rXHRcdFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpO1xuK1x0XHRcdHJldHVybjtcbitcdFx0fVxuK1x0fVxuK1x0ZmlsbF9hdHRyKGlubywgXHUwMDI2c3QpO1xuK1x0ZnVzZV9yZXBseV9hdHRyKHJlcSwgXHUwMDI2c3QsIDApO1xuK31cbitcbitzdGF0aWMgdm9pZCB0X3JlYWRsaW5rKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubylcbit7XG4rXHRpZiAoaW5vICE9IExJTktfSU5PKSB7XG4rXHRcdGZ1c2VfcmVwbHlfZXJyKHJlcSwgRUlOVkFMKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuK1x0Z19kcy5yZWFkbGlua3Nfc2VlbisrO1xuK1x0aWYgKHJlZnVzZV9ub3coUkVGVVNFX1JFQURMSU5LKSkge1xuK1x0XHRmdXNlX3JlcGx5X2VycihyZXEsIEVOT0VOVCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdGZ1c2VfcmVwbHlfcmVhZGxpbmsocmVxLCBMSU5LX1RBUkdFVCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRfc3RhdGZzKGZ1c2VfcmVxX3QgcmVxLCBmdXNlX2lub190IGlubylcbit7XG4rXHRzdHJ1Y3Qgc3RhdHZmcyBzZnM7XG4rXG4rXHQodm9pZClpbm87XG4rXHRnX2RzLnN0YXRmc3Nfc2VlbisrO1xuK1x0aWYgKHJlZnVzZV9ub3coUkVGVVNFX1NUQVRGUykpIHtcbitcdFx0ZnVzZV9yZXBseV9lcnIocmVxLCBFTk9FTlQpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRtZW1zZXQoXHUwMDI2c2ZzLCAwLCBzaXplb2Yoc2ZzKSk7XG4rXHRzZnMuZl9ic2l6ZSA9IDUxMjtcbitcdHNmcy5mX2Zyc2l6ZSA9IDUxMjtcbitcdHNmcy5mX25hbWVtYXggPSBOQU1FX01BWDtcbitcdGZ1c2VfcmVwbHlfc3RhdGZzKHJlcSwgXHUwMDI2c2ZzKTtcbit9XG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBmdXNlX2xvd2xldmVsX29wcyBmc19vcHMgPSB7XG4rXHQubG9va3VwXHRcdD0gdF9sb29rdXAsXG4rXHQuZ2V0YXR0clx0PSB0X2dldGF0dHIsXG4rXHQuc2V0YXR0clx0PSB0X3NldGF0dHIsXG4rXHQucmVhZGxpbmtcdD0gdF9yZWFkbGluayxcbitcdC5zdGF0ZnNcdFx0PSB0X3N0YXRmcyxcbitcdC5vcGVuXHRcdD0gdF9vcGVuLFxuK1x0LnJlYWRcdFx0PSB0X3JlYWQsXG4rfTtcbitcbitzdGF0aWMgdm9pZCAqcnVuX2RhZW1vbih2b2lkICphcmcpXG4re1xuK1x0ZnVzZV9zZXNzaW9uX2xvb3AoKHN0cnVjdCBmdXNlX3Nlc3Npb24gKilhcmcpO1xuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuKy8qIC0tLS0ga3NlbGZ0ZXN0IGhhcm5lc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4rXG4rRklYVFVSRShvcGVuX2VzdGFsZSkge1xuK1x0c3RydWN0IGZ1c2Vfc2Vzc2lvbiAqc2U7XG4rXHRjaGFyICAgICAgICAgICAgICAgICBtb3VudHBvaW50W1BBVEhfTUFYXTtcbitcdGNoYXIgICAgICAgICAgICAgICAgIGZpbGVfcGF0aFtQQVRIX01BWF07XG4rXHRjaGFyICAgICAgICAgICAgICAgICBsaW5rX3BhdGhbUEFUSF9NQVhdO1xuK1x0Y2hhciAgICAgICAgICAgICAgICAgYWJzZW50X3BhdGhbUEFUSF9NQVhdO1xuK1x0cHRocmVhZF90ICAgICAgICAgICAgdGhyZWFkO1xuK307XG4rXG4rRklYVFVSRV9TRVRVUChvcGVuX2VzdGFsZSlcbit7XG4rXHRjaGFyICpmdXNlX2FyZ3ZbXSA9IHsgXCJmdXNlX2VzdGFsZV90ZXN0XCIsIE5VTEwgfTtcbitcdHN0cnVjdCBmdXNlX2FyZ3MgYXJncyA9IEZVU0VfQVJHU19JTklUKDEsIGZ1c2VfYXJndik7XG4rXG4rXHRtZW1zZXQoXHUwMDI2Z19kcywgMCwgc2l6ZW9mKGdfZHMpKTtcbitcdGdfZHMud2hhdCA9IFJFRlVTRV9OT1RISU5HO1xuK1x0Z19kcy5yZWZ1c2Fsc19sZWZ0ID0gMTtcbitcbitcdHN0cmNweShzZWxmLVx1MDAzZW1vdW50cG9pbnQsIFwiL3RtcC9vcGVuX2VzdGFsZV90ZXN0X1hYWFhYWFwiKTtcbitcdGlmICghbWtkdGVtcChzZWxmLVx1MDAzZW1vdW50cG9pbnQpKVxuK1x0XHRTS0lQKHJldHVybiwgXCJta2R0ZW1wOiAlc1wiLCBzdHJlcnJvcihlcnJubykpO1xuK1xuK1x0c25wcmludGYoc2VsZi1cdTAwM2VmaWxlX3BhdGgsIHNpemVvZihzZWxmLVx1MDAzZWZpbGVfcGF0aCksXG4rXHRcdCBcIiVzL1wiIEZJTEVfTkFNRSwgc2VsZi1cdTAwM2Vtb3VudHBvaW50KTtcbitcdHNucHJpbnRmKHNlbGYtXHUwMDNlbGlua19wYXRoLCBzaXplb2Yoc2VsZi1cdTAwM2VsaW5rX3BhdGgpLFxuK1x0XHQgXCIlcy9cIiBMSU5LX05BTUUsIHNlbGYtXHUwMDNlbW91bnRwb2ludCk7XG4rXHRzbnByaW50ZihzZWxmLVx1MDAzZWFic2VudF9wYXRoLCBzaXplb2Yoc2VsZi1cdTAwM2VhYnNlbnRfcGF0aCksXG4rXHRcdCBcIiVzL1wiIEFCU0VOVF9OQU1FLCBzZWxmLVx1MDAzZW1vdW50cG9pbnQpO1xuK1xuK1x0c2VsZi1cdTAwM2VzZSA9IGZ1c2Vfc2Vzc2lvbl9uZXcoXHUwMDI2YXJncywgXHUwMDI2ZnNfb3BzLCBzaXplb2YoZnNfb3BzKSwgTlVMTCk7XG4rXHRpZiAoIXNlbGYtXHUwMDNlc2UpIHtcbitcdFx0cm1kaXIoc2VsZi1cdTAwM2Vtb3VudHBvaW50KTtcbitcdFx0U0tJUChyZXR1cm4sIFwiZnVzZV9zZXNzaW9uX25ldyBmYWlsZWRcIik7XG4rXHR9XG4rXG4rXHRpZiAoZnVzZV9zZXNzaW9uX21vdW50KHNlbGYtXHUwMDNlc2UsIHNlbGYtXHUwMDNlbW91bnRwb2ludCkpIHtcbitcdFx0ZnVzZV9zZXNzaW9uX2Rlc3Ryb3koc2VsZi1cdTAwM2VzZSk7XG4rXHRcdHJtZGlyKHNlbGYtXHUwMDNlbW91bnRwb2ludCk7XG4rXHRcdFNLSVAocmV0dXJuLCBcImZ1c2Vfc2Vzc2lvbl9tb3VudCBmYWlsZWQgKG5vIGZ1c2VybW91bnQzIG9yIG5vIHByaXZpbGVnZXMpXCIpO1xuK1x0fVxuK1xuK1x0aWYgKHB0aHJlYWRfY3JlYXRlKFx1MDAyNnNlbGYtXHUwMDNldGhyZWFkLCBOVUxMLCBydW5fZGFlbW9uLCBzZWxmLVx1MDAzZXNlKSkge1xuK1x0XHRmdXNlX3Nlc3Npb25fdW5tb3VudChzZWxmLVx1MDAzZXNlKTtcbitcdFx0ZnVzZV9zZXNzaW9uX2Rlc3Ryb3koc2VsZi1cdTAwM2VzZSk7XG4rXHRcdHJtZGlyKHNlbGYtXHUwMDNlbW91bnRwb2ludCk7XG4rXHRcdFNLSVAocmV0dXJuLCBcInB0aHJlYWRfY3JlYXRlOiAlc1wiLCBzdHJlcnJvcihlcnJubykpO1xuK1x0fVxuK1xuK1x0ZnVzZV9vcHRfZnJlZV9hcmdzKFx1MDAyNmFyZ3MpO1xuK31cbitcbitGSVhUVVJFX1RFQVJET1dOKG9wZW5fZXN0YWxlKVxuK3tcbitcdGZ1c2Vfc2Vzc2lvbl9leGl0KHNlbGYtXHUwMDNlc2UpO1xuK1x0ZnVzZV9zZXNzaW9uX3VubW91bnQoc2VsZi1cdTAwM2VzZSk7XG4rXHRwdGhyZWFkX2pvaW4oc2VsZi1cdTAwM2V0aHJlYWQsIE5VTEwpO1xuK1x0ZnVzZV9zZXNzaW9uX2Rlc3Ryb3koc2VsZi1cdTAwM2VzZSk7XG4rXHRybWRpcihzZWxmLVx1MDAzZW1vdW50cG9pbnQpO1xuK31cbitcbitURVNUX0Yob3Blbl9lc3RhbGUsIHJlZnVzZWRfb3Blbl9pc19yZXRyaWVkKVxuK3tcbitcdGludCBmZDtcbitcbitcdGdfZHMud2hhdCA9IFJFRlVTRV9PUEVOO1xuK1xuK1x0ZmQgPSBvcGVuKHNlbGYtXHUwMDNlZmlsZV9wYXRoLCBPX1JET05MWSk7XG4rXG4rXHQvKlxuK1x0ICogVGhlIHJlZnVzYWwgZGVzY3JpYmVzIGEgaGFuZGxlIHRoZSBzZXJ2ZXIgc2hvdWxkIGhhdmUgaG9ub3VyZWQsIHNvXG4rXHQgKiB0aGUgd2FsayBpcyBlbnRpdGxlZCB0byByZXNvbHZlIHRoZSBuYW1lIGFnYWluIGFuZCBvcGVuIHdoYXQgaXRcbitcdCAqIHJlZmVycyB0byBub3cuIFJlcG9ydGluZyB0aGUgZmlsZSBtaXNzaW5nIGluc3RlYWQgZW5kcyB0aGUgd2Fsay5cbitcdCAqL1xuK1x0QVNTRVJUX0dFKGZkLCAwKSB7XG4rXHRcdFRIX0xPRyhcIm9wZW4gZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgb3BlbiByZXF1ZXN0KHMpXCIsXG4rXHRcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMub3BlbnNfc2Vlbik7XG4rXHR9XG4rXHRFWFBFQ1RfRVEoMiwgZ19kcy5vcGVuc19zZWVuKTtcbitcdGNsb3NlKGZkKTtcbit9XG4rXG4rVEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX2dldGF0dHJfb25fcGF0aF9pc19yZXRyaWVkKVxuK3tcbitcdHN0cnVjdCBzdGF0IHN0O1xuK1xuK1x0Z19kcy53aGF0ID0gUkVGVVNFX0dFVEFUVFI7XG4rXG4rXHQvKlxuK1x0ICogUmVhY2hlZCBieSBuYW1lLCBzbyB0aGUgd2FsayBjYW4gcmVzb2x2ZSBpdCBhZ2FpbiBhbmQgYXNrIGEgc2Vjb25kXG4rXHQgKiB0aW1lLCB0aGUgc2FtZSByZWNvdmVyeSB0aGUgb3BlbiBnZXRzLlxuK1x0ICovXG4rXHRBU1NFUlRfRVEoMCwgc3RhdChzZWxmLVx1MDAzZWZpbGVfcGF0aCwgXHUwMDI2c3QpKSB7XG4rXHRcdFRIX0xPRyhcInN0YXQgZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgZ2V0YXR0ciByZXF1ZXN0KHMpXCIsXG4rXHRcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMuZ2V0YXR0cnNfc2Vlbik7XG4rXHR9XG4rXHRFWFBFQ1RfR1QoZ19kcy5nZXRhdHRyc19zZWVuLCAxKTtcbit9XG4rXG4rVEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX3NldGF0dHJfb25fcGF0aF9pc19yZXRyaWVkKVxuK3tcbitcdGdfZHMud2hhdCA9IFJFRlVTRV9TRVRBVFRSO1xuK1xuK1x0LypcbitcdCAqIGNobW9kKCkgcmVhY2hlcyB0aGUgaW5vZGUgYnkgbmFtZSwgc28gdGhlIHNhbWUgcmV0cnkgYXBwbGllczogdGhlXG4rXHQgKiByZWZ1c2FsIGRlc2NyaWJlcyBhIGhhbmRsZSBhbmQgdGhlIHdhbGsgbWF5IHJlc29sdmUgdGhlIG5hbWUgYWdhaW4uXG4rXHQgKi9cbitcdEFTU0VSVF9FUSgwLCBjaG1vZChzZWxmLVx1MDAzZWZpbGVfcGF0aCwgMDYwMCkpIHtcbitcdFx0VEhfTE9HKFwiY2htb2QgZmFpbGVkIHdpdGggJXMgYWZ0ZXIgJWQgc2V0YXR0ciByZXF1ZXN0KHMpXCIsXG4rXHRcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMuc2V0YXR0cnNfc2Vlbik7XG4rXHR9XG4rXHRFWFBFQ1RfR1QoZ19kcy5zZXRhdHRyc19zZWVuLCAxKTtcbit9XG4rXG4rVEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX3JlYWRsaW5rX29uX3BhdGhfaXNfcmV0cmllZClcbit7XG4rXHRjaGFyIGJ1ZltQQVRIX01BWF07XG4rXHRzc2l6ZV90IG47XG4rXG4rXHRnX2RzLndoYXQgPSBSRUZVU0VfUkVBRExJTks7XG4rXG4rXHRuID0gcmVhZGxpbmsoc2VsZi1cdTAwM2VsaW5rX3BhdGgsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKTtcbitcdEFTU0VSVF9HRShuLCAwKSB7XG4rXHRcdFRIX0xPRyhcInJlYWRsaW5rIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHJlYWRsaW5rIHJlcXVlc3QocylcIixcbitcdFx0ICAgICAgIHN0cmVycm9yKGVycm5vKSwgZ19kcy5yZWFkbGlua3Nfc2Vlbik7XG4rXHR9XG4rXHRidWZbbl0gPSAnXFwwJztcbitcdEVYUEVDVF9TVFJFUShMSU5LX1RBUkdFVCwgYnVmKTtcbitcdEVYUEVDVF9HVChnX2RzLnJlYWRsaW5rc19zZWVuLCAxKTtcbit9XG4rXG4rVEVTVF9GKG9wZW5fZXN0YWxlLCByZWZ1c2VkX3N0YXRmc19vbl9wYXRoX2lzX3JldHJpZWQpXG4re1xuK1x0c3RydWN0IHN0YXRmcyBzZnM7XG4rXG4rXHRnX2RzLndoYXQgPSBSRUZVU0VfU1RBVEZTO1xuK1xuK1x0LypcbitcdCAqIHN0YXRmcygpIGRlc2NyaWJlcyB0aGUgbW91bnQgcmF0aGVyIHRoYW4gdGhlIGZpbGUsIGJ1dCBpdCBpcyBzdGlsbFxuK1x0ICogcmVhY2hlZCB0aHJvdWdoIGEgcGF0aCB3YWxrLCBzbyBhIHJlZnVzYWwgdGhhdCBuYW1lcyBhIGhhbmRsZSBpc1xuK1x0ICogcmV0cmllZCB0aGUgc2FtZSB3YXkuXG4rXHQgKi9cbitcdEFTU0VSVF9FUSgwLCBzdGF0ZnMoc2VsZi1cdTAwM2VmaWxlX3BhdGgsIFx1MDAyNnNmcykpIHtcbitcdFx0VEhfTE9HKFwic3RhdGZzIGZhaWxlZCB3aXRoICVzIGFmdGVyICVkIHN0YXRmcyByZXF1ZXN0KHMpXCIsXG4rXHRcdCAgICAgICBzdHJlcnJvcihlcnJubyksIGdfZHMuc3RhdGZzc19zZWVuKTtcbitcdH1cbitcdEVYUEVDVF9HVChnX2RzLnN0YXRmc3Nfc2VlbiwgMSk7XG4rfVxuK1xuK1RFU1RfRihvcGVuX2VzdGFsZSwgYWJzZW50X25hbWVfc3RpbGxfcmVwb3J0c19hYnNlbnQpXG4re1xuK1x0aW50IGZkO1xuK1xuK1x0LypcbitcdCAqIEhlcmUgaXQgaXMgdGhlIGxvb2t1cCB0aGF0IGZhaWxzIHJhdGhlciB0aGFuIHRoZSBvcGVuLCBzbyBub3RoaW5nIGlzXG4rXHQgKiBiZWluZyBkZXNjcmliZWQgYXMgc3RhbGUgYW5kIHRoZSBjYWxsZXIgbXVzdCBzdGlsbCBiZSB0b2xkIHRoZSBuYW1lXG4rXHQgKiBpcyBub3QgdGhlcmUuXG4rXHQgKi9cbitcdGZkID0gb3BlbihzZWxmLVx1MDAzZWFic2VudF9wYXRoLCBPX1JET05MWSk7XG4rXHRBU1NFUlRfTFQoZmQsIDApO1xuK1x0RVhQRUNUX0VRKEVOT0VOVCwgZXJybm8pO1xuK31cbitcbitURVNUX0hBUk5FU1NfTUFJTlxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMDA6MDc6MjQuNjIwNDk5Mjg0WiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxODQ1MTEyODI4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5c2lzIG9mIHRoZSBGVVNFIFBhdGNoIFNlcmllcyBhbmQgS01TQU4gRnV6emluZyBOZWVkcyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gVGhlIG9iamVjdGl2ZSBpcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBGVVNFIHBhdGNoIHNlcmllcyB3YXJyYW50cyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IGl0IHByb2JhYmx5IGRvZXNuJ3QsIGJ1dCBsZXQncyBjb25maXJtLlxuXG5UaGUgcGF0Y2ggZm9jdXNlcyBvbiBlcnJvciBjb2RlIHRyYW5zbGF0aW9uIHdpdGhpbiB0aGUgRlVTRSBzdWJzeXN0ZW0uIFNwZWNpZmljYWxseSwgaXQgY2hhbmdlcyBob3cgYC1FTk9FTlRgIGlzIGhhbmRsZWQsIHJlbWFwcGluZyBpdCB0byBgLUVTVEFMRWAgb3IgYC1FT1BFTlNUQUxFYCBpbiB2YXJpb3VzIGZ1bmN0aW9ucyAoYGZ1c2VfZG9fZ2V0YXR0cmAsIGBmdXNlX3JlYWRsaW5rX2ZvbGlvYCwgYGZ1c2VfZGlyX29wZW5gLCBgZnVzZV9kb19zZXRhdHRyYCwgYGZ1c2Vfb3BlbmAsIGBmdXNlX3N0YXRmc2AsIGFuZCBgdmlydGlvX2ZzX2ZpeHVwX3N0YWxlX2Vycm9yYCkuIFRoaXMgbW9kaWZpY2F0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhlIFZGUyByZXRyeSBtZWNoYW5pc20gKGByZXRyeV9lc3RhbGUoKWAgYW5kIGBwYXRoX29wZW5hdCgpYCkgbW9yZSBlZmZlY3RpdmUgd2hlbiBkZWFsaW5nIHdpdGggc3RhbGUgbm9kZSBJRHMuXG5cbk15IGNvbmNlcm5zIHdpdGggS01TQU4gdHlwaWNhbGx5IHJldm9sdmUgYXJvdW5kIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBpbmZvcm1hdGlvbiBsZWFrcywgYW5kIHNpbWlsYXIgdnVsbmVyYWJpbGl0aWVzLiBJIG5lZWQgdG8gYXNjZXJ0YWluIGlmIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBhbnkgb2YgdGhvc2Ugcmlza3MuXG5cbkZpcnN0LCBJIGV4YW1pbmVkIHdoZXRoZXIgdGhlIHBhdGNoIGludHJvZHVjZXMgbmV3IG1lbW9yeSBhbGxvY2F0aW9ucy4gTm8sIGl0IGRvZXNuJ3QuIFNlY29uZCwgSSBjaGVja2VkIGlmIHRoZSBwYXRjaCBpcyBpbnZvbHZlZCBpbiBhbnkgY29weSB0byB1c2VyIHNwYWNlLCBjb3B5IGZyb20gdW5pbml0aWFsaXplZCBkYXRhIHRvIHRoZSBrZXJuZWwgb3IgdXNlciBidWZmZXJzLiBUaGVyZSdzIG5vIGludm9sdmVtZW50LiBUaGlyZCwgSSBpbnNwZWN0ZWQgaWYgdGhlcmUgaXMgYW55IHN0cnVjdHVyZSBwYWRkaW5nIG1vZGlmaWNhdGlvbiBvciBjb250cm9sIGZsb3cgbW9kaWZpY2F0aW9ucyB3aGljaCBjb3VsZCBhbGxvdyByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGVyZSdzIG5vIHN1Y2ggbW9kaWZpY2F0aW9uLiBUaGUgY29yZSBjaGFuZ2UgaXMgc2ltcGx5IHJlbWFwcGluZyBpbnRlZ2VyIGVycm9yIHJldHVybiBjb2Rlcy5cblxuVG8gYmUgYWJzb2x1dGVseSBzdXJlLCBJJ2xsIGdvIHRocm91Z2ggdGhlIHN0YW5kYXJkIEtNU0FOIHJpc2sgYXJlYXMgYWdhaW46XG5cbjEuICAqKktlcm5lbCBzdHJ1Y3R1cmVzIHRvIHVzZXJzcGFjZSoqOiBObyBuZXcga2VybmVsIHN0cnVjdHVyZXMgYXJlIGJlaW5nIHNlbnQgdG8gdXNlciBzcGFjZSB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcyBvciBwYWRkaW5nIG1pZ2h0IGJlIGFuIGlzc3VlLlxuMi4gICoqQ29uZGl0aW9uYWwgbG9naWMgYmFzZWQgb24gdW5pbml0aWFsaXplZCBkYXRhKio6IFRoZXJlJ3Mgbm8gYnJhbmNoaW5nIG9yIGNvbmRpdGlvbmFsIGxvZ2ljIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy5cbjMuICAqKkNvbXBsZXggZGF0YSBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb24qKjogTm8gbmV3IGFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQgbGF0ZXIuXG40LiAgKipCb3VuZHMgY2hlY2tzIGFuZCBidWZmZXIgbWFuaXB1bGF0aW9ucyoqOiBUaGVyZSBhcmUgbm8gbW9kaWZpY2F0aW9ucyB0byBib3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyB0aGF0IHdvdWxkIGFsbG93IHJlYWRpbmcgdW5pbml0aWFsaXplZCBieXRlcyBmcm9tIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cbkluIHNob3J0LCB0aGlzIGlzIHByaW1hcmlseSBhIHJlbWFwcGluZyBvZiBlcnJvciBjb2RlcyB0byBlbnN1cmUgdGhlIFZGUyBwcm9wZXJseSByZXRyaWVzIHN0YWxlIGlub2Rlcy4gS01TQU4gZGV0ZWN0cyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gVGhpcyBwYXRjaCBkb2Vzbid0IGludHJvZHVjZSBhbnkgbmV3IG1lbW9yeSBhbGxvY2F0aW9ucywgY29weSBvcGVyYXRpb25zLCBidWZmZXIgbWFuaXB1bGF0aW9ucywgb3IgaW5mb3JtYXRpb24gbGVha3MuIFN0YW5kYXJkIEtBU0FOL3N5emthbGxlciBmdXp6aW5nIHNob3VsZCBiZSBzdWZmaWNpZW50IHRvIGV4ZXJjaXNlIHRoZSBGVVNFIGZpbGVzeXN0ZW0gYmVoYXZpb3IgYW5kIGVycm9yLWhhbmRsaW5nIHBhdGhzIGNvdmVyZWQgYnkgdGhpcyBwYXRjaC4gQSBkZWRpY2F0ZWQgS01TQU4gcnVuIGlzbid0IG5lY2Vzc2FyeSBoZXJlLlxuXG5Pa2F5LCBJJ20gY29uZmlkZW50IGluIHRoYXQgY29uY2x1c2lvbi4gTGV0J3MgY2FsbCB0aGUgYHNldC1yZXN1bHRzYCB0b29sIGFuZCBtYXJrIHRoaXMgYXMgbm90IHJlcXVpcmluZyBLTVNBTi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAxMjksIk91dHB1dFRva2VucyI6MTk1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTI0MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDAwOjA3OjQ2LjQ2NTYxNDg5MloiLCJTZXEiOjI0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5NTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggc2VyaWVzIG1vZGlmaWVzIGVycm9yIGNvZGUgaGFuZGxpbmcgaW4gRlVTRSBhbmQgdmlydGlvLWZzIGJ5IHRyYW5zbGF0aW5nIC1FTk9FTlQgcmVzcG9uc2VzIHRvIC1FU1RBTEUgb3IgLUVPUEVOU1RBTEUgZm9yIG9wZXJhdGlvbnMgcmVmZXJlbmNpbmcgaW5vZGVzIGJ5IG5vZGVpZCAoZS5nLiwgRlVTRV9PUEVOLCBGVVNFX09QRU5ESVIsIEZVU0VfR0VUQVRUUiwgRlVTRV9TRVRBVFRSLCBGVVNFX1JFQURMSU5LLCBGVVNFX1NUQVRGUykgdG8gZW5hYmxlIFZGUyBwYXRoIGxvb2t1cCByZXRyaWVzIChyZXRyeV9lc3RhbGUpLlxcblxcblRoaXMgY2hhbmdlIHB1cmVseSBhbHRlcnMgaW50ZWdlciByZXR1cm4gdmFsdWVzL2Vycm5vIGNvZGVzIGluIGVycm9yIHBhdGhzLiBJdCBkb2VzIG5vdCBpbnRyb2R1Y2Ugb3IgbW9kaWZ5IGFueSBtZW1vcnkgYWxsb2NhdGlvbnMsIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbnMsIGJ1ZmZlciBjb3BpZXMgdG8gdXNlcnNwYWNlLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzIG9yIGluZm9ybWF0aW9uIGRpc2Nsb3N1cmUgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOIGRldGVjdGlvbi4gQW55IGNvbnRyb2wgZmxvdyBvciBmdW5jdGlvbmFsIHJlZ3Jlc3Npb24gaXNzdWVzIGFyZSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIHRlc3RpbmcgYW5kIEtBU0FOIGJ1aWxkcy5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBzZXJpZXMgbW9kaWZpZXMgZXJyb3IgY29kZSBoYW5kbGluZyBpbiBGVVNFIGFuZCB2aXJ0aW8tZnMgYnkgdHJhbnNsYXRpbmcgLUVOT0VOVCByZXNwb25zZXMgdG8gLUVTVEFMRSBvciAtRU9QRU5TVEFMRSBmb3Igb3BlcmF0aW9ucyByZWZlcmVuY2luZyBpbm9kZXMgYnkgbm9kZWlkIChlLmcuLCBGVVNFX09QRU4sIEZVU0VfT1BFTkRJUiwgRlVTRV9HRVRBVFRSLCBGVVNFX1NFVEFUVFIsIEZVU0VfUkVBRExJTkssIEZVU0VfU1RBVEZTKSB0byBlbmFibGUgVkZTIHBhdGggbG9va3VwIHJldHJpZXMgKHJldHJ5X2VzdGFsZSkuXFxuXFxuVGhpcyBjaGFuZ2UgcHVyZWx5IGFsdGVycyBpbnRlZ2VyIHJldHVybiB2YWx1ZXMvZXJybm8gY29kZXMgaW4gZXJyb3IgcGF0aHMuIEl0IGRvZXMgbm90IGludHJvZHVjZSBvciBtb2RpZnkgYW55IG1lbW9yeSBhbGxvY2F0aW9ucywgc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucywgYnVmZmVyIGNvcGllcyB0byB1c2Vyc3BhY2UsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3Mgb3IgaW5mb3JtYXRpb24gZGlzY2xvc3VyZSB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4gZGV0ZWN0aW9uLiBBbnkgY29udHJvbCBmbG93IG9yIGZ1bmN0aW9uYWwgcmVncmVzc2lvbiBpc3N1ZXMgYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQgdGVzdGluZyBhbmQgS0FTQU4gYnVpbGRzLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowp89kd[1] Phase: Succeeded StartedAt: 2026-08-28 00:07:58 +0000 UTC FinishedAt: 2026-08-28 00:07:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-28 00:07:58 +0000 UTC FinishedAt: 2026-08-28 00:07:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[2] Phase: Succeeded StartedAt: 2026-08-28 00:07:58 +0000 UTC FinishedAt: 2026-08-28 03:50:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-28 00:07:58 +0000 UTC FinishedAt: 2026-08-28 03:50:59 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-28 00:07:58 +0000 UTC FinishedAt: 2026-08-28 00:08:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-28 00:07:58 +0000 UTC FinishedAt: 2026-08-28 00:08:02 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},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-workflowp89kd/series-workflowp89kd-convert-artifact-3799260037/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-28 00:08:08 +0000 UTC FinishedAt: 2026-08-28 00:27:05 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-28 00:08:08 +0000 UTC FinishedAt: 2026-08-28 00:27:05 +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:*a6050f08-e02c-4f66-aa74-d8e864af75c9,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-workflowp89kd/series-workflowp89kd-convert-artifact-3799260037/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": "c735bc14-be43-4216-aab9-f2eccf11d211", "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-workflowp89kd/series-workflowp89kd-build-action-3543324459/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-28 00:08:08 +0000 UTC FinishedAt: 2026-08-28 00:26:55 +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:*a6050f08-e02c-4f66-aa74-d8e864af75c9,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-workflowp89kd/series-workflowp89kd-convert-artifact-3799260037/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": "c735bc14-be43-4216-aab9-f2eccf11d211", "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-workflowp89kd/series-workflowp89kd-build-action-3543324459/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-28 00:27:05 +0000 UTC FinishedAt: 2026-08-28 00:27:05 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-28 00:27:05 +0000 UTC FinishedAt: 2026-08-28 00:27:05 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-28 00:27:05 +0000 UTC FinishedAt: 2026-08-28 00:27:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-28 00:27:05 +0000 UTC FinishedAt: 2026-08-28 00:27:10 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},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-workflowp89kd/series-workflowp89kd-convert-artifact-1391239264/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-28 00:27:16 +0000 UTC FinishedAt: 2026-08-28 00:29:10 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-28 00:27:16 +0000 UTC FinishedAt: 2026-08-28 00:29:00 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*c735bc14-be43-4216-aab9-f2eccf11d211,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-workflowp89kd/series-workflowp89kd-build-action-3543324459/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-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-28 00:29:10 +0000 UTC FinishedAt: 2026-08-28 00:29:10 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-28 00:29:10 +0000 UTC FinishedAt: 2026-08-28 00:29:10 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-28 00:29:10 +0000 UTC FinishedAt: 2026-08-28 00:45:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-28 00:29:10 +0000 UTC FinishedAt: 2026-08-28 00:45:51 +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:*a6050f08-e02c-4f66-aa74-d8e864af75c9,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-workflowp89kd/series-workflowp89kd-convert-artifact-1391239264/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": "a3f36dc7-db4f-408a-a89c-e3483d19643b", "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-workflowp89kd/series-workflowp89kd-build-action-2908687644/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-28 00:29:10 +0000 UTC FinishedAt: 2026-08-28 00:45:41 +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:*a6050f08-e02c-4f66-aa74-d8e864af75c9,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-workflowp89kd/series-workflowp89kd-convert-artifact-1391239264/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": "a3f36dc7-db4f-408a-a89c-e3483d19643b", "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-workflowp89kd/series-workflowp89kd-build-action-2908687644/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-28 00:45:51 +0000 UTC FinishedAt: 2026-08-28 00:45:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-28 00:45:51 +0000 UTC FinishedAt: 2026-08-28 00:45:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-28 00:45:51 +0000 UTC FinishedAt: 2026-08-28 00:47:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-28 00:45:51 +0000 UTC FinishedAt: 2026-08-28 00:47:41 +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:*a3f36dc7-db4f-408a-a89c-e3483d19643b,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-workflowp89kd/series-workflowp89kd-build-action-2908687644/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-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-28 00:47:51 +0000 UTC FinishedAt: 2026-08-28 03:50:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-28 00:47:51 +0000 UTC FinishedAt: 2026-08-28 03:50:59 +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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*c735bc14-be43-4216-aab9-f2eccf11d211,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*a3f36dc7-db4f-408a-a89c-e3483d19643b,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-workflowp89kd/series-workflowp89kd-build-action-3543324459/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-workflowp89kd/series-workflowp89kd-build-action-2908687644/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-28 00:47:51 +0000 UTC FinishedAt: 2026-08-28 00:48:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-28 00:47:51 +0000 UTC FinishedAt: 2026-08-28 00:47:55 +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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowp89kd/series-workflowp89kd-convert-artifact-1013671609/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-28 00:47:51 +0000 UTC FinishedAt: 2026-08-28 00:47:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-28 00:47:51 +0000 UTC FinishedAt: 2026-08-28 00:47:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-28 00:47:51 +0000 UTC FinishedAt: 2026-08-28 00:47:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-28 00:48:01 +0000 UTC FinishedAt: 2026-08-28 03:50:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowp89kd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs","kvm"],"focus_symbols":["fuse_do_setattr","fuse_open","fuse_dir_open","fuse_do_getattr","fuse_statfs","fuse_readlink_folio","virtio_fs_request_complete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"45c13f3f9e3bb15fd89ff2864c6f627a3b4b4229","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUSE_FS","VIRTIO_FS"],"series_id":"e207d03b-7c13-4124-a8de-2147db3ad6e0","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-28 00:48:01 +0000 UTC FinishedAt: 2026-08-28 03:50:49 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*c735bc14-be43-4216-aab9-f2eccf11d211,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*a3f36dc7-db4f-408a-a89c-e3483d19643b,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-workflowp89kd/series-workflowp89kd-build-action-3543324459/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-workflowp89kd/series-workflowp89kd-build-action-2908687644/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-workflowp89kd/series-workflowp89kd-convert-artifact-1013671609/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,}