Name: series-workflow8br8j Phase: Succeeded StartedAt: 2026-09-06 12:25:08 +0000 UTC FinishedAt: 2026-09-06 16:07:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[0] Phase: Succeeded StartedAt: 2026-09-06 12:25:08 +0000 UTC FinishedAt: 2026-09-06 12:29:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[0].run-triage Phase: Succeeded StartedAt: 2026-09-06 12:25:08 +0000 UTC FinishedAt: 2026-09-06 12:29:42 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "3ccdb07813829ba9487273e75d1cb238cfa774c1", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "3ccdb07813829ba9487273e75d1cb238cfa774c1", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL" ], "series_id": "178ac02d-2978-4e9e-a971-b60726da3acb" }, "track": "KASAN", "fuzz": { "focus": [ "bpf" ], "focus_symbols": [ "btf_check_ownership_depth", "btf_ownership_depth", "btf_owned_type_idx", "btf_check_and_fixup_fields", "btf_parse" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI3PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCYjMzQ7LAogICAgJiMzNDtidGZfb3duZXJzaGlwX2RlcHRoJiMzNDssCiAgICAmIzM0O2J0Zl9vd25lZF90eXBlX2lkeCYjMzQ7LAogICAgJiMzNDtidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyYjMzQ7LAogICAgJiMzNDtidGZfcGFyc2UmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCB1cGRhdGVzIHRoZSBCVEYgdmVyaWZpZXIgdG8gdmFsaWRhdGUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW5kIGVuZm9yY2UgYSBtYXhpbXVtIG93bmVyc2hpcCBkZXB0aCAoQlRGX01BWF9PV05FUlNISVBfREVQVEgpIGFjcm9zcyBCUEYgZ3JhcGggcm9vdHMgYW5kIGxvY2FsIGtwdHJzLlxuXG5NZW1vcnkgc2FmZXR5IGFuYWx5c2lzOlxuMS4gVGhlIHRlbXBvcmFyeSBkZXB0aCBhcnJheSB1c2VkIGR1cmluZyBvd25lcnNoaXAgdHJhdmVyc2FsIGlzIGFsbG9jYXRlZCB2aWEga3ZjYWxsb2MoKSwgZW5zdXJpbmcgaXQgaXMgZnVsbHkgemVyby1pbml0aWFsaXplZC5cbjIuIEFsbCBsb2NhbCB2YXJpYWJsZXMgaW4gYnRmX293bmVyc2hpcF9kZXB0aCgpLCBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKCksIGFuZCBidGZfb3duZWRfdHlwZV9pZHgoKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS5cbjMuIE5vIGRhdGEgc3RydWN0dXJlcyBvciBidWZmZXJzIGFyZSBjb3BpZWQgdG8gdXNlciBzcGFjZSwgYW5kIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHJlYWQgb3IgdXNlZCBpbiBjb25kaXRpb25hbCBicmFuY2hpbmcuXG40LiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIHBvaW50ZXIgYXJpdGhtZXRpYyBvciBhcnJheSBpbmRleGluZyBpbnRvIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgd291bGQgYmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOLlxuXG5UaGVyZWZvcmUsIHRoaXMgY2hhbmdlIGRvZXMgbm90IGludHJvZHVjZSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IG5lZWRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgQlRGIHZhbGlkYXRpb24gbG9naWMgaW4gdGhlIEJQRiBzdWJzeXN0ZW0gYnkgcmVwbGFjaW5nIHRoZSBncmFwaCByb290IGFjeWNsaWNpdHkgY2hlY2sgd2l0aCBhIG5ldyBvd25lcnNoaXAgZGVwdGggYW5kIGN5Y2xlIGRldGVjdGlvbiBhbGdvcml0aG0gKGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGggYW5kIGJ0Zl9vd25lcnNoaXBfZGVwdGgpIGNvdmVyaW5nIGJvdGggZ3JhcGggcm9vdHMgYW5kIGxvY2FsIGtwdHJzLiBUaGVzZSBjaGFuZ2VzIGFyZSByZWFjaGFibGUgdmlhIHRoZSBCUEZfQlRGX0xPQUQgY29tbWFuZCBpbiB0aGUgYnBmKCkgc3lzdGVtIGNhbGwgYW5kIHdhcnJhbnQgZnV6emluZyB0byB2ZXJpZnkgZ3JhcGggdHJhdmVyc2FsIGNvcnJlY3RuZXNzIGFuZCBib3VuZCBlbmZvcmNlbWVudC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxMjoyNzwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDdiNWI4ZjY3NjU3OTJiMzY4NjAwYWU1YTY0YmZiNzdiZDExYTkyZTlcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU3VuIFNlcCA2IDEyOjI3OjMyIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvYnRmLmMgYi9rZXJuZWwvYnBmL2J0Zi5jXG5pbmRleCA5YzJjYWIwOGJiNzk0Li4zYzUwOGViYjI0Mzg0IDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9idGYuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9idGYuY1xuQEAgLTQyNjksMTMgJiM0Mzs0MjY5LDEwIEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG4ge1xuIFx0aW50IGk7XG4gXG4tXHQvKiBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgdGhhdCBzaWduaWZ5IG93bmVyc2hpcCBvZiBzb21lIG90aGVyIHR5cGU6XG4tXHQgKiAga3B0cl9yZWYsIGJwZl9saXN0X2hlYWQsIGJwZl9yYl9yb290LlxuLVx0ICoga3B0cl9yZWYgb25seSBzdXBwb3J0cyBzdG9yaW5nIGtlcm5lbCB0eXBlcywgd2hpY2ggY2FuJiMzOTt0IHN0b3JlXG4tXHQgKiByZWZlcmVuY2VzIHRvIHByb2dyYW0gYWxsb2NhdGVkIGxvY2FsIHR5cGVzLlxuLVx0ICpcbi1cdCAqIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBlbnN1cmUgdGhhdCBicGZfe2xpc3RfaGVhZCxyYl9yb290fSBvd25lcnNoaXBcbi1cdCAqIGRvZXMgbm90IGZvcm0gY3ljbGVzLlxuJiM0MztcdC8qXG4mIzQzO1x0ICogQ2hlY2sgZmllbGRzIHdoaWNoIHJlcXVpcmUgdGhlIGNvbXBsZXRlIEJURiBhbmQgaW5pdGlhbGl6ZSBydW50aW1lXG4mIzQzO1x0ICogbWV0YWRhdGEuIE93bmVyc2hpcCByZWxhdGlvbnNoaXBzIGFyZSB2YWxpZGF0ZWQgYWZ0ZXIgZXZlcnkgcmVjb3JkIGhhc1xuJiM0MztcdCAqIGJlZW4gZml4ZWQgdXAuXG4gXHQgKi9cbiBcdGlmIChJU19FUlJfT1JfTlVMTChyZWMpIHx8ICEocmVjLVx1MDAzZWZpZWxkX21hc2sgXHUwMDI2IChCUEZfR1JBUEhfUk9PVCB8IEJQRl9VUFRSKSkpXG4gXHRcdHJldHVybiAwO1xuQEAgLTQzMDYsNTEgJiM0Mzs0MzAzLDg4IEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG4gXHRcdGlmICghbWV0YSlcbiBcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcdFx0cmVjLVx1MDAzZWZpZWxkc1tpXS5ncmFwaF9yb290LnZhbHVlX3JlYyA9IG1ldGEtXHUwMDNlcmVjb3JkO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuIFxuLVx0XHQvKiBXZSBuZWVkIHRvIHNldCB2YWx1ZV9yZWMgZm9yIGFsbCByb290IHR5cGVzLCBidXQgbm8gbmVlZFxuLVx0XHQgKiB0byBjaGVjayBvd25lcnNoaXAgY3ljbGUgZm9yIGEgdHlwZSB1bmxlc3MgaXQmIzM5O3MgYWxzbyBhXG4tXHRcdCAqIG5vZGUgdHlwZS5cbi1cdFx0ICovXG4tXHRcdGlmICghKHJlYy1cdTAwM2VmaWVsZF9tYXNrIFx1MDAyNiBCUEZfR1JBUEhfTk9ERSkpXG4mIzQzO3N0YXRpYyBpbnQgYnRmX293bmVkX3R5cGVfaWR4KGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYixcbiYjNDM7XHRcdFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9maWVsZCAqZmllbGQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhICptZXRhO1xuJiM0MztcdHUzMiBidGZfaWQ7XG4mIzQzO1xuJiM0MztcdGlmIChmaWVsZC1cdTAwM2V0eXBlIFx1MDAyNiBCUEZfR1JBUEhfUk9PVCkge1xuJiM0MztcdFx0YnRmX2lkID0gZmllbGQtXHUwMDNlZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XG4mIzQzO1x0fSBlbHNlIGlmIChmaWVsZC1cdTAwM2V0eXBlID09IEJQRl9LUFRSX1JFRiB8fCBmaWVsZC1cdTAwM2V0eXBlID09IEJQRl9LUFRSX1BFUkNQVSkge1xuJiM0MztcdFx0aWYgKGJ0Zl9pc19rZXJuZWwoZmllbGQtXHUwMDNla3B0ci5idGYpKVxuJiM0MztcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHRcdGJ0Zl9pZCA9IGZpZWxkLVx1MDAzZWtwdHIuYnRmX2lkO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XG4mIzQzO1x0aWYgKCFtZXRhKVxuJiM0MztcdFx0cmV0dXJuIGZpZWxkLVx1MDAzZXR5cGUgXHUwMDI2IEJQRl9HUkFQSF9ST09UID8gLUVGQVVMVCA6IC1FTk9FTlQ7XG4mIzQzO1x0cmV0dXJuIG1ldGEgLSB0YWItXHUwMDNldHlwZXM7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEVhY2ggb3duZXJzaGlwIGVkZ2UgYWRkcyBrZXJuZWwgZnJhbWVzIHRocm91Z2ggYnBmX29ial9mcmVlX2ZpZWxkcygpIGFuZFxuJiM0MzsgKiBfX2JwZl9vYmpfZHJvcF9pbXBsKCkuIEtlZXAgdGhlIGJvdW5kIGRlbGliZXJhdGVseSBzbWFsbCBiZWNhdXNlIG9iamVjdFxuJiM0MzsgKiBkZXN0cnVjdGlvbiBjYW4gaXRzZWxmIHJ1biBiZWxvdyBhIEJQRiBjYWxsIGNoYWluLiBBIGZpbmFsIHBvaW50ZWUgd2l0aG91dFxuJiM0MzsgKiBzcGVjaWFsIGZpZWxkcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIGFuZCBhZGRzIG9ubHkgYVxuJiM0MzsgKiBub24tcmVjdXJzaW5nIGRyb3AuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIEJURl9NQVhfT1dORVJTSElQX0RFUFRIIDhcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgYnRmX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4mIzQzO1x0XHRcdCAgICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLCB1OCAqZGVwdGgsXG4mIzQzO1x0XHRcdCAgICAgICBpbnQgaWR4LCBpbnQgZGVwdGhfbGVmdClcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMgPSB0YWItXHUwMDNldHlwZXNbaWR4XS5yZWNvcmQ7XG4mIzQzO1x0aW50IGksIHJldCwgbWF4X2RlcHRoID0gMDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFkZXB0aF9sZWZ0KVxuJiM0MztcdFx0cmV0dXJuIC1FTE9PUDtcbiYjNDM7XHRpZiAoZGVwdGhbaWR4XSlcbiYjNDM7XHRcdGdvdG8gZG9uZTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgcmVjLVx1MDAzZWNudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHJldCA9IGJ0Zl9vd25lZF90eXBlX2lkeChidGYsIHRhYiwgXHUwMDI2cmVjLVx1MDAzZWZpZWxkc1tpXSk7XG4mIzQzO1x0XHRpZiAocmV0ID09IC1FTk9FTlQpXG4gXHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIHJldCwgZGVwdGhfbGVmdCAtIDEpO1xuJiM0MztcdFx0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRcdG1heF9kZXB0aCA9IG1heChtYXhfZGVwdGgsIHJldCk7XG4mIzQzO1x0fVxuJiM0MztcdGRlcHRoW2lkeF0gPSBtYXhfZGVwdGggJiM0MzsgMTtcbiYjNDM7ZG9uZTpcbiYjNDM7XHRyZXR1cm4gZGVwdGhbaWR4XSBcdTAwM2UgZGVwdGhfbGVmdCA/IC1FTE9PUCA6IGRlcHRoW2lkeF07XG4mIzQzO31cbiBcbi1cdFx0LyogV2UgbmVlZCB0byBlbnN1cmUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW1vbmcgYWxsIHR5cGVzLiBUaGVcbi1cdFx0ICogcHJvcGVyIHdheSB0byBkbyBpdCB3b3VsZCBiZSB0byB0b3BvbG9naWNhbGx5IHNvcnQgYWxsIEJURlxuLVx0XHQgKiBJRHMgYmFzZWQgb24gdGhlIG93bmVyc2hpcCBlZGdlcywgc2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlXG4tXHRcdCAqIGJwZl97bGlzdF9oZWFkLHJiX25vZGV9IGluIGEgdHlwZS4gSW5zdGVhZCwgd2UgdXNlIHRoZVxuLVx0XHQgKiBmb2xsb3dpbmcgcmVzYW9uaW5nOlxuLVx0XHQgKlxuLVx0XHQgKiAtIEEgdHlwZSBjYW4gb25seSBiZSBvd25lZCBieSBhbm90aGVyIHR5cGUgaW4gdXNlciBCVEYgaWYgaXRcbi1cdFx0ICogICBoYXMgYSBicGZfe2xpc3QscmJ9X25vZGUuIExldCYjMzk7cyBjYWxsIHRoZXNlIG5vZGUgdHlwZXMuXG4tXHRcdCAqIC0gQSB0eXBlIGNhbiBvbmx5IF9vd25fIGFub3RoZXIgdHlwZSBpbiB1c2VyIEJURiBpZiBpdCBoYXMgYVxuLVx0XHQgKiAgIGJwZl97bGlzdF9oZWFkLHJiX3Jvb3R9LiBMZXQmIzM5O3MgY2FsbCB0aGVzZSByb290IHR5cGVzLlxuLVx0XHQgKlxuLVx0XHQgKiBXZSBlbnN1cmUgdGhhdCBpZiBhIHR5cGUgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIGl0c1xuLVx0XHQgKiBlbGVtZW50IHR5cGVzIGNhbm5vdCBiZSByb290IHR5cGVzLlxuLVx0XHQgKlxuLVx0XHQgKiBUbyBlbnN1cmUgYWN5Y2xpY2l0eTpcbi1cdFx0ICpcbi1cdFx0ICogV2hlbiBBIGlzIGFuIHJvb3QgdHlwZSBidXQgbm90IGEgbm9kZSwgaXRzIG93bmVyc2hpcFxuLVx0XHQgKiBjaGFpbiBjYW4gYmU6XG4tXHRcdCAqXHRBIC1cdTAwM2UgQiAtXHUwMDNlIENcbi1cdFx0ICogV2hlcmU6XG4tXHRcdCAqIC0gQSBpcyBhbiByb290LCBlLmcuIGhhcyBicGZfcmJfcm9vdC5cbi1cdFx0ICogLSBCIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBlLmcuIGhhcyBicGZfcmJfbm9kZSBhbmRcbi1cdFx0ICogICBicGZfbGlzdF9oZWFkLlxuLVx0XHQgKiAtIEMgaXMgb25seSBhbiByb290LCBlLmcuIGhhcyBicGZfbGlzdF9ub2RlXG4tXHRcdCAqXG4tXHRcdCAqIFdoZW4gQSBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgc29tZSBvdGhlciB0eXBlIGFscmVhZHlcbi1cdFx0ICogb3ducyBpdCBpbiB0aGUgQlRGIGRvbWFpbiwgaGVuY2UgaXQgY2FuIG5vdCBvd25cbi1cdFx0ICogYW5vdGhlciByb290IHR5cGUgdGhyb3VnaCBhbnkgb2YgdGhlIG93bmVyc2hpcCBlZGdlcy5cbi1cdFx0ICpcdEEgLVx1MDAzZSBCXG4tXHRcdCAqIFdoZXJlOlxuLVx0XHQgKiAtIEEgaXMgYm90aCBhbiByb290IGFuZCBub2RlLlxuLVx0XHQgKiAtIEIgaXMgb25seSBhbiBub2RlLlxuLVx0XHQgKi9cbi1cdFx0aWYgKG1ldGEtXHUwMDNlcmVjb3JkLVx1MDAzZWZpZWxkX21hc2sgXHUwMDI2IEJQRl9HUkFQSF9ST09UKVxuLVx0XHRcdHJldHVybiAtRUxPT1A7XG4mIzQzO3N0YXRpYyBpbnQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4mIzQzO1x0XHRcdFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxuJiM0Mzt7XG4mIzQzO1x0dTggKmRlcHRoO1xuJiM0MztcdGludCBpLCByZXQgPSAwO1xuJiM0MztcbiYjNDM7XHRkZXB0aCA9IGt2Y2FsbG9jKHRhYi1cdTAwM2VjbnQsIHNpemVvZigqZGVwdGgpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTtcbiYjNDM7XHRpZiAoIWRlcHRoKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRhYi1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgaSxcbiYjNDM7XHRcdFx0XHRcdCAgQlRGX01BWF9PV05FUlNISVBfREVQVEgpO1xuJiM0MztcdFx0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRyZXQgPSAwO1xuIFx0fVxuLVx0cmV0dXJuIDA7XG4mIzQzO1x0a3ZmcmVlKGRlcHRoKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBfX2J0Zl9zdHJ1Y3Rfc2hvdyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbkBAIC02MDQ1LDYgJiM0Mzs2MDc5LDEwIEBAIHN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2UoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLFxuIFx0XHRcdGlmIChlcnIgXHUwMDNjIDApXG4gXHRcdFx0XHRnb3RvIGVycm91dF9tZXRhO1xuIFx0XHR9XG4mIzQzO1xuJiM0MztcdFx0ZXJyID0gYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChidGYsIHN0cnVjdF9tZXRhX3RhYik7XG4mIzQzO1x0XHRpZiAoZXJyIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRnb3RvIGVycm91dF9tZXRhO1xuIFx0fVxuIFxuIFx0ZXJyID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcdTAwMjZlbnYtXHUwMDNlbG9nKTtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuY1xuaW5kZXggYzNkMTMzYzZhMDBkNC4uNTJmYWJiZWUzZGQ1YSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcbkBAIC03MTQsNyAmIzQzOzcxNCw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfYnRmKHZvaWQpXG4gXHRcdFx0YnJlYWs7XG4gXG4gXHRcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuLVx0XHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFwmIzM0O2NoZWNrIGJ0ZlwmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfRVEoZXJyLCAwLCBcJiMzNDtjaGVjayBidGZcJiMzNDspO1xuIFx0XHRidGZfX2ZyZWUoYnRmKTtcbiBcdFx0YnJlYWs7XG4gXHR9XG5AQCAtNzczLDcgJiM0Mzs3NzMsNyBAQCBzdGF0aWMgdm9pZCB0ZXN0X2J0Zih2b2lkKVxuIFx0XHRcdGJyZWFrO1xuIFxuIFx0XHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbi1cdFx0QVNTRVJUX0VRKGVyciwgLUVMT09QLCBcJiMzNDtjaGVjayBidGZcJiMzNDspO1xuJiM0MztcdFx0QVNTRVJUX0VRKGVyciwgMCwgXCYjMzQ7Y2hlY2sgYnRmXCYjMzQ7KTtcbiBcdFx0YnRmX19mcmVlKGJ0Zik7XG4gXHRcdGJyZWFrO1xuIFx0fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uODM2NzQxNTVlM2I3NFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuY1xuQEAgLTAsMCAmIzQzOzEsMjAyIEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9idGYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU1BJTl9MT0NLIDJcbiYjNDM7I2RlZmluZSBMSVNUX0hFQUQgM1xuJiM0MzsjZGVmaW5lIExJU1RfTk9ERSA0XG4mIzQzOy8qIEtlZXAgaW4gc3luYyB3aXRoIEJURl9NQVhfT1dORVJTSElQX0RFUFRILiAqL1xuJiM0MzsjZGVmaW5lIE1BWF9PV05FUlNISVBfREVQVEggOFxuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBidGYgKmluaXRfYnRmKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnRmICpidGY7XG4mIzQzO1x0aW50IGlkO1xuJiM0MztcbiYjNDM7XHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwmIzM0O2J0Zl9fbmV3X2VtcHR5XCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdGlkID0gYnRmX19hZGRfaW50KGJ0ZiwgXCYjMzQ7aW50XCYjMzQ7LCA0LCBCVEZfSU5UX1NJR05FRCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoaWQsIDEsIFwmIzM0O2J0Zl9fYWRkX2ludFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGVycl9vdXQ7XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcJiMzNDticGZfc3Bpbl9sb2NrXCYjMzQ7LCA0KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShpZCwgU1BJTl9MT0NLLCBcJiMzNDtidGZfX2FkZF9zdHJ1Y3QgYnBmX3NwaW5fbG9ja1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGVycl9vdXQ7XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcJiMzNDticGZfbGlzdF9oZWFkXCYjMzQ7LCAxNik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfSEVBRCwgXCYjMzQ7YnRmX19hZGRfc3RydWN0IGJwZl9saXN0X2hlYWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBlcnJfb3V0O1xuJiM0MztcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCYjMzQ7YnBmX2xpc3Rfbm9kZVwmIzM0OywgMjQpO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKGlkLCBMSVNUX05PREUsIFwmIzM0O2J0Zl9fYWRkX3N0cnVjdCBicGZfbGlzdF9ub2RlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZXJyX291dDtcbiYjNDM7XHRyZXR1cm4gYnRmO1xuJiM0MztcbiYjNDM7ZXJyX291dDpcbiYjNDM7XHRidGZfX2ZyZWUoYnRmKTtcbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBhZGRfbG9jYWxfa3B0cihzdHJ1Y3QgYnRmICpidGYsIGludCBwb2ludGVlX2lkLCBjb25zdCBjaGFyICp0YWcpXG4mIzQzO3tcbiYjNDM7XHRpbnQgaWQ7XG4mIzQzO1xuJiM0MztcdGlkID0gYnRmX19hZGRfdHlwZV90YWcoYnRmLCB0YWcsIHBvaW50ZWVfaWQpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKGlkLCAwLCBcJiMzNDtidGZfX2FkZF90eXBlX3RhZ1wmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gaWQ7XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9wdHIoYnRmLCBpZCk7XG4mIzQzO1x0QVNTRVJUX0dUKGlkLCAwLCBcJiMzNDtidGZfX2FkZF9wdHJcJiMzNDspO1xuJiM0MztcdHJldHVybiBpZDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9zZWxmX2N5Y2xlKGNvbnN0IGNoYXIgKnRhZywgaW50IGV4cGVjdGVkX2VycilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBidGYgKmJ0ZjtcbiYjNDM7XHRpbnQgaWQsIGVycjtcbiYjNDM7XG4mIzQzO1x0YnRmID0gaW5pdF9idGYoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcJiMzNDtpbml0X2J0ZlwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDcsIHRhZyk7XG4mIzQzO1x0aWYgKGlkIFx1MDAzYz0gMClcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCYjMzQ7c2VsZl9jeWNsZVwmIzM0OywgOCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoaWQsIDcsIFwmIzM0O2J0Zl9fYWRkX3N0cnVjdCBzZWxmX2N5Y2xlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCYjMzQ7bmV4dFwmIzM0OywgNiwgMCwgMCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtidGZfX2FkZF9maWVsZCBzZWxmX2N5Y2xlOjpuZXh0XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbiYjNDM7XHRBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsIFwmIzM0O2NoZWNrIGJ0ZlwmIzM0Oyk7XG4mIzQzO291dDpcbiYjNDM7XHRidGZfX2ZyZWUoYnRmKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9hYmFfY3ljbGUodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBidGYgKmJ0ZjtcbiYjNDM7XHRpbnQgaWQsIGVycjtcbiYjNDM7XG4mIzQzO1x0YnRmID0gaW5pdF9idGYoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcJiMzNDtpbml0X2J0ZlwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDEwLCBcJiMzNDtrcHRyXCYjMzQ7KTtcbiYjNDM7XHRpZiAoaWQgXHUwMDNjPSAwKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDksIFwmIzM0O2twdHJcJiMzNDspO1xuJiM0MztcdGlmIChpZCBcdTAwM2M9IDApXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwmIzM0O2N5Y2xlX2FcJiMzNDssIDgpO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKGlkLCA5LCBcJiMzNDtidGZfX2FkZF9zdHJ1Y3QgY3ljbGVfYVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwmIzM0O2JcJiMzNDssIDYsIDAsIDApO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnRmX19hZGRfZmllbGQgY3ljbGVfYTo6YlwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwmIzM0O2N5Y2xlX2JcJiMzNDssIDgpO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKGlkLCAxMCwgXCYjMzQ7YnRmX19hZGRfc3RydWN0IGN5Y2xlX2JcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDthXCYjMzQ7LCA4LCAwLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2J0Zl9fYWRkX2ZpZWxkIGN5Y2xlX2I6OmFcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuJiM0MztcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXCYjMzQ7Y2hlY2sgYnRmXCYjMzQ7KTtcbiYjNDM7b3V0OlxuJiM0MztcdGJ0Zl9fZnJlZShidGYpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X21peGVkX2N5Y2xlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnRmICpidGY7XG4mIzQzO1x0aW50IGlkLCBlcnI7XG4mIzQzO1xuJiM0MztcdGJ0ZiA9IGluaXRfYnRmKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCYjMzQ7aW5pdF9idGZcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA3LCBcJiMzNDtrcHRyXCYjMzQ7KTtcbiYjNDM7XHRpZiAoaWQgXHUwMDNjPSAwKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcJiMzNDttaXhlZF9vd25lclwmIzM0OywgMjApO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKGlkLCA3LCBcJiMzNDtidGZfX2FkZF9zdHJ1Y3QgbWl4ZWRfb3duZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDtyb290XCYjMzQ7LCBMSVNUX0hFQUQsIDAsIDApO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnRmX19hZGRfZmllbGQgbWl4ZWRfb3duZXI6OnJvb3RcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDtsb2NrXCYjMzQ7LCBTUElOX0xPQ0ssIDEyOCwgMCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtidGZfX2FkZF9maWVsZCBtaXhlZF9vd25lcjo6bG9ja1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZCA9IGJ0Zl9fYWRkX2RlY2xfdGFnKGJ0ZiwgXCYjMzQ7Y29udGFpbnM6bWl4ZWRfbm9kZTpub2RlXCYjMzQ7LCA3LCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShpZCwgOCwgXCYjMzQ7YnRmX19hZGRfZGVjbF90YWcgbWl4ZWRfb3duZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcJiMzNDttaXhlZF9ub2RlXCYjMzQ7LCAzMik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoaWQsIDksIFwmIzM0O2J0Zl9fYWRkX3N0cnVjdCBtaXhlZF9ub2RlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCYjMzQ7bm9kZVwmIzM0OywgTElTVF9OT0RFLCAwLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX25vZGU6Om5vZGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDtvd25lclwmIzM0OywgNiwgMTkyLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX25vZGU6Om93bmVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbiYjNDM7XHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFwmIzM0O2NoZWNrIGJ0ZlwmIzM0Oyk7XG4mIzQzO291dDpcbiYjNDM7XHRidGZfX2ZyZWUoYnRmKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9hY3ljbGljX2RlcHRoKGludCBkZXB0aCwgaW50IGV4cGVjdGVkX2VycilcbiYjNDM7e1xuJiM0MztcdGludCBwdHJfaWRbTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxXTtcbiYjNDM7XHRpbnQgZmlyc3Rfc3RydWN0X2lkO1xuJiM0MztcdHN0cnVjdCBidGYgKmJ0ZjtcbiYjNDM7XHRpbnQgaWQsIGVyciwgaTtcbiYjNDM7XG4mIzQzO1x0YnRmID0gaW5pdF9idGYoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcJiMzNDtpbml0X2J0ZlwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0Zmlyc3Rfc3RydWN0X2lkID0gNSAmIzQzOyAyICogZGVwdGg7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgZGVwdGg7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRwdHJfaWRbaV0gPSBhZGRfbG9jYWxfa3B0cihidGYsIGZpcnN0X3N0cnVjdF9pZCAmIzQzOyBpICYjNDM7IDEsIFwmIzM0O2twdHJcJiMzNDspO1xuJiM0MztcdFx0aWYgKHB0cl9pZFtpXSBcdTAwM2M9IDApXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkZXB0aDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGNoYXIgbmFtZVsxNl07XG4mIzQzO1xuJiM0MztcdFx0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcJiMzNDtvd25lcl8lZFwmIzM0OywgaSk7XG4mIzQzO1x0XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIDgpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfRVEoaWQsIGZpcnN0X3N0cnVjdF9pZCAmIzQzOyBpLCBcJiMzNDtidGZfX2FkZF9zdHJ1Y3Qgb3duZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCYjMzQ7bmV4dFwmIzM0OywgcHRyX2lkW2ldLCAwLCAwKTtcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnRmX19hZGRfZmllbGQgb3duZXI6Om5leHRcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcJiMzNDtwbGFpbl9sZWFmXCYjMzQ7LCA0KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShpZCwgZmlyc3Rfc3RydWN0X2lkICYjNDM7IGRlcHRoLCBcJiMzNDtidGZfX2FkZF9zdHJ1Y3QgcGxhaW5fbGVhZlwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XG4mIzQzO1x0QVNTRVJUX0VRKGVyciwgZXhwZWN0ZWRfZXJyLCBcJiMzNDtjaGVjayBidGZcJiMzNDspO1xuJiM0MztvdXQ6XG4mIzQzO1x0YnRmX19mcmVlKGJ0Zik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9sb2NhbF9rcHRyX293bmVyc2hpcCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7c2VsZl9jeWNsZVwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3NlbGZfY3ljbGUoXCYjMzQ7a3B0clwmIzM0OywgLUVMT09QKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt1bnRydXN0ZWRfc2VsZl9jeWNsZVwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3NlbGZfY3ljbGUoXCYjMzQ7a3B0cl91bnRydXN0ZWRcJiMzNDssIDApO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3BlcmNwdV9zZWxmX2N5Y2xlXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfc2VsZl9jeWNsZShcJiMzNDtwZXJjcHVfa3B0clwmIzM0OywgLUVMT09QKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtBQkFfY3ljbGVcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9hYmFfY3ljbGUoKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDttaXhlZF9ncmFwaF9yb290X2N5Y2xlXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfbWl4ZWRfY3ljbGUoKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDttYXhfYWN5Y2xpY1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCwgMCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7dG9vX2RlZXBfYWN5Y2xpY1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxLCAtRUxPT1ApO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjc8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoJiMzNDssCiAgICAmIzM0O2J0Zl9vd25lcnNoaXBfZGVwdGgmIzM0OywKICAgICYjMzQ7YnRmX293bmVkX3R5cGVfaWR4JiMzNDssCiAgICAmIzM0O2J0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzJiMzNDssCiAgICAmIzM0O2J0Zl9wYXJzZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBCVEYgdmFsaWRhdGlvbiBsb2dpYyBpbiB0aGUgQlBGIHN1YnN5c3RlbSBieSByZXBsYWNpbmcgdGhlIGdyYXBoIHJvb3QgYWN5Y2xpY2l0eSBjaGVjayB3aXRoIGEgbmV3IG93bmVyc2hpcCBkZXB0aCBhbmQgY3ljbGUgZGV0ZWN0aW9uIGFsZ29yaXRobSAoYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCBhbmQgYnRmX293bmVyc2hpcF9kZXB0aCkgY292ZXJpbmcgYm90aCBncmFwaCByb290cyBhbmQgbG9jYWwga3B0cnMuIFRoZXNlIGNoYW5nZXMgYXJlIHJlYWNoYWJsZSB2aWEgdGhlIEJQRl9CVEZfTE9BRCBjb21tYW5kIGluIHRoZSBicGYoKSBzeXN0ZW0gY2FsbCBhbmQgd2FycmFudCBmdXp6aW5nIHRvIHZlcmlmeSBncmFwaCB0cmF2ZXJzYWwgY29ycmVjdG5lc3MgYW5kIGJvdW5kIGVuZm9yY2VtZW50LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgN2I1YjhmNjc2NTc5MmIzNjg2MDBhZTVhNjRiZmI3N2JkMTFhOTJlOQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTdW4gU2VwIDYgMTI6Mjc6MzIgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2J0Zi5jIGIva2VybmVsL2JwZi9idGYuYwppbmRleCA5YzJjYWIwOGJiNzk0Li4zYzUwOGViYjI0Mzg0IDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL2J0Zi5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYvYnRmLmMKQEAgLTQyNjksMTMgJiM0Mzs0MjY5LDEwIEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpCiB7CiAJaW50IGk7CiAKLQkvKiBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgdGhhdCBzaWduaWZ5IG93bmVyc2hpcCBvZiBzb21lIG90aGVyIHR5cGU6Ci0JICogIGtwdHJfcmVmLCBicGZfbGlzdF9oZWFkLCBicGZfcmJfcm9vdC4KLQkgKiBrcHRyX3JlZiBvbmx5IHN1cHBvcnRzIHN0b3Jpbmcga2VybmVsIHR5cGVzLCB3aGljaCBjYW4mIzM5O3Qgc3RvcmUKLQkgKiByZWZlcmVuY2VzIHRvIHByb2dyYW0gYWxsb2NhdGVkIGxvY2FsIHR5cGVzLgotCSAqCi0JICogSGVuY2Ugd2Ugb25seSBuZWVkIHRvIGVuc3VyZSB0aGF0IGJwZl97bGlzdF9oZWFkLHJiX3Jvb3R9IG93bmVyc2hpcAotCSAqIGRvZXMgbm90IGZvcm0gY3ljbGVzLgomIzQzOwkvKgomIzQzOwkgKiBDaGVjayBmaWVsZHMgd2hpY2ggcmVxdWlyZSB0aGUgY29tcGxldGUgQlRGIGFuZCBpbml0aWFsaXplIHJ1bnRpbWUKJiM0MzsJICogbWV0YWRhdGEuIE93bmVyc2hpcCByZWxhdGlvbnNoaXBzIGFyZSB2YWxpZGF0ZWQgYWZ0ZXIgZXZlcnkgcmVjb3JkIGhhcwomIzQzOwkgKiBiZWVuIGZpeGVkIHVwLgogCSAqLwogCWlmIChJU19FUlJfT1JfTlVMTChyZWMpIHx8ICEocmVjLSZndDtmaWVsZF9tYXNrICZhbXA7IChCUEZfR1JBUEhfUk9PVCB8IEJQRl9VUFRSKSkpCiAJCXJldHVybiAwOwpAQCAtNDMwNiw1MSAmIzQzOzQzMDMsODggQEAgaW50IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYykKIAkJaWYgKCFtZXRhKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXJlYy0mZ3Q7ZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfcmVjID0gbWV0YS0mZ3Q7cmVjb3JkOwomIzQzOwl9CiYjNDM7CXJldHVybiAwOwomIzQzO30KIAotCQkvKiBXZSBuZWVkIHRvIHNldCB2YWx1ZV9yZWMgZm9yIGFsbCByb290IHR5cGVzLCBidXQgbm8gbmVlZAotCQkgKiB0byBjaGVjayBvd25lcnNoaXAgY3ljbGUgZm9yIGEgdHlwZSB1bmxlc3MgaXQmIzM5O3MgYWxzbyBhCi0JCSAqIG5vZGUgdHlwZS4KLQkJICovCi0JCWlmICghKHJlYy0mZ3Q7ZmllbGRfbWFzayAmYW1wOyBCUEZfR1JBUEhfTk9ERSkpCiYjNDM7c3RhdGljIGludCBidGZfb3duZWRfdHlwZV9pZHgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLAomIzQzOwkJCSAgICAgIGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqbWV0YTsKJiM0MzsJdTMyIGJ0Zl9pZDsKJiM0MzsKJiM0MzsJaWYgKGZpZWxkLSZndDt0eXBlICZhbXA7IEJQRl9HUkFQSF9ST09UKSB7CiYjNDM7CQlidGZfaWQgPSBmaWVsZC0mZ3Q7Z3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7CiYjNDM7CX0gZWxzZSBpZiAoZmllbGQtJmd0O3R5cGUgPT0gQlBGX0tQVFJfUkVGIHx8IGZpZWxkLSZndDt0eXBlID09IEJQRl9LUFRSX1BFUkNQVSkgewomIzQzOwkJaWYgKGJ0Zl9pc19rZXJuZWwoZmllbGQtJmd0O2twdHIuYnRmKSkKJiM0MzsJCQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsJCWJ0Zl9pZCA9IGZpZWxkLSZndDtrcHRyLmJ0Zl9pZDsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXJldHVybiAtRU5PRU5UOwomIzQzOwl9CiYjNDM7CiYjNDM7CW1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7CiYjNDM7CWlmICghbWV0YSkKJiM0MzsJCXJldHVybiBmaWVsZC0mZ3Q7dHlwZSAmYW1wOyBCUEZfR1JBUEhfUk9PVCA/IC1FRkFVTFQgOiAtRU5PRU5UOwomIzQzOwlyZXR1cm4gbWV0YSAtIHRhYi0mZ3Q7dHlwZXM7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogRWFjaCBvd25lcnNoaXAgZWRnZSBhZGRzIGtlcm5lbCBmcmFtZXMgdGhyb3VnaCBicGZfb2JqX2ZyZWVfZmllbGRzKCkgYW5kCiYjNDM7ICogX19icGZfb2JqX2Ryb3BfaW1wbCgpLiBLZWVwIHRoZSBib3VuZCBkZWxpYmVyYXRlbHkgc21hbGwgYmVjYXVzZSBvYmplY3QKJiM0MzsgKiBkZXN0cnVjdGlvbiBjYW4gaXRzZWxmIHJ1biBiZWxvdyBhIEJQRiBjYWxsIGNoYWluLiBBIGZpbmFsIHBvaW50ZWUgd2l0aG91dAomIzQzOyAqIHNwZWNpYWwgZmllbGRzIGlzIG5vdCBwcmVzZW50IGluIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgYW5kIGFkZHMgb25seSBhCiYjNDM7ICogbm9uLXJlY3Vyc2luZyBkcm9wLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgQlRGX01BWF9PV05FUlNISVBfREVQVEggOAomIzQzOwomIzQzO3N0YXRpYyBpbnQgYnRmX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsCiYjNDM7CQkJICAgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsIHU4ICpkZXB0aCwKJiM0MzsJCQkgICAgICAgaW50IGlkeCwgaW50IGRlcHRoX2xlZnQpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjID0gdGFiLSZndDt0eXBlc1tpZHhdLnJlY29yZDsKJiM0MzsJaW50IGksIHJldCwgbWF4X2RlcHRoID0gMDsKJiM0MzsKJiM0MzsJaWYgKCFkZXB0aF9sZWZ0KQomIzQzOwkJcmV0dXJuIC1FTE9PUDsKJiM0MzsJaWYgKGRlcHRoW2lkeF0pCiYjNDM7CQlnb3RvIGRvbmU7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyByZWMtJmd0O2NudDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXJldCA9IGJ0Zl9vd25lZF90eXBlX2lkeChidGYsIHRhYiwgJmFtcDtyZWMtJmd0O2ZpZWxkc1tpXSk7CiYjNDM7CQlpZiAocmV0ID09IC1FTk9FTlQpCiAJCQljb250aW51ZTsKJiM0MzsJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CQlyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgcmV0LCBkZXB0aF9sZWZ0IC0gMSk7CiYjNDM7CQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwkJbWF4X2RlcHRoID0gbWF4KG1heF9kZXB0aCwgcmV0KTsKJiM0MzsJfQomIzQzOwlkZXB0aFtpZHhdID0gbWF4X2RlcHRoICYjNDM7IDE7CiYjNDM7ZG9uZToKJiM0MzsJcmV0dXJuIGRlcHRoW2lkeF0gJmd0OyBkZXB0aF9sZWZ0ID8gLUVMT09QIDogZGVwdGhbaWR4XTsKJiM0Mzt9CiAKLQkJLyogV2UgbmVlZCB0byBlbnN1cmUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW1vbmcgYWxsIHR5cGVzLiBUaGUKLQkJICogcHJvcGVyIHdheSB0byBkbyBpdCB3b3VsZCBiZSB0byB0b3BvbG9naWNhbGx5IHNvcnQgYWxsIEJURgotCQkgKiBJRHMgYmFzZWQgb24gdGhlIG93bmVyc2hpcCBlZGdlcywgc2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlCi0JCSAqIGJwZl97bGlzdF9oZWFkLHJiX25vZGV9IGluIGEgdHlwZS4gSW5zdGVhZCwgd2UgdXNlIHRoZQotCQkgKiBmb2xsb3dpbmcgcmVzYW9uaW5nOgotCQkgKgotCQkgKiAtIEEgdHlwZSBjYW4gb25seSBiZSBvd25lZCBieSBhbm90aGVyIHR5cGUgaW4gdXNlciBCVEYgaWYgaXQKLQkJICogICBoYXMgYSBicGZfe2xpc3QscmJ9X25vZGUuIExldCYjMzk7cyBjYWxsIHRoZXNlIG5vZGUgdHlwZXMuCi0JCSAqIC0gQSB0eXBlIGNhbiBvbmx5IF9vd25fIGFub3RoZXIgdHlwZSBpbiB1c2VyIEJURiBpZiBpdCBoYXMgYQotCQkgKiAgIGJwZl97bGlzdF9oZWFkLHJiX3Jvb3R9LiBMZXQmIzM5O3MgY2FsbCB0aGVzZSByb290IHR5cGVzLgotCQkgKgotCQkgKiBXZSBlbnN1cmUgdGhhdCBpZiBhIHR5cGUgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIGl0cwotCQkgKiBlbGVtZW50IHR5cGVzIGNhbm5vdCBiZSByb290IHR5cGVzLgotCQkgKgotCQkgKiBUbyBlbnN1cmUgYWN5Y2xpY2l0eToKLQkJICoKLQkJICogV2hlbiBBIGlzIGFuIHJvb3QgdHlwZSBidXQgbm90IGEgbm9kZSwgaXRzIG93bmVyc2hpcAotCQkgKiBjaGFpbiBjYW4gYmU6Ci0JCSAqCUEgLSZndDsgQiAtJmd0OyBDCi0JCSAqIFdoZXJlOgotCQkgKiAtIEEgaXMgYW4gcm9vdCwgZS5nLiBoYXMgYnBmX3JiX3Jvb3QuCi0JCSAqIC0gQiBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgZS5nLiBoYXMgYnBmX3JiX25vZGUgYW5kCi0JCSAqICAgYnBmX2xpc3RfaGVhZC4KLQkJICogLSBDIGlzIG9ubHkgYW4gcm9vdCwgZS5nLiBoYXMgYnBmX2xpc3Rfbm9kZQotCQkgKgotCQkgKiBXaGVuIEEgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIHNvbWUgb3RoZXIgdHlwZSBhbHJlYWR5Ci0JCSAqIG93bnMgaXQgaW4gdGhlIEJURiBkb21haW4sIGhlbmNlIGl0IGNhbiBub3Qgb3duCi0JCSAqIGFub3RoZXIgcm9vdCB0eXBlIHRocm91Z2ggYW55IG9mIHRoZSBvd25lcnNoaXAgZWRnZXMuCi0JCSAqCUEgLSZndDsgQgotCQkgKiBXaGVyZToKLQkJICogLSBBIGlzIGJvdGggYW4gcm9vdCBhbmQgbm9kZS4KLQkJICogLSBCIGlzIG9ubHkgYW4gbm9kZS4KLQkJICovCi0JCWlmIChtZXRhLSZndDtyZWNvcmQtJmd0O2ZpZWxkX21hc2sgJmFtcDsgQlBGX0dSQVBIX1JPT1QpCi0JCQlyZXR1cm4gLUVMT09QOwomIzQzO3N0YXRpYyBpbnQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsCiYjNDM7CQkJCSAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYikKJiM0Mzt7CiYjNDM7CXU4ICpkZXB0aDsKJiM0MzsJaW50IGksIHJldCA9IDA7CiYjNDM7CiYjNDM7CWRlcHRoID0ga3ZjYWxsb2ModGFiLSZndDtjbnQsIHNpemVvZigqZGVwdGgpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTsKJiM0MzsJaWYgKCFkZXB0aCkKJiM0MzsJCXJldHVybiAtRU5PTUVNOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgdGFiLSZndDtjbnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgaSwKJiM0MzsJCQkJCSAgQlRGX01BWF9PV05FUlNISVBfREVQVEgpOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlyZXQgPSAwOwogCX0KLQlyZXR1cm4gMDsKJiM0MzsJa3ZmcmVlKGRlcHRoKTsKJiM0MzsJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19idGZfc3RydWN0X3Nob3coY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsCkBAIC02MDQ1LDYgJiM0Mzs2MDc5LDEwIEBAIHN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2UoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLAogCQkJaWYgKGVyciAmbHQ7IDApCiAJCQkJZ290byBlcnJvdXRfbWV0YTsKIAkJfQomIzQzOwomIzQzOwkJZXJyID0gYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChidGYsIHN0cnVjdF9tZXRhX3RhYik7CiYjNDM7CQlpZiAoZXJyICZsdDsgMCkKJiM0MzsJCQlnb3RvIGVycm91dF9tZXRhOwogCX0KIAogCWVyciA9IGJwZl9sb2dfYXR0cl9maW5hbGl6ZShhdHRyX2xvZywgJmFtcDtlbnYtJmd0O2xvZyk7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuYwppbmRleCBjM2QxMzNjNmEwMGQ0Li41MmZhYmJlZTNkZDVhIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmMKQEAgLTcxNCw3ICYjNDM7NzE0LDcgQEAgc3RhdGljIHZvaWQgdGVzdF9idGYodm9pZCkKIAkJCWJyZWFrOwogCiAJCWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwotCQlBU1NFUlRfRVEoZXJyLCAtRUxPT1AsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzOwkJQVNTRVJUX0VRKGVyciwgMCwgJiMzNDtjaGVjayBidGYmIzM0Oyk7CiAJCWJ0Zl9fZnJlZShidGYpOwogCQlicmVhazsKIAl9CkBAIC03NzMsNyAmIzQzOzc3Myw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfYnRmKHZvaWQpCiAJCQlicmVhazsKIAogCQllcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTsKLQkJQVNTRVJUX0VRKGVyciwgLUVMT09QLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9FUShlcnIsIDAsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwogCQlidGZfX2ZyZWUoYnRmKTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uODM2NzQxNTVlM2I3NAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmMKQEAgLTAsMCAmIzQzOzEsMjAyIEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9idGYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnRmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3Rlc3RfcHJvZ3MuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIFNQSU5fTE9DSyAyCiYjNDM7I2RlZmluZSBMSVNUX0hFQUQgMwomIzQzOyNkZWZpbmUgTElTVF9OT0RFIDQKJiM0MzsvKiBLZWVwIGluIHN5bmMgd2l0aCBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSC4gKi8KJiM0MzsjZGVmaW5lIE1BWF9PV05FUlNISVBfREVQVEggOAomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYnRmICppbml0X2J0Zih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJ0ZiAqYnRmOwomIzQzOwlpbnQgaWQ7CiYjNDM7CiYjNDM7CWJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7YnRmX19uZXdfZW1wdHkmIzM0OykpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJaWQgPSBidGZfX2FkZF9pbnQoYnRmLCAmIzM0O2ludCYjMzQ7LCA0LCBCVEZfSU5UX1NJR05FRCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCAxLCAmIzM0O2J0Zl9fYWRkX2ludCYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyX291dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O2JwZl9zcGluX2xvY2smIzM0OywgNCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCBTUElOX0xPQ0ssICYjMzQ7YnRmX19hZGRfc3RydWN0IGJwZl9zcGluX2xvY2smIzM0OykpCiYjNDM7CQlnb3RvIGVycl9vdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDticGZfbGlzdF9oZWFkJiMzNDssIDE2KTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfSEVBRCwgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgYnBmX2xpc3RfaGVhZCYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyX291dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O2JwZl9saXN0X25vZGUmIzM0OywgMjQpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgTElTVF9OT0RFLCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBicGZfbGlzdF9ub2RlJiMzNDspKQomIzQzOwkJZ290byBlcnJfb3V0OwomIzQzOwlyZXR1cm4gYnRmOwomIzQzOwomIzQzO2Vycl9vdXQ6CiYjNDM7CWJ0Zl9fZnJlZShidGYpOwomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBhZGRfbG9jYWxfa3B0cihzdHJ1Y3QgYnRmICpidGYsIGludCBwb2ludGVlX2lkLCBjb25zdCBjaGFyICp0YWcpCiYjNDM7ewomIzQzOwlpbnQgaWQ7CiYjNDM7CiYjNDM7CWlkID0gYnRmX19hZGRfdHlwZV90YWcoYnRmLCB0YWcsIHBvaW50ZWVfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9HVChpZCwgMCwgJiMzNDtidGZfX2FkZF90eXBlX3RhZyYjMzQ7KSkKJiM0MzsJCXJldHVybiBpZDsKJiM0MzsJaWQgPSBidGZfX2FkZF9wdHIoYnRmLCBpZCk7CiYjNDM7CUFTU0VSVF9HVChpZCwgMCwgJiMzNDtidGZfX2FkZF9wdHImIzM0Oyk7CiYjNDM7CXJldHVybiBpZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9zZWxmX2N5Y2xlKGNvbnN0IGNoYXIgKnRhZywgaW50IGV4cGVjdGVkX2VycikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZjsKJiM0MzsJaW50IGlkLCBlcnI7CiYjNDM7CiYjNDM7CWJ0ZiA9IGluaXRfYnRmKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7aW5pdF9idGYmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA3LCB0YWcpOwomIzQzOwlpZiAoaWQgJmx0Oz0gMCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7c2VsZl9jeWNsZSYjMzQ7LCA4KTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIDcsICYjMzQ7YnRmX19hZGRfc3RydWN0IHNlbGZfY3ljbGUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O25leHQmIzM0OywgNiwgMCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBzZWxmX2N5Y2xlOjpuZXh0JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwomIzQzOwlBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzO291dDoKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfYWJhX2N5Y2xlKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnRmICpidGY7CiYjNDM7CWludCBpZCwgZXJyOwomIzQzOwomIzQzOwlidGYgPSBpbml0X2J0ZigpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCAmIzM0O2luaXRfYnRmJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgMTAsICYjMzQ7a3B0ciYjMzQ7KTsKJiM0MzsJaWYgKGlkICZsdDs9IDApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDksICYjMzQ7a3B0ciYjMzQ7KTsKJiM0MzsJaWYgKGlkICZsdDs9IDApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O2N5Y2xlX2EmIzM0OywgOCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCA5LCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBjeWNsZV9hJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtiJiMzNDssIDYsIDAsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgY3ljbGVfYTo6YiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7Y3ljbGVfYiYjMzQ7LCA4KTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIDEwLCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBjeWNsZV9iJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDthJiMzNDssIDgsIDAsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgY3ljbGVfYjo6YSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTsKJiM0MzsJQVNTRVJUX0VRKGVyciwgLUVMT09QLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKJiM0MztvdXQ6CiYjNDM7CWJ0Zl9fZnJlZShidGYpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X21peGVkX2N5Y2xlKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnRmICpidGY7CiYjNDM7CWludCBpZCwgZXJyOwomIzQzOwomIzQzOwlidGYgPSBpbml0X2J0ZigpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCAmIzM0O2luaXRfYnRmJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgNywgJiMzNDtrcHRyJiMzNDspOwomIzQzOwlpZiAoaWQgJmx0Oz0gMCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7bWl4ZWRfb3duZXImIzM0OywgMjApOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgNywgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgbWl4ZWRfb3duZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O3Jvb3QmIzM0OywgTElTVF9IRUFELCAwLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX293bmVyOjpyb290JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtsb2NrJiMzNDssIFNQSU5fTE9DSywgMTI4LCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX293bmVyOjpsb2NrJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfZGVjbF90YWcoYnRmLCAmIzM0O2NvbnRhaW5zOm1peGVkX25vZGU6bm9kZSYjMzQ7LCA3LCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIDgsICYjMzQ7YnRmX19hZGRfZGVjbF90YWcgbWl4ZWRfb3duZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O21peGVkX25vZGUmIzM0OywgMzIpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgOSwgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgbWl4ZWRfbm9kZSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7bm9kZSYjMzQ7LCBMSVNUX05PREUsIDAsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgbWl4ZWRfbm9kZTo6bm9kZSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7b3duZXImIzM0OywgNiwgMTkyLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX25vZGU6Om93bmVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwomIzQzOwlBU1NFUlRfRVEoZXJyLCAtRUxPT1AsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzO291dDoKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfYWN5Y2xpY19kZXB0aChpbnQgZGVwdGgsIGludCBleHBlY3RlZF9lcnIpCiYjNDM7ewomIzQzOwlpbnQgcHRyX2lkW01BWF9PV05FUlNISVBfREVQVEggJiM0MzsgMV07CiYjNDM7CWludCBmaXJzdF9zdHJ1Y3RfaWQ7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZjsKJiM0MzsJaW50IGlkLCBlcnIsIGk7CiYjNDM7CiYjNDM7CWJ0ZiA9IGluaXRfYnRmKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7aW5pdF9idGYmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWZpcnN0X3N0cnVjdF9pZCA9IDUgJiM0MzsgMiAqIGRlcHRoOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgZGVwdGg7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlwdHJfaWRbaV0gPSBhZGRfbG9jYWxfa3B0cihidGYsIGZpcnN0X3N0cnVjdF9pZCAmIzQzOyBpICYjNDM7IDEsICYjMzQ7a3B0ciYjMzQ7KTsKJiM0MzsJCWlmIChwdHJfaWRbaV0gJmx0Oz0gMCkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgZGVwdGg7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQljaGFyIG5hbWVbMTZdOwomIzQzOwomIzQzOwkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAmIzM0O293bmVyXyVkJiMzNDssIGkpOwomIzQzOwkJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBuYW1lLCA4KTsKJiM0MzsJCWlmICghQVNTRVJUX0VRKGlkLCBmaXJzdF9zdHJ1Y3RfaWQgJiM0MzsgaSwgJiMzNDtidGZfX2FkZF9zdHJ1Y3Qgb3duZXImIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7bmV4dCYjMzQ7LCBwdHJfaWRbaV0sIDAsIDApOwomIzQzOwkJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIG93bmVyOjpuZXh0JiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDtwbGFpbl9sZWFmJiMzNDssIDQpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgZmlyc3Rfc3RydWN0X2lkICYjNDM7IGRlcHRoLCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBwbGFpbl9sZWFmJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwomIzQzOwlBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzO291dDoKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9sb2NhbF9rcHRyX293bmVyc2hpcCh2b2lkKQomIzQzO3sKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzZWxmX2N5Y2xlJiMzNDspKQomIzQzOwkJdGVzdF9zZWxmX2N5Y2xlKCYjMzQ7a3B0ciYjMzQ7LCAtRUxPT1ApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3VudHJ1c3RlZF9zZWxmX2N5Y2xlJiMzNDspKQomIzQzOwkJdGVzdF9zZWxmX2N5Y2xlKCYjMzQ7a3B0cl91bnRydXN0ZWQmIzM0OywgMCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cGVyY3B1X3NlbGZfY3ljbGUmIzM0OykpCiYjNDM7CQl0ZXN0X3NlbGZfY3ljbGUoJiMzNDtwZXJjcHVfa3B0ciYjMzQ7LCAtRUxPT1ApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O0FCQV9jeWNsZSYjMzQ7KSkKJiM0MzsJCXRlc3RfYWJhX2N5Y2xlKCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWl4ZWRfZ3JhcGhfcm9vdF9jeWNsZSYjMzQ7KSkKJiM0MzsJCXRlc3RfbWl4ZWRfY3ljbGUoKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDttYXhfYWN5Y2xpYyYjMzQ7KSkKJiM0MzsJCXRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRILCAwKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt0b29fZGVlcF9hY3ljbGljJiMzNDspKQomIzQzOwkJdGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEggJiM0MzsgMSwgLUVMT09QKTsKJiM0Mzt9CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc4MjMKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxODEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgSW5pdGlhbCBBc3Nlc3NtZW50IG9mIHRoZSBCUEYgUGF0Y2gqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIHBhdGNoLiBNeSBpbW1lZGlhdGUgZ29hbCBpcyB0byBmaWd1cmUgb3V0IGlmIHRoaXMgd2FycmFudHMgYSBmdXp6aW5nIGNhbXBhaWduLCBhbmQgaWYgc28sIGhvdyB0byBiZXN0IGFwcHJvYWNoIGl0LiBXaGF0IGNvbmZpZ3VyYXRpb25zIGFyZSBnb2luZyB0byBiZSBtb3N0IGVmZmVjdGl2ZSwgYW5kIHdoaWNoIHNwZWNpZmljIHN5bWJvbHMgYXJlIHRoZSBtb3N0IGxpa2VseSB0YXJnZXRzIGZvciBleHBsb2l0YXRpb24/CgpGaXJzdCwgdGhlIGRpZmYgaXRzZWxmLiBPa2F5LCBpdCB0b3VjaGVzIGBrZXJuZWwvYnBmL2J0Zi5jYCBhbmQgYSBmZXcgdGVzdCBmaWxlcyB1bmRlciBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLi4uYCDigJMgdGhhdCYjMzk7cyBhbHJlYWR5IGludGVyZXN0aW5nLiBMZXQmIzM5O3MgYnJlYWsgZG93biB0aGUgY2hhbmdlczogSW4gYGtlcm5lbC9icGYvYnRmLmNgLCB3ZSBzZWUgbW9kaWZpY2F0aW9ucyB0byBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgLiBUaGVuLCBzb21lIG5ldyBoZWxwZXIgZnVuY3Rpb25zIGhhdmUgYmVlbiBpbnRyb2R1Y2VkOiBgYnRmX293bmVkX3R5cGVfaWR4YCwgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgLCBhbmQgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgLiBDcnVjaWFsbHksIHRoZXJlJiMzOTtzIGEgbmV3IGNhbGwgdG8gYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoYnRmLCBzdHJ1Y3RfbWV0YV90YWIpYCB3aXRoaW4gYGJ0Zl9wYXJzZWAuIFRoYXQmIzM5O3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IGBzdHJ1Y3RfbWV0YV90YWJgIGFjdHVhbGx5ICppcyogd2l0aGluIHRoYXQgY29udGV4dDsgSSYjMzk7bGwgbmVlZCB0byBsb29rIGF0IHRoZSBzdXJyb3VuZGluZyBjb2RlIHRvIGRldGVybWluZSBpdHMgcm9sZSBhbmQgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcy4KCk5vdywgSSYjMzk7bSBnb2luZyB0byBzdGFydCBkaWdnaW5nIGludG8gdGhlIGNvZGUgaXRzZWxmLiBUaW1lIHRvIGZpcmUgdXAgbXkgYW5hbHlzaXMgdG9vbHMgYW5kIGdldCBhIGJldHRlciBwaWN0dXJlIG9mIHRoZSBzaXR1YXRpb24uIEkgbmVlZCB0byBjaGVjayBob3cgdGhlc2UgaGVscGVyIGZ1bmN0aW9ucyBpbnRlcmFjdCB3aXRoIHRoZSBleGlzdGluZyBjb2RlIGFuZCB1bmRlcnN0YW5kIHRoZSBwb3RlbnRpYWwgaW1wbGljYXRpb25zIG9mIHRoZXNlIGNoYW5nZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvYnRmLmM9NDM0MT1zdGF0aWMgaW50IGJ0Zl9vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuLS1cbmtlcm5lbC9icGYvYnRmLmMtNDM2OC1cbmtlcm5lbC9icGYvYnRmLmM6NDM2OTpzdGF0aWMgaW50IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxua2VybmVsL2JwZi9idGYuYy00MzcwLVx0XHRcdFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9NTk5OT1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTYwODItXG5rZXJuZWwvYnBmL2J0Zi5jOjYwODM6XHRcdGVyciA9IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoYnRmLCBzdHJ1Y3RfbWV0YV90YWIpO1xua2VybmVsL2JwZi9idGYuYy02MDg0LVx0XHRpZiAoZXJyIFx1MDAzYyAwKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg2MTUKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAyNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgeW91IHJlcXVlc3RlZDoKCioqRGl2aW5nIERlZXAgaW50byBCVEYgYW5kIGl0cyBDYWxsZXJzKioKCk9rYXksIHNvIEkgbmVlZCB0byBnZXQgYSByZWFsbHkgc29saWQgZ3Jhc3Agb24gdGhlIGJlaGF2aW9yIG9mIHRoZXNlIHNwZWNpZmljIGZ1bmN0aW9ucy4gSSBrbm93IHRoZSBnZW5lcmFsIGlkZWEsIGJ1dCB0byB1bmRlcnN0YW5kIHRoZSAqd2h5KiBhbmQgdGhlIHN1YnRsZXRpZXMsIEkgbmVlZCB0byBzZWUgdGhlbSBpbiBhY3Rpb24uIFRoZSBiZXN0IHdheSB0byBkbyB0aGF0LCBlc3BlY2lhbGx5IGluIHRoZSBrZXJuZWwsIGlzIHRvIGdvIHN0cmFpZ2h0IHRvIHRoZSBzb3VyY2UuIFNwZWNpZmljYWxseSwgSSBzaG91bGQgY3JhY2sgb3BlbiBga2VybmVsL2JwZi9idGYuY2AuIFRoYXQmIzM5O3Mgd2hlcmUgdGhlIG1hZ2ljIGlzIGhhcHBlbmluZywgcmlnaHQ/IEkmIzM5O20gdGhpbmtpbmcgdGhlIGJlc3Qgc3RyYXRlZ3kgaXMgdG8gbG9vayBhdCB0aGUgc3Vycm91bmRpbmcgY29kZSBhcyB3ZWxsLCBzbyBJIGNhbiBzZWUgd2hhdCB0aGVzZSBmdW5jdGlvbnMgYXJlIGludGVyYWN0aW5nIHdpdGgsIHdoYXQgY2FsbHMgdGhlbSwgYW5kIHdoYXQgdGhleSBjYWxsLiBDb250ZXh0IGlzIGtpbmcsIGFuZCBpbiBhIGNvbXBsZXggc3lzdGVtIGxpa2UgdGhlIEJQRiBpbmZyYXN0cnVjdHVyZSwgY29udGV4dCBpcyBldmVyeXRoaW5nLiBUaW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eSBhbmQgc3RhcnQgdHJhY2luZyB0aG9zZSBjYWxscyEgTGV0JiMzOTtzIHNlZSB3aGF0IHdlIGNhbiBsZWFybiBhYm91dCB0aGUgcmVsYXRpb25zaGlwIG9mIGZ1bmN0aW9ucywgYW5kIHRoZSBvdmVyYWxsIHJvbGUgdGhlc2UgZnVuY3Rpb25zIHBsYXkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2J0Zi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDMwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA5MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDs0MzAwOlx0XHRcdFx0Y29udGludWU7XG40MzAxOlx0XHRcdGJ0Zl9pZCA9IHJlYy1cdTAwM2VmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XG40MzAyOlx0XHRcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XG40MzAzOlx0XHRcdGlmICghbWV0YSlcbjQzMDQ6XHRcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbjQzMDU6XHRcdFx0cmVjLVx1MDAzZWZpZWxkc1tpXS5ncmFwaF9yb290LnZhbHVlX3JlYyA9IG1ldGEtXHUwMDNlcmVjb3JkO1xuNDMwNjpcdFx0fVxuNDMwNzpcdFx0cmV0dXJuIDA7XG40MzA4Olx0fVxuNDMwOTpcdFxuNDMxMDpcdHN0YXRpYyBpbnQgYnRmX293bmVkX3R5cGVfaWR4KGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYixcbjQzMTE6XHRcdFx0XHQgICAgICBjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZClcbjQzMTI6XHR7XG40MzEzOlx0XHRzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhICptZXRhO1xuNDMxNDpcdFx0dTMyIGJ0Zl9pZDtcbjQzMTU6XHRcbjQzMTY6XHRcdGlmIChmaWVsZC1cdTAwM2V0eXBlIFx1MDAyNiBCUEZfR1JBUEhfUk9PVCkge1xuNDMxNzpcdFx0XHRidGZfaWQgPSBmaWVsZC1cdTAwM2VncmFwaF9yb290LnZhbHVlX2J0Zl9pZDtcbjQzMTg6XHRcdH0gZWxzZSBpZiAoZmllbGQtXHUwMDNldHlwZSA9PSBCUEZfS1BUUl9SRUYgfHwgZmllbGQtXHUwMDNldHlwZSA9PSBCUEZfS1BUUl9QRVJDUFUpIHtcbjQzMTk6XHRcdFx0aWYgKGJ0Zl9pc19rZXJuZWwoZmllbGQtXHUwMDNla3B0ci5idGYpKVxuNDMyMDpcdFx0XHRcdHJldHVybiAtRU5PRU5UO1xuNDMyMTpcdFx0XHRidGZfaWQgPSBmaWVsZC1cdTAwM2VrcHRyLmJ0Zl9pZDtcbjQzMjI6XHRcdH0gZWxzZSB7XG40MzIzOlx0XHRcdHJldHVybiAtRU5PRU5UO1xuNDMyNDpcdFx0fVxuNDMyNTpcdFxuNDMyNjpcdFx0bWV0YSA9IGJ0Zl9maW5kX3N0cnVjdF9tZXRhKGJ0ZiwgYnRmX2lkKTtcbjQzMjc6XHRcdGlmICghbWV0YSlcbjQzMjg6XHRcdFx0cmV0dXJuIGZpZWxkLVx1MDAzZXR5cGUgXHUwMDI2IEJQRl9HUkFQSF9ST09UID8gLUVGQVVMVCA6IC1FTk9FTlQ7XG40MzI5Olx0XHRyZXR1cm4gbWV0YSAtIHRhYi1cdTAwM2V0eXBlcztcbjQzMzA6XHR9XG40MzMxOlx0XG40MzMyOlx0LypcbjQzMzM6XHQgKiBFYWNoIG93bmVyc2hpcCBlZGdlIGFkZHMga2VybmVsIGZyYW1lcyB0aHJvdWdoIGJwZl9vYmpfZnJlZV9maWVsZHMoKSBhbmRcbjQzMzQ6XHQgKiBfX2JwZl9vYmpfZHJvcF9pbXBsKCkuIEtlZXAgdGhlIGJvdW5kIGRlbGliZXJhdGVseSBzbWFsbCBiZWNhdXNlIG9iamVjdFxuNDMzNTpcdCAqIGRlc3RydWN0aW9uIGNhbiBpdHNlbGYgcnVuIGJlbG93IGEgQlBGIGNhbGwgY2hhaW4uIEEgZmluYWwgcG9pbnRlZSB3aXRob3V0XG40MzM2Olx0ICogc3BlY2lhbCBmaWVsZHMgaXMgbm90IHByZXNlbnQgaW4gdGhlIHN0cnVjdCBtZXRhZGF0YSB0YWJsZSBhbmQgYWRkcyBvbmx5IGFcbjQzMzc6XHQgKiBub24tcmVjdXJzaW5nIGRyb3AuXG40MzM4Olx0ICovXG40MzM5Olx0I2RlZmluZSBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCA4XG40MzQwOlx0XG40MzQxOlx0c3RhdGljIGludCBidGZfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbjQzNDI6XHRcdFx0XHQgICAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYiwgdTggKmRlcHRoLFxuNDM0MzpcdFx0XHRcdCAgICAgICBpbnQgaWR4LCBpbnQgZGVwdGhfbGVmdClcbjQzNDQ6XHR7XG40MzQ1Olx0XHRjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjID0gdGFiLVx1MDAzZXR5cGVzW2lkeF0ucmVjb3JkO1xuNDM0NjpcdFx0aW50IGksIHJldCwgbWF4X2RlcHRoID0gMDtcbjQzNDc6XHRcbjQzNDg6XHRcdGlmICghZGVwdGhfbGVmdClcbjQzNDk6XHRcdFx0cmV0dXJuIC1FTE9PUDtcbjQzNTA6XHRcdGlmIChkZXB0aFtpZHhdKVxuNDM1MTpcdFx0XHRnb3RvIGRvbmU7XG40MzUyOlx0XG40MzUzOlx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyByZWMtXHUwMDNlY250OyBpJiM0MzsmIzQzOykge1xuNDM1NDpcdFx0XHRyZXQgPSBidGZfb3duZWRfdHlwZV9pZHgoYnRmLCB0YWIsIFx1MDAyNnJlYy1cdTAwM2VmaWVsZHNbaV0pO1xuNDM1NTpcdFx0XHRpZiAocmV0ID09IC1FTk9FTlQpXG40MzU2Olx0XHRcdFx0Y29udGludWU7XG40MzU3Olx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG40MzU4Olx0XHRcdFx0cmV0dXJuIHJldDtcbjQzNTk6XHRcdFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIHJldCwgZGVwdGhfbGVmdCAtIDEpO1xuNDM2MDpcdFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuNDM2MTpcdFx0XHRcdHJldHVybiByZXQ7XG40MzYyOlx0XHRcdG1heF9kZXB0aCA9IG1heChtYXhfZGVwdGgsIHJldCk7XG40MzYzOlx0XHR9XG40MzY0Olx0XHRkZXB0aFtpZHhdID0gbWF4X2RlcHRoICYjNDM7IDE7XG40MzY1Olx0ZG9uZTpcbjQzNjY6XHRcdHJldHVybiBkZXB0aFtpZHhdIFx1MDAzZSBkZXB0aF9sZWZ0ID8gLUVMT09QIDogZGVwdGhbaWR4XTtcbjQzNjc6XHR9XG40MzY4Olx0XG40MzY5Olx0c3RhdGljIGludCBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbjQzNzA6XHRcdFx0XHRcdCAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYilcbjQzNzE6XHR7XG40MzcyOlx0XHR1OCAqZGVwdGg7XG40MzczOlx0XHRpbnQgaSwgcmV0ID0gMDtcbjQzNzQ6XHRcbjQzNzU6XHRcdGRlcHRoID0ga3ZjYWxsb2ModGFiLVx1MDAzZWNudCwgc2l6ZW9mKCpkZXB0aCksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1dBUk4pO1xuNDM3NjpcdFx0aWYgKCFkZXB0aClcbjQzNzc6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG40Mzc4Olx0XG40Mzc5Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB0YWItXHUwMDNlY250OyBpJiM0MzsmIzQzOykge1xuNDM4MDpcdFx0XHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgaSxcbjQzODE6XHRcdFx0XHRcdFx0ICBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCk7XG40MzgyOlx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG40MzgzOlx0XHRcdFx0YnJlYWs7XG40Mzg0Olx0XHRcdHJldCA9IDA7XG40Mzg1Olx0XHR9XG40Mzg2Olx0XHRrdmZyZWUoZGVwdGgpO1xuNDM4NzpcdFx0cmV0dXJuIHJldDtcbjQzODg6XHR9XG40Mzg5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTAzMDAKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAyOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHQgcHJvY2Vzc2VzOgoKKipEZWx2aW5nIGludG8gQlRGIFBhcnNpbmcgYW5kIEZpZWxkIE1hbmlwdWxhdGlvbioqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYGJ0Zl9wYXJzZWAgYW5kIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2AgYXJlIGFjdHVhbGx5ICp1c2VkKiB3aXRoaW4gdGhlIGxhcmdlciBjb250ZXh0LiBNeSBmaXJzdCBtb3ZlIGlzIGNsZWFyOiBJIHdhbnQgdG8gdHJhY2UgdGhlIGNhbGwgcGF0aHMuIEkgbmVlZCB0byBzZWUgd2hlcmUgdGhlc2UgZnVuY3Rpb25zIGFyZSBpbnZva2VkLiBVbmRlcnN0YW5kaW5nIHRoZSBjYWxsaW5nIGNvbnRleHRzIHdpbGwgZ2l2ZSBtZSBpbW1lZGlhdGUgaW5zaWdodCBpbnRvIHRoZSByb2xlIG9mIHRoZXNlIGZ1bmN0aW9ucyB3aXRoaW4gdGhlIEJURiAoQlBGIFR5cGUgRm9ybWF0KSBpbmZyYXN0cnVjdHVyZS4gQXJlIHRoZXkgY2FsbGVkIGR1cmluZyBCVEYgb2JqZWN0IGxvYWRpbmc/IER1cmluZyBwcm9ncmFtIHZlcmlmaWNhdGlvbj8gTWF5YmUgZHVyaW5nIHNvbWUga2luZCBvZiB0eXBlIGludHJvc3BlY3Rpb24gb3Igb3B0aW1pemF0aW9uPyBLbm93aW5nIHRoZSBjYWxsIHNpdGVzIGlzIGtleSB0byBmb3JtdWxhdGluZyBhIHByb3BlciBtZW50YWwgbW9kZWwuIEkmIzM5O2xsIHN0YXJ0IHdpdGggYSBzdHJhaWdodGZvcndhcmQgc2VhcmNoIGZvciB0aG9zZSBmdW5jdGlvbiBuYW1lcyBhbmQgZm9sbG93IHRoZSB0cmFpbC4gVGhpcyBzaG91bGQgYmUgaW50ZXJlc3RpbmcuLi4gdGltZSB0byBkaWcgaW4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvYnBmLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2J0Zi5jPTQxMzU9c3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9wYXJzZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsXG4tLVxua2VybmVsL2JwZi9idGYuYy00MjY3LVxua2VybmVsL2JwZi9idGYuYzo0MjY4OmludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG5rZXJuZWwvYnBmL2J0Zi5jLTQyNjkte1xuLS1cbmtlcm5lbC9icGYvYnRmLmM9NTk5OT1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNzctXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHN0cnVjdF9tZXRhX3RhYi1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG5rZXJuZWwvYnBmL2J0Zi5jOjYwNzg6XHRcdFx0ZXJyID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBzdHJ1Y3RfbWV0YV90YWItXHUwMDNldHlwZXNbaV0ucmVjb3JkKTtcbmtlcm5lbC9icGYvYnRmLmMtNjA3OS1cdFx0XHRpZiAoZXJyIFx1MDAzYyAwKVxuLS1cbmtlcm5lbC9icGYvc3lzY2FsbC5jPTEyNTU9c3RhdGljIGludCBtYXBfY2hlY2tfYnRmKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfdG9rZW4gKnRva2VuLFxuLS1cbmtlcm5lbC9icGYvc3lzY2FsbC5jLTEzNjMtXG5rZXJuZWwvYnBmL3N5c2NhbGwuYzoxMzY0Olx0cmV0ID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBtYXAtXHUwMDNlcmVjb3JkKTtcbmtlcm5lbC9icGYvc3lzY2FsbC5jLTEzNjUtXHRpZiAocmV0IFx1MDAzYyAwKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwOTUwCgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipBbmFseXppbmcgYGJ0Zl9wYXJzZWAgQ2FsbHNpdGVzKioKCk9rYXksIHRpbWUgdG8gZGl2ZSBpbi4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsICYjMzQ7V2hlcmUgZXhhY3RseSBpcyB0aGlzIGBidGZfcGFyc2VgIGZ1bmN0aW9uIGJlaW5nIGludm9rZWQ/JiMzNDsgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGNvbnRleHQuIEtub3dpbmcgdGhlIGNhbGxpbmcgZnVuY3Rpb25zIGlzIGNydWNpYWwgZm9yIGdyYXNwaW5nIGl0cyBwdXJwb3NlIHdpdGhpbiB0aGUgYnJvYWRlciBzeXN0ZW0uIEkmIzM5O2xsIG5lZWQgdG8gdHJhY2UgdGhlIGNhbGxzaXRlcyB0byBmaWd1cmUgb3V0IHdoYXQgZGF0YSBpdCYjMzk7cyBwcm9jZXNzaW5nLCB3aGF0IHJlc291cmNlcyBpdCYjMzk7cyB1dGlsaXppbmcsIGFuZCB3aGF0IHRoZSBvdmVyYWxsIHdvcmtmbG93IGxvb2tzIGxpa2UgYXJvdW5kIGl0LiBBcmUgd2UgZGVhbGluZyB3aXRoIGtlcm5lbCBzcGFjZSwgdXNlciBzcGFjZSwgb3IgYm90aD8gQXJlIHRoZXJlIGFueSBwb3RlbnRpYWwgY29uY3VycmVuY3kgaXNzdWVzIHRvIGNvbnNpZGVyLCBnaXZlbiBob3cgbWFueSBjYWxsIHNpdGVzPyBUaGlzIGNvdWxkIGdpdmUgbWUgYSBtdWNoIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBvdmVyYWxsIHB1cnBvc2Ugb2YgdGhlIHByb2dyYW0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2J0Zl9wYXJzZVxcKCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvYnRmLmM9NTk2MT1zdGF0aWMgaW50IGJ0Zl9jaGVja19tb2RpZmllcl9jaGFpbl9sZW5ndGgoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudixcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTU5OTgtXG5rZXJuZWwvYnBmL2J0Zi5jOjU5OTk6c3RhdGljIHN0cnVjdCBidGYgKmJ0Zl9wYXJzZShjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXG5rZXJuZWwvYnBmL2J0Zi5jLTYwMDAtXHRcdFx0ICAgICBzdHJ1Y3QgYnBmX2xvZ19hdHRyICphdHRyX2xvZylcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTg0MDQ9aW50IGJ0Zl9uZXdfZmQoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLCBzdHJ1Y3QgYnBmX2xvZ19hdHRyICphdHRyX2xvZylcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTg0MDgtXG5rZXJuZWwvYnBmL2J0Zi5jOjg0MDk6XHRidGYgPSBidGZfcGFyc2UoYXR0ciwgdWF0dHIsIGF0dHJfbG9nKTtcbmtlcm5lbC9icGYvYnRmLmMtODQxMC1cdGlmIChJU19FUlIoYnRmKSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE0MjkKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiA0NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhbmFseXNpcyBvZiB0aGUgc2l0dWF0aW9uOgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBgYnRmX25ld19mZGAgRnVuY3Rpb24gQ2FsbCoqCgpPa2F5LCBzbyBJJiMzOTttIHRyYWNpbmcgZG93biB0aGlzIGBidGZfbmV3X2ZkYCBmdW5jdGlvbi4gVGhlIGNhbGwgc3RhY2sgaW5kaWNhdGVzIGl0JiMzOTtzIHRyaWdnZXJlZCBmcm9tIHRoZSBgYnBmKEJQRl9CVEZfTE9BRClgIHN5c3RlbSBjYWxsLCBzcGVjaWZpY2FsbHkgdGhyb3VnaCBgc3lzY2FsbC5jYC4gU2luY2UgdGhhdCYjMzk7cyB0aGUgZW50cnkgcG9pbnQsIGl0JiMzOTtzIHRoZSBvYnZpb3VzIHBsYWNlIHRvIHN0YXJ0LiBJJiMzOTtsbCBuZWVkIHRvIGRpdmUgaW50byBga2VybmVsL2JwZi9zeXNjYWxsLmNgIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgYGJ0Zl9uZXdfZmRgIGZ1bmN0aW9uIGlzIGJlaW5nIGludm9rZWQgYW5kIHdoYXQgaW5mb3JtYXRpb24gaXMgYmVpbmcgcGFzc2VkLiBUaGF0IHNob3VsZCBnaXZlIG1lIHRoZSBjb250ZXh0IEkgbmVlZCB0byBmaWd1cmUgb3V0IGV4YWN0bHkgd2hhdCYjMzk7cyBoYXBwZW5pbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2J0Zl9uZXdfZmQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvYnBmLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2J0Zi5jPTgzOTI9Y29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBidGZfZm9wcyA9IHtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTgzOTgtXG5rZXJuZWwvYnBmL2J0Zi5jOjgzOTk6c3RhdGljIGludCBfX2J0Zl9uZXdfZmQoc3RydWN0IGJ0ZiAqYnRmKVxua2VybmVsL2JwZi9idGYuYy04NDAwLXtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTg0MDMtXG5rZXJuZWwvYnBmL2J0Zi5jOjg0MDQ6aW50IGJ0Zl9uZXdfZmQoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLCBzdHJ1Y3QgYnBmX2xvZ19hdHRyICphdHRyX2xvZylcbmtlcm5lbC9icGYvYnRmLmMtODQwNS17XG4tLVxua2VybmVsL2JwZi9idGYuYy04NDI0LVxua2VybmVsL2JwZi9idGYuYzo4NDI1Olx0cmV0ID0gX19idGZfbmV3X2ZkKGJ0Zik7XG5rZXJuZWwvYnBmL2J0Zi5jLTg0MjYtXHRpZiAocmV0IFx1MDAzYyAwKVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9ODUwND1pbnQgYnRmX2dldF9mZF9ieV9pZCh1MzIgaWQpXG4tLVxua2VybmVsL2JwZi9idGYuYy04NTE3LVxua2VybmVsL2JwZi9idGYuYzo4NTE4Olx0ZmQgPSBfX2J0Zl9uZXdfZmQoYnRmKTtcbmtlcm5lbC9icGYvYnRmLmMtODUxOS1cdGlmIChmZCBcdTAwM2MgMClcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTg3NTY9QlBGX0NBTExfNChicGZfYnRmX2ZpbmRfYnlfbmFtZV9raW5kLCBjaGFyICosIG5hbWUsIGludCwgbmFtZV9zeiwgdTMyLCBraW5kLCBpbnQsIGZsYWdzKVxuLS1cbmtlcm5lbC9icGYvYnRmLmMtODc2OS1cdGlmIChyZXQgXHUwMDNlIDAgXHUwMDI2XHUwMDI2IGJ0Zl9pc19tb2R1bGUoYnRmKSkge1xua2VybmVsL2JwZi9idGYuYzo4NzcwOlx0XHRidGZfb2JqX2ZkID0gX19idGZfbmV3X2ZkKGJ0Zik7XG5rZXJuZWwvYnBmL2J0Zi5jLTg3NzEtXHRcdGlmIChidGZfb2JqX2ZkIFx1MDAzYyAwKSB7XG4tLVxua2VybmVsL2JwZi9zeXNjYWxsLmM9NTU2ND1zdGF0aWMgaW50IGJwZl9idGZfbG9hZChjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsIHN0cnVjdCBicGZfbG9nX2F0dHIgKmF0dHJfbG9nKVxuLS1cbmtlcm5lbC9icGYvc3lzY2FsbC5jLTU1OTAtXG5rZXJuZWwvYnBmL3N5c2NhbGwuYzo1NTkxOlx0cmV0dXJuIGJ0Zl9uZXdfZmQoYXR0ciwgdWF0dHIsIGF0dHJfbG9nKTtcbmtlcm5lbC9icGYvc3lzY2FsbC5jLTU1OTItfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxMjoyNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjMxMQoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDQ4OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEJURiBQYXRjaCBhbmQgSXRzIEltcGxpY2F0aW9ucyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCB0aGlzIHBhdGNoIGlzIGFkZHJlc3NpbmcgYSBmbGF3IGluIGhvdyB3ZSBoYW5kbGUgYW5kIHZlcmlmeSBCVEYgZGF0YSwgc3BlY2lmaWNhbGx5IGFyb3VuZCB0aGUgb3duZXJzaGlwIGFuZCBjeWNsaWNhbCByZWxhdGlvbnNoaXBzIG9mIHN0cnVjdHMgd2l0aGluIHRoZSBCUEYgc3lzdGVtLiBCZWZvcmUgdGhpcywgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYCBoYWQgYSBwcmV0dHkgc2ltcGxpc3RpYyBjaGVjayBmb3IgZ3JhcGggcm9vdCBhY3ljbGljaXR5LiBJdCB1c2VkIHRoaXMgcmF0aGVyIGJhc2ljIGhldXJpc3RpYzogJiMzNDtJZiBhIHR5cGUgaXMgYm90aCBhIHJvb3QgYW5kIGEgbm9kZSwgaXQmIzM5O3MgYWxyZWFkeSBvd25lZCBhbmQgY2FuJiMzOTt0IG93biBhbm90aGVyIHJvb3QgdHlwZS4mIzM0OyBQcm9ibGVtIGlzLCB0aGlzIHdhc24mIzM5O3Qgcm9idXN0IGVub3VnaC4gSXQgZmFpbGVkIHRvIGNvbnNpZGVyIGBrcHRyYCBvd25lcnNoaXAgZGVwdGggb3IgY3ljbGVz4oCUdGhlIGxvY2FsIHBvaW50ZXIgb3duZXJzaGlwIHNjZW5hcmlvcywgYW5kIEkgc2VlIHRoZSBwcm9ibGVtLiBXZSBuZWVkIHNvbWV0aGluZyBtb3JlIHNvcGhpc3RpY2F0ZWQuCgpUaGUgcGF0Y2ggZXNzZW50aWFsbHkgcmVmYWN0b3JzIHRoaXMgbG9naWMsIGFuZCBpdCBsb29rcyBsaWtlIGEgZ29vZCBjaGFuZ2UuIEl0IHNlcGFyYXRlcyB0aGUgaW5pdGlhbCBncmFwaCByb290IHNldHRpbmcgaW4gYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYCwgbm93IGp1c3Qgc2V0dGluZyB0aGUgYHZhbHVlX3JlY2AsIGZyb20gYSBuZXcsIGRlZGljYXRlZCBvd25lcnNoaXAgZGVwdGggY2hlY2suIFRoaXMgbmV3IGFsZ29yaXRobSwgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgLCBpcyB0aGUga2V5LiBJdCYjMzk7cyBkZXNpZ25lZCB0byBjYWxjdWxhdGUgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgIGZvciBhbGwgc3RydWN0IG1ldGFzIHVwIHRvIGEgZGVmaW5lZCBsaW1pdCAoYEJURl9NQVhfT1dORVJTSElQX0RFUFRIYCwgY3VycmVudGx5IDgpLiBUaGlzIGlzIHdoZXJlIHRoZSBoZWF2eSBsaWZ0aW5nIGhhcHBlbnM6IGRldGVjdGluZyBjeWNsZXMgYW5kIGV4Y2Vzc2l2ZSBvd25lcnNoaXAgZGVwdGgsIGNvbnNpZGVyaW5nIGJvdGggdGhlIGdyYXBoIHJvb3RzIChgQlBGX0dSQVBIX1JPT1RgKSBhbmQgdGhlIGxvY2FsIGBrcHRyYCByZWxhdGlvbnNoaXBzIChgQlBGX0tQVFJfUkVGYCBvciBgQlBGX0tQVFJfUEVSQ1BVYCkuIFRoaXMgaXMgYSBtdWNoIG1vcmUgY29tcHJlaGVuc2l2ZSBhcHByb2FjaC4KCkFscmlnaHQsIHNvIHRoZSBpbXBsaWNhdGlvbnMgaGVyZSBhcmUgY2xlYXI6IHRoaXMgaW1wYWN0cyBCVEYgdmVyaWZpY2F0aW9uIGFuZCBsb2FkaW5nIHZpYSB0aGUgYGJwZihCUEZfQlRGX0xPQUQpYCBzeXNjYWxsLiBUaGlzIGlzIHJpZ2h0IGluIHRoZSBjb3JlIG9mIHRoaW5ncywgYGtlcm5lbC9icGYvYnRmLmNgLiBBbmQgaXQmIzM5O3MgcmVhY2hhYmxlIHZpYSBgYnBmKClgIHdpdGggYEJQRl9CVEZfTE9BRGAsIHdoaWNoIGlzIGFjY2Vzc2libGUgZnJvbSBib3RoIHVucHJpdmlsZWdlZCBhbmQgcHJpdmlsZWdlZCBjb250ZXh0cywgbWVhbmluZyBpdCYjMzk7cyBhIGdvb2QgdGFyZ2V0IGZvciBmdXp6aW5nLiBXZSBoYXZlIG5ldyByZWN1cnNpb24gbG9naWMsIGdyYXBoIHRyYXZlcnNhbCwgY3ljbGUgZGV0ZWN0aW9uLCBhbmQgZGVwdGggbGltaXRzLiBUaGVzZSBhcmUgYWxsIHBvc2l0aXZlIGluZGljYXRvcnMgdGhhdCBtYWtlIGl0IGEgdmFsdWFibGUgdGFyZ2V0IGZvciBmdXp6aW5nLiBUaGUgbG9jYXRpb24gaW4gdGhlIEJQRiBjb3JlIGlzIGFub3RoZXIgcG9zaXRpdmUuCgpOb3csIEkgc2hvdWxkIHF1aWNrbHkgY2hlY2sgdGhlIGtlcm5lbCBjb25maWcgb3B0aW9ucyB0byBjb25maXJtIHRoZSBkZXBlbmRlbmNpZXMgZm9yIGBrZXJuZWwvYnBmL2J0Zi5jYCBhbmQgYEJQRl9CVEZfTE9BRGAgYW5kIEJURiBzdXBwb3J0LiBKdXN0IHRvIG1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQmIzM5O3MgcmVxdWlyZWQgdG8gbWFrZSB0aGlzIGNvZGUgYWN0aXZlLiBJJiMzOTtsbCBjaGVjayBgaW5pdC9LY29uZmlnYCBvciBga2VybmVsL2JwZi9NYWtlZmlsZWAgdG8gY29uZmlybSB0aGUgZGVwZW5kZW5jaWVzIGFuZCBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGFsbCB3ZSBuZWVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxMjoyNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtidGZcXC5vJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9NYWtlZmlsZT0xMz1vYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICYjNDM7PSBicGZfbG9jYWxfc3RvcmFnZS5vIGJwZl90YXNrX3N0b3JhZ2Uub1xua2VybmVsL2JwZi9NYWtlZmlsZToxNDpvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICYjNDM7PSBmaXh1cHMubyBjZmcubyBzdGF0ZXMubyBiYWNrdHJhY2subyBjaGVja19idGYub1xua2VybmVsL2JwZi9NYWtlZmlsZS0xNS1vYmotJHtDT05GSUdfQlBGX0xTTX1cdCAgJiM0Mzs9IGJwZl9pbm9kZV9zdG9yYWdlLm9cbi0tXG5rZXJuZWwvYnBmL01ha2VmaWxlPTE3PW9iai0kKENPTkZJR19CUEZfSklUKSAmIzQzOz0gdHJhbXBvbGluZS5vXG5rZXJuZWwvYnBmL01ha2VmaWxlOjE4Om9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IGJ0Zi5vIG1lbWFsbG9jLm8gcnFzcGlubG9jay5vIHN0cmVhbS5vXG5rZXJuZWwvYnBmL01ha2VmaWxlLTE5LWlmZXEgKCQoQ09ORklHX01NVSkkKENPTkZJR182NEJJVCkseXkpXG4tLVxua2VybmVsL2JwZi9NYWtlZmlsZT00Mz1pZmVxICgkKENPTkZJR19TWVNGUykseSlcbmtlcm5lbC9icGYvTWFrZWZpbGU6NDQ6b2JqLSQoQ09ORklHX0RFQlVHX0lORk9fQlRGKSAmIzQzOz0gc3lzZnNfYnRmLm9cbmtlcm5lbC9icGYvTWFrZWZpbGUtNDUtZW5kaWZcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTM2NzkKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiAzNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipDaGVja2luZyB0aGUgQlBGIENvbmZpZ3VyYXRpb24gTGFuZHNjYXBlKioKCk9rYXksIHNvIEkgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyBgQlBGX1NZU0NBTExgIGFuZCBgQlBGYCBhcmUgY29uZmlndXJlZC4gR2l2ZW4gbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUga2VybmVsLCBJJiMzOTtsbCBzdGFydCBieSBjaGVja2luZyB0aGUgS2NvbmZpZyBmaWxlcy4gVGhlIG1vc3QgbGlrZWx5IHBsYWNlcyB3b3VsZCBiZSBgaW5pdC9LY29uZmlnYCwgYXMgaXQgb2Z0ZW4gaG91c2VzIGdsb2JhbCBmZWF0dXJlIHRvZ2dsZXMsIG9yIHNwZWNpZmljYWxseSwgYGtlcm5lbC9icGYvS2NvbmZpZ2AsIHNpbmNlIHRoYXQgZGlyZWN0b3J5IGlzIGRlZGljYXRlZCB0byBCUEYtcmVsYXRlZCBjb25maWd1cmF0aW9ucy4gSSBuZWVkIHRvIHNlZSBob3cgdGhlc2Ugb3B0aW9ucyBhcmUgZGVmaW5lZCwgdGhlaXIgZGVwZW5kZW5jaWVzLCBhbmQgYW55IGRlZmF1bHQgc2V0dGluZ3MuIFRoaXMgd2lsbCBnaXZlIG1lIGEgY2xlYXIgcGljdHVyZSBvZiB3aGF0IGNvbnRyb2xzIHRoZSBhY3RpdmF0aW9uIG9mIHRoZXNlIGZlYXR1cmVzLiBLbm93aW5nIHRoaXMgaW5mb3JtYXRpb24gd2lsbCBncmVhdGx5IGhlbHAgd2hlbiBpbnZlc3RpZ2F0aW5nIGlzc3VlcyB3aXRoIEJQRi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgQlBGX1NZU0NBTEwmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpbml0LyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzOTAxCgkJCQkJCQlvdXRwdXQ6IDIxCgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhpbmtpbmcgaXQ6CgoqKkxvY2F0aW5nIHRoZSBCUEZfU1lTQ0FMTCBDb25maWd1cmF0aW9uKioKCk9rYXksIHNvIEkgbmVlZCB0byB0cmFjayBkb3duIHRoZSBkZWZpbml0aW9uIG9mIGBjb25maWcgQlBGX1NZU0NBTExgIGluIHRoZSBLY29uZmlnIGZpbGVzLiBUaGlzIGlzIGxpa2VseSBhIGtleSBjb25maWd1cmF0aW9uIG9wdGlvbiBmb3IgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIEJQRiBzeXNjYWxsIGZ1bmN0aW9uYWxpdHksIGFuZCB1bmRlcnN0YW5kaW5nIGl0cyBkZXBlbmRlbmNpZXMgYW5kIGxvY2F0aW9uIHdpbGwgYmUgZXNzZW50aWFsIGZvciB3aGF0ZXZlciBJJiMzOTttIHdvcmtpbmcgb24uIFRpbWUgdG8gZGl2ZSBpbnRvIHRoZSBrZXJuZWwgc291cmNlIHRyZWUuIExldCYjMzk7cyBzZWUgaWYgYSBxdWljayBgZ3JlcGAgd2lsbCBnZXQgbWUgc3RhcnRlZCwgYnV0IEkmIzM5O20gZXhwZWN0aW5nIHRoaXMgb3B0aW9uIHRvIGJlIHByZXR0eSB3aWRlc3ByZWFkIHNvIEkgbWF5IG5lZWQgdG8gdXNlIGEgbW9yZSBwcmVjaXNlIG1ldGhvZCB0byBsb2NhdGUgaXQgd2l0aGluIHRoZSBLY29uZmlnIGhpZXJhcmNoeS4gTGV0JiMzOTtzIHN0YXJ0IHdpdGggYSBiYXNpYyBzZWFyY2ggdGhvdWdoLiBIb3BlZnVsbHksIGl0JiMzOTtzIG5vdCBidXJpZWQgdG9vIGRlZXAgd2l0aGluIGFuIGluY2x1ZGUsIGFuZCBJIGNhbiBxdWlja2x5IGFzY2VydGFpbiBpdHMgcGxhY2Ugd2l0aGluIHRoZSBicm9hZGVyIHN5c3RlbS4gSSYjMzk7bGwgYmUga2VlcGluZyBhbiBleWUgb3V0IGZvciBhbnkgc3Vycm91bmRpbmcgY29udGV4dCwgbGlrZSBgZGVwZW5kcyBvbmAgc3RhdGVtZW50cyBvciBkZWZhdWx0IHZhbHVlcywgYXMgdGhhdCB3aWxsIHByb3ZpZGUgdmFsdWFibGUgaW5zaWdodCBpbnRvIGhvdyB0aGlzIG9wdGlvbiBpbnRlcmFjdHMgd2l0aCBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsLiBPbmNlIEkgaGF2ZSB0aGUgZGVmaW5pdGl2ZSBLY29uZmlnIGZpbGUsIEkmIzM5O2xsIGFuYWx5emUgdGhlIHN1cnJvdW5kaW5nIGJsb2Nrcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIEJQRl9TWVNDQUxMJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvS2NvbmZpZz0yOT1tZW51IFwmIzM0O0JQRiBzdWJzeXN0ZW1cJiMzNDtcbmtlcm5lbC9icGYvS2NvbmZpZy0zMC1cbmtlcm5lbC9icGYvS2NvbmZpZzozMTpjb25maWcgQlBGX1NZU0NBTExcbmtlcm5lbC9icGYvS2NvbmZpZy0zMi1cdGJvb2wgXCYjMzQ7RW5hYmxlIGJwZigpIHN5c3RlbSBjYWxsXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0MjYwCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gcmVhZGluZyB0aGUgcHJvdmlkZWQgdGV4dDoKCioqQlBGIENvbmZpZ3VyYXRpb24gVGhvdWdodHMqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGUgYGtlcm5lbC9icGYvS2NvbmZpZ2AgZmlsZS4gSSYjMzk7bSBmb2N1c2luZyBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgMzEuIEJhc2VkIG9uIG15IGV4cGVyaWVuY2UsIEkmIzM5O20gZXhwZWN0aW5nIHRvIHNlZSB0aGUgY29yZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBCUEYsIGxpa2VseSB0aGUgZ2VuZXJhbCBlbmFibGUvZGlzYWJsZSBzd2l0Y2gsIG9yIG1heWJlIHNvbWUgZnVuZGFtZW50YWwgZmVhdHVyZXMgdGhhdCBhcmUgY29uc2lkZXJlZCBjcml0aWNhbC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBjb250cm9scyB0aGUgYmFzaWMgYnVpbGRpbmcgYmxvY2tzIGhlcmUuIExldCYjMzk7cyBzZWUgaWYgdGhpcyBsaW5lIGlzIGNvbnRyb2xsaW5nIHRoZSBjb3JlIG9yIHNvbWV0aGluZyBzcGVjaWZpYyB0byB0aGUgYXJjaGl0ZWN0dXJlIEkgYW0gc3R1ZHlpbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAyNTpcdCMgZGVmYXVsdCBmb3Iga2VybmVscyB0aGF0IHdlcmUgY29tcGlsZWQgd2l0aCBCUEYgSklUIHN1cHBvcnQuXG4gIDI2Olx0Y29uZmlnIEFSQ0hfV0FOVF9ERUZBVUxUX0JQRl9KSVRcbiAgMjc6XHRcdGJvb2xcbiAgMjg6XHRcbiAgMjk6XHRtZW51IFwmIzM0O0JQRiBzdWJzeXN0ZW1cJiMzNDtcbiAgMzA6XHRcbiAgMzE6XHRjb25maWcgQlBGX1NZU0NBTExcbiAgMzI6XHRcdGJvb2wgXCYjMzQ7RW5hYmxlIGJwZigpIHN5c3RlbSBjYWxsXCYjMzQ7XG4gIDMzOlx0XHRzZWxlY3QgQlBGXG4gIDM0Olx0XHRzZWxlY3QgSVJRX1dPUktcbiAgMzU6XHRcdHNlbGVjdCBORUVEX1RBU0tTX1JDVVxuICAzNjpcdFx0c2VsZWN0IFRBU0tTX1RSQUNFX1JDVVxuICAzNzpcdFx0c2VsZWN0IEJJTkFSWV9QUklOVEZcbiAgMzg6XHRcdHNlbGVjdCBORVRfU09DS19NU0cgaWYgTkVUXG4gIDM5Olx0XHRzZWxlY3QgTkVUX1hHUkVTUyBpZiBORVRcbiAgNDA6XHRcdHNlbGVjdCBQQUdFX1BPT0wgaWYgTkVUXG4gIDQxOlx0XHRkZWZhdWx0IG5cbiAgNDI6XHRcdGhlbHBcbiAgNDM6XHRcdCAgRW5hYmxlIHRoZSBicGYoKSBzeXN0ZW0gY2FsbCB0aGF0IGFsbG93cyB0byBtYW5pcHVsYXRlIEJQRiBwcm9ncmFtc1xuICA0NDpcdFx0ICBhbmQgbWFwcyB2aWEgZmlsZSBkZXNjcmlwdG9ycy5cbiAgNDU6XHRcbiAgNDY6XHRjb25maWcgQlBGX0pJVFxuICA0NzpcdFx0Ym9vbCBcJiMzNDtFbmFibGUgQlBGIEp1c3QgSW4gVGltZSBjb21waWxlclwmIzM0O1xuICA0ODpcdFx0ZGVwZW5kcyBvbiBCUEZcbiAgNDk6XHRcdGRlcGVuZHMgb24gSEFWRV9DQlBGX0pJVCB8fCBIQVZFX0VCUEZfSklUXG4gIDUwOlx0XHRzZWxlY3QgRVhFQ01FTVxuICA1MTpcdFx0aGVscFxuICA1MjpcdFx0ICBCUEYgcHJvZ3JhbXMgYXJlIG5vcm1hbGx5IGhhbmRsZWQgYnkgYSBCUEYgaW50ZXJwcmV0ZXIuIFRoaXMgb3B0aW9uXG4gIDUzOlx0XHQgIGFsbG93cyB0aGUga2VybmVsIHRvIGdlbmVyYXRlIG5hdGl2ZSBjb2RlIHdoZW4gYSBwcm9ncmFtIGlzIGxvYWRlZFxuICA1NDpcdFx0ICBpbnRvIHRoZSBrZXJuZWwuIFRoaXMgd2lsbCBzaWduaWZpY2FudGx5IHNwZWVkLXVwIHByb2Nlc3Npbmcgb2YgQlBGXG4gIDU1Olx0XHQgIHByb2dyYW1zLlxuICA1NjpcdFxuICA1NzpcdFx0ICBOb3RlLCBhbiBhZG1pbiBzaG91bGQgZW5hYmxlIHRoaXMgZmVhdHVyZSBjaGFuZ2luZzpcbiAgNTg6XHRcdCAgL3Byb2Mvc3lzL25ldC9jb3JlL2JwZl9qaXRfZW5hYmxlXG4gIDU5Olx0XHQgIC9wcm9jL3N5cy9uZXQvY29yZS9icGZfaml0X2hhcmRlbiAgIChvcHRpb25hbClcbiAgNjA6XHRcdCAgL3Byb2Mvc3lzL25ldC9jb3JlL2JwZl9qaXRfa2FsbHN5bXMgKG9wdGlvbmFsKVxuICA2MTpcdFxuICA2MjpcdGNvbmZpZyBCUEZfSklUX0FMV0FZU19PTlxuICA2MzpcdFx0Ym9vbCBcJiMzNDtQZXJtYW5lbnRseSBlbmFibGUgQlBGIEpJVCBhbmQgcmVtb3ZlIEJQRiBpbnRlcnByZXRlclwmIzM0O1xuICA2NDpcdFx0ZGVwZW5kcyBvbiBCUEZfU1lTQ0FMTCBcdTAwMjZcdTAwMjYgSEFWRV9FQlBGX0pJVCBcdTAwMjZcdTAwMjYgQlBGX0pJVFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxMjoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTAyNQoJCQkJCQkJb3V0cHV0OiAxODAKCQkJCQkJCXRob3VnaHRzOiA3NTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQlRGIEFjeWNsaWNpdHkgQ2hlY2sgYW5kIE93bmVyc2hpcCBEZXB0aCBWYWxpZGF0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBteSBpbml0aWFsIHRob3VnaHQgaXM6IGBCUEZfU1lTQ0FMTGAgc2VlbXMgbGlrZSB0aGUga2V5IGNvbmZpZyBmbGFnIGhlcmUuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlbiYjMzk7dCBhbnkgb3RoZXIgaGlkZGVuIGRlcGVuZGVuY2llcyBmb3IgQlRGIGZ1bmN0aW9uYWxpdHkuIElzIGBDT05GSUdfREVCVUdfSU5GT19CVEZgIGFsc28gbmVlZGVkLCBvciBpcyBgYnRmLm9gIGJ1aWx0IGRpcmVjdGx5IHdoZW4gYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgZW5hYmxlZD8gTGV0JiMzOTtzIGNoZWNrIHRoZSBga2VybmVsL2JwZi9NYWtlZmlsZWAuLi4gWWVwLCB0aGVyZSBpdCBpczogYG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IGJ0Zi5vIG1lbWFsbG9jLm8gcnFzcGlubG9jay5vIHN0cmVhbS5vYC4gU28gYENPTkZJR19CUEZfU1lTQ0FMTGAgKmRvZXMqIGNvbXBpbGUgYGJ0Zi5vYC4gR29vZC4KCk5vdywgbGV0JiMzOTtzIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyBmdW5jdGlvbnMgdGhpcyBwYXRjaCBpcyBtb2RpZnlpbmcgb3IgYWRkaW5nIOKAkyB0aGUgRm9jdXNTeW1ib2xzLCBzbyB0byBzcGVhay4gTG9va2luZyBhdCBga2VybmVsL2JwZi9idGYuY2AsIEkgc2VlIHRoZXNlIGNoYW5nZWQgZnVuY3Rpb25zOgoKMS4gIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYAoyLiAgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgCjMuICBgYnRmX293bmVkX3R5cGVfaWR4YAo0LiAgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYAo1LiAgYGJ0Zl9wYXJzZWAgKGNhbGxlciBpbnNpZGUgYGJ0Zi5jYCkKNi4gIGBidGZfbmV3X2ZkYCAoQlRGIGxvYWQgZW50cnlwb2ludCkKCkFyZSBhbnkgb2YgdGhlc2UgdWJpcXVpdG91cz8gVGhleSBhcmUgY2xlYXJseSBmb2N1c2VkIG9uIEJURiwgYW5kIG5vdCB1c2VkIGV2ZXJ5d2hlcmUgaW4gdGhlIGtlcm5lbC4gTGV0JiMzOTtzIG1ha2Ugc3VyZS4KCiogICBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAgLSBzdGF0aWMsIG5ldwoqICAgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgIC0gc3RhdGljLCBuZXcKKiAgIGBidGZfb3duZWRfdHlwZV9pZHhgIC0gc3RhdGljLCBuZXcKKiAgIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2AgLSBnbG9iYWwgZnVuY3Rpb24sIG1vZGlmaWVkCiogICBgYnRmX3BhcnNlYCAtIHN0YXRpYyBmdW5jdGlvbiwgbW9kaWZpZWQgY2FsbGVyCiogICBgYnRmX25ld19mZGAgLSBnbG9iYWwgZnVuY3Rpb24KClNpbmNlIHRoZXkgYXJlIGluIGEgQyBmaWxlIGluIGtlcm5lbC9icGYvYnRmLmMsIGV2ZW4gc3RhdGljIGZ1bmN0aW9ucyBpbiB2bWxpbnV4IGhhdmUgc3ltYm9scyBpbiBrYWxsc3ltcyAodW5sZXNzIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyKS4gTGlzdGluZyBzdGF0aWMgZnVuY3Rpb25zIGFuZCBub24tc3RhdGljIG9uZXMgbGlrZSBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIGFuZCBgYnRmX25ld19mZGAgZW5zdXJlcyB0aGUgZnV6emVyIGhpdHMgdGhlbS4KCk9rYXksIGxldCYjMzk7cyBqdXN0IGRvdWJsZS1jaGVjayBldmVyeXRoaW5nIHRvIGJlIGNlcnRhaW4uIFdlJiMzOTtyZSBnb29kIHRvIGdvLgoKKiAgIFdvcnRoRnV6emluZzogVHJ1ZQoqICAgRW5hYmxlQ29uZmlnczogXFsmIzM0O0JQRlxfU1lTQ0FMTCYjMzQ7XF0KKiAgIEZvY3VzU3ltYm9sczogXFsKICAgICogICAmIzM0O2J0ZlxfY2hlY2tcX293bmVyc2hpcFxfZGVwdGgmIzM0OywKICAgICogICAmIzM0O2J0Zlxfb3duZXJzaGlwXF9kZXB0aCYjMzQ7LAogICAgKiAgICYjMzQ7YnRmXF9vd25lZFxfdHlwZVxfaWR4JiMzNDssCiAgICAqICAgJiMzNDtidGZcX2NoZWNrXF9hbmRcX2ZpeHVwXF9maWVsZHMmIzM0OywKICAgICogICAmIzM0O2J0ZlxfcGFyc2UmIzM0OywKICAgICogICAmIzM0O2J0ZlxfbmV3XF9mZCYjMzQ7CiAgICBcXQoKRmluYWxseSwgdGhlIHJlYXNvbmluZzogVGhpcyBwYXRjaCBpcyByZWZhY3RvcmluZyB0aGUgYWN5Y2xpY2l0eSBjaGVjayBmb3IgQlRGIHN0cnVjdHVyZXMgYW5kIGFkZGluZyBhIG5ldyByZWN1cnNpdmUgZGVwdGggdmFsaWRhdGlvbiBhbGdvcml0aG0gKGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCwgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgLCBgYnRmX293bmVkX3R5cGVfaWR4YCkgdG8gZW5mb3JjZSBvd25lcnNoaXAgZ3JhcGggZGVwdGggbGltaXRzIGFuZCBkZXRlY3QgY3ljbGVzIGFjcm9zcyBncmFwaCByb290cyBhbmQgbG9jYWwga3B0cnMgZHVyaW5nIEJURiBsb2FkaW5nLiBUaGlzICptb2RpZmllcyogcmVhY2hhYmxlIGxvZ2ljIGluIHRoZSBjb3JlIEJQRiBzdWJzeXN0ZW0gZXhwb3NlZCB2aWEgdGhlIGBCUEZfQlRGX0xPQURgIGNvbW1hbmQgb2YgdGhlIGBicGYoKWAgc3lzY2FsbC4KCkFsbCBjbGVhciwgYWxsIHZlcmlmaWVkLiBJJiMzOTttIHJlYWR5IHRvIGNhbGwgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCYjMzQ7LAogICAgJiMzNDtidGZfb3duZXJzaGlwX2RlcHRoJiMzNDssCiAgICAmIzM0O2J0Zl9vd25lZF90eXBlX2lkeCYjMzQ7LAogICAgJiMzNDtidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyYjMzQ7LAogICAgJiMzNDtidGZfcGFyc2UmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgQlRGIHZhbGlkYXRpb24gbG9naWMgaW4gdGhlIEJQRiBzdWJzeXN0ZW0gYnkgcmVwbGFjaW5nIHRoZSBncmFwaCByb290IGFjeWNsaWNpdHkgY2hlY2sgd2l0aCBhIG5ldyBvd25lcnNoaXAgZGVwdGggYW5kIGN5Y2xlIGRldGVjdGlvbiBhbGdvcml0aG0gKGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGggYW5kIGJ0Zl9vd25lcnNoaXBfZGVwdGgpIGNvdmVyaW5nIGJvdGggZ3JhcGggcm9vdHMgYW5kIGxvY2FsIGtwdHJzLiBUaGVzZSBjaGFuZ2VzIGFyZSByZWFjaGFibGUgdmlhIHRoZSBCUEZfQlRGX0xPQUQgY29tbWFuZCBpbiB0aGUgYnBmKCkgc3lzdGVtIGNhbGwgYW5kIHdhcnJhbnQgZnV6emluZyB0byB2ZXJpZnkgZ3JhcGggdHJhdmVyc2FsIGNvcnJlY3RuZXNzIGFuZCBib3VuZCBlbmZvcmNlbWVudC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoJiMzNDssCiAgICAmIzM0O2J0Zl9vd25lcnNoaXBfZGVwdGgmIzM0OywKICAgICYjMzQ7YnRmX293bmVkX3R5cGVfaWR4JiMzNDssCiAgICAmIzM0O2J0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzJiMzNDssCiAgICAmIzM0O2J0Zl9wYXJzZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBCVEYgdmFsaWRhdGlvbiBsb2dpYyBpbiB0aGUgQlBGIHN1YnN5c3RlbSBieSByZXBsYWNpbmcgdGhlIGdyYXBoIHJvb3QgYWN5Y2xpY2l0eSBjaGVjayB3aXRoIGEgbmV3IG93bmVyc2hpcCBkZXB0aCBhbmQgY3ljbGUgZGV0ZWN0aW9uIGFsZ29yaXRobSAoYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCBhbmQgYnRmX293bmVyc2hpcF9kZXB0aCkgY292ZXJpbmcgYm90aCBncmFwaCByb290cyBhbmQgbG9jYWwga3B0cnMuIFRoZXNlIGNoYW5nZXMgYXJlIHJlYWNoYWJsZSB2aWEgdGhlIEJQRl9CVEZfTE9BRCBjb21tYW5kIGluIHRoZSBicGYoKSBzeXN0ZW0gY2FsbCBhbmQgd2FycmFudCBmdXp6aW5nIHRvIHZlcmlmeSBncmFwaCB0cmF2ZXJzYWwgY29ycmVjdG5lc3MgYW5kIGJvdW5kIGVuZm9yY2VtZW50LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxMjoyOTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI5PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggdXBkYXRlcyB0aGUgQlRGIHZlcmlmaWVyIHRvIHZhbGlkYXRlIG93bmVyc2hpcCBhY3ljbGljaXR5IGFuZCBlbmZvcmNlIGEgbWF4aW11bSBvd25lcnNoaXAgZGVwdGggKEJURl9NQVhfT1dORVJTSElQX0RFUFRIKSBhY3Jvc3MgQlBGIGdyYXBoIHJvb3RzIGFuZCBsb2NhbCBrcHRycy5cblxuTWVtb3J5IHNhZmV0eSBhbmFseXNpczpcbjEuIFRoZSB0ZW1wb3JhcnkgZGVwdGggYXJyYXkgdXNlZCBkdXJpbmcgb3duZXJzaGlwIHRyYXZlcnNhbCBpcyBhbGxvY2F0ZWQgdmlhIGt2Y2FsbG9jKCksIGVuc3VyaW5nIGl0IGlzIGZ1bGx5IHplcm8taW5pdGlhbGl6ZWQuXG4yLiBBbGwgbG9jYWwgdmFyaWFibGVzIGluIGJ0Zl9vd25lcnNoaXBfZGVwdGgoKSwgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCgpLCBhbmQgYnRmX293bmVkX3R5cGVfaWR4KCkgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXG4zLiBObyBkYXRhIHN0cnVjdHVyZXMgb3IgYnVmZmVycyBhcmUgY29waWVkIHRvIHVzZXIgc3BhY2UsIGFuZCBubyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkIG9yIHVzZWQgaW4gY29uZGl0aW9uYWwgYnJhbmNoaW5nLlxuNC4gQW55IHBvdGVudGlhbCBpc3N1ZXMgd2l0aCBwb2ludGVyIGFyaXRobWV0aWMgb3IgYXJyYXkgaW5kZXhpbmcgaW50byB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIHdvdWxkIGJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTi5cblxuVGhlcmVmb3JlLCB0aGlzIGNoYW5nZSBkb2VzIG5vdCBpbnRyb2R1Y2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCBuZWVkZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA3YjViOGY2NzY1NzkyYjM2ODYwMGFlNWE2NGJmYjc3YmQxMWE5MmU5CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFN1biBTZXAgNiAxMjoyNzozMiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvYnRmLmMgYi9rZXJuZWwvYnBmL2J0Zi5jCmluZGV4IDljMmNhYjA4YmI3OTQuLjNjNTA4ZWJiMjQzODQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvYnRmLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9idGYuYwpAQCAtNDI2OSwxMyAmIzQzOzQyNjksMTAgQEAgaW50IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYykKIHsKIAlpbnQgaTsKIAotCS8qIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyB0aGF0IHNpZ25pZnkgb3duZXJzaGlwIG9mIHNvbWUgb3RoZXIgdHlwZToKLQkgKiAga3B0cl9yZWYsIGJwZl9saXN0X2hlYWQsIGJwZl9yYl9yb290LgotCSAqIGtwdHJfcmVmIG9ubHkgc3VwcG9ydHMgc3RvcmluZyBrZXJuZWwgdHlwZXMsIHdoaWNoIGNhbiYjMzk7dCBzdG9yZQotCSAqIHJlZmVyZW5jZXMgdG8gcHJvZ3JhbSBhbGxvY2F0ZWQgbG9jYWwgdHlwZXMuCi0JICoKLQkgKiBIZW5jZSB3ZSBvbmx5IG5lZWQgdG8gZW5zdXJlIHRoYXQgYnBmX3tsaXN0X2hlYWQscmJfcm9vdH0gb3duZXJzaGlwCi0JICogZG9lcyBub3QgZm9ybSBjeWNsZXMuCiYjNDM7CS8qCiYjNDM7CSAqIENoZWNrIGZpZWxkcyB3aGljaCByZXF1aXJlIHRoZSBjb21wbGV0ZSBCVEYgYW5kIGluaXRpYWxpemUgcnVudGltZQomIzQzOwkgKiBtZXRhZGF0YS4gT3duZXJzaGlwIHJlbGF0aW9uc2hpcHMgYXJlIHZhbGlkYXRlZCBhZnRlciBldmVyeSByZWNvcmQgaGFzCiYjNDM7CSAqIGJlZW4gZml4ZWQgdXAuCiAJICovCiAJaWYgKElTX0VSUl9PUl9OVUxMKHJlYykgfHwgIShyZWMtJmd0O2ZpZWxkX21hc2sgJmFtcDsgKEJQRl9HUkFQSF9ST09UIHwgQlBGX1VQVFIpKSkKIAkJcmV0dXJuIDA7CkBAIC00MzA2LDUxICYjNDM7NDMwMyw4OCBAQCBpbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKQogCQlpZiAoIW1ldGEpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJcmVjLSZndDtmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9yZWMgPSBtZXRhLSZndDtyZWNvcmQ7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQogCi0JCS8qIFdlIG5lZWQgdG8gc2V0IHZhbHVlX3JlYyBmb3IgYWxsIHJvb3QgdHlwZXMsIGJ1dCBubyBuZWVkCi0JCSAqIHRvIGNoZWNrIG93bmVyc2hpcCBjeWNsZSBmb3IgYSB0eXBlIHVubGVzcyBpdCYjMzk7cyBhbHNvIGEKLQkJICogbm9kZSB0eXBlLgotCQkgKi8KLQkJaWYgKCEocmVjLSZndDtmaWVsZF9tYXNrICZhbXA7IEJQRl9HUkFQSF9OT0RFKSkKJiM0MztzdGF0aWMgaW50IGJ0Zl9vd25lZF90eXBlX2lkeChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsCiYjNDM7CQkJICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9maWVsZCAqZmllbGQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhICptZXRhOwomIzQzOwl1MzIgYnRmX2lkOwomIzQzOwomIzQzOwlpZiAoZmllbGQtJmd0O3R5cGUgJmFtcDsgQlBGX0dSQVBIX1JPT1QpIHsKJiM0MzsJCWJ0Zl9pZCA9IGZpZWxkLSZndDtncmFwaF9yb290LnZhbHVlX2J0Zl9pZDsKJiM0MzsJfSBlbHNlIGlmIChmaWVsZC0mZ3Q7dHlwZSA9PSBCUEZfS1BUUl9SRUYgfHwgZmllbGQtJmd0O3R5cGUgPT0gQlBGX0tQVFJfUEVSQ1BVKSB7CiYjNDM7CQlpZiAoYnRmX2lzX2tlcm5lbChmaWVsZC0mZ3Q7a3B0ci5idGYpKQomIzQzOwkJCXJldHVybiAtRU5PRU5UOwomIzQzOwkJYnRmX2lkID0gZmllbGQtJmd0O2twdHIuYnRmX2lkOwomIzQzOwl9IGVsc2UgewomIzQzOwkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbWV0YSA9IGJ0Zl9maW5kX3N0cnVjdF9tZXRhKGJ0ZiwgYnRmX2lkKTsKJiM0MzsJaWYgKCFtZXRhKQomIzQzOwkJcmV0dXJuIGZpZWxkLSZndDt0eXBlICZhbXA7IEJQRl9HUkFQSF9ST09UID8gLUVGQVVMVCA6IC1FTk9FTlQ7CiYjNDM7CXJldHVybiBtZXRhIC0gdGFiLSZndDt0eXBlczsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBFYWNoIG93bmVyc2hpcCBlZGdlIGFkZHMga2VybmVsIGZyYW1lcyB0aHJvdWdoIGJwZl9vYmpfZnJlZV9maWVsZHMoKSBhbmQKJiM0MzsgKiBfX2JwZl9vYmpfZHJvcF9pbXBsKCkuIEtlZXAgdGhlIGJvdW5kIGRlbGliZXJhdGVseSBzbWFsbCBiZWNhdXNlIG9iamVjdAomIzQzOyAqIGRlc3RydWN0aW9uIGNhbiBpdHNlbGYgcnVuIGJlbG93IGEgQlBGIGNhbGwgY2hhaW4uIEEgZmluYWwgcG9pbnRlZSB3aXRob3V0CiYjNDM7ICogc3BlY2lhbCBmaWVsZHMgaXMgbm90IHByZXNlbnQgaW4gdGhlIHN0cnVjdCBtZXRhZGF0YSB0YWJsZSBhbmQgYWRkcyBvbmx5IGEKJiM0MzsgKiBub24tcmVjdXJzaW5nIGRyb3AuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCA4CiYjNDM7CiYjNDM7c3RhdGljIGludCBidGZfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwKJiM0MzsJCQkgICAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYiwgdTggKmRlcHRoLAomIzQzOwkJCSAgICAgICBpbnQgaWR4LCBpbnQgZGVwdGhfbGVmdCkKJiM0Mzt7CiYjNDM7CWNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMgPSB0YWItJmd0O3R5cGVzW2lkeF0ucmVjb3JkOwomIzQzOwlpbnQgaSwgcmV0LCBtYXhfZGVwdGggPSAwOwomIzQzOwomIzQzOwlpZiAoIWRlcHRoX2xlZnQpCiYjNDM7CQlyZXR1cm4gLUVMT09QOwomIzQzOwlpZiAoZGVwdGhbaWR4XSkKJiM0MzsJCWdvdG8gZG9uZTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IHJlYy0mZ3Q7Y250OyBpJiM0MzsmIzQzOykgewomIzQzOwkJcmV0ID0gYnRmX293bmVkX3R5cGVfaWR4KGJ0ZiwgdGFiLCAmYW1wO3JlYy0mZ3Q7ZmllbGRzW2ldKTsKJiM0MzsJCWlmIChyZXQgPT0gLUVOT0VOVCkKIAkJCWNvbnRpbnVlOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJCXJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCByZXQsIGRlcHRoX2xlZnQgLSAxKTsKJiM0MzsJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CQltYXhfZGVwdGggPSBtYXgobWF4X2RlcHRoLCByZXQpOwomIzQzOwl9CiYjNDM7CWRlcHRoW2lkeF0gPSBtYXhfZGVwdGggJiM0MzsgMTsKJiM0Mztkb25lOgomIzQzOwlyZXR1cm4gZGVwdGhbaWR4XSAmZ3Q7IGRlcHRoX2xlZnQgPyAtRUxPT1AgOiBkZXB0aFtpZHhdOwomIzQzO30KIAotCQkvKiBXZSBuZWVkIHRvIGVuc3VyZSBvd25lcnNoaXAgYWN5Y2xpY2l0eSBhbW9uZyBhbGwgdHlwZXMuIFRoZQotCQkgKiBwcm9wZXIgd2F5IHRvIGRvIGl0IHdvdWxkIGJlIHRvIHRvcG9sb2dpY2FsbHkgc29ydCBhbGwgQlRGCi0JCSAqIElEcyBiYXNlZCBvbiB0aGUgb3duZXJzaGlwIGVkZ2VzLCBzaW5jZSB0aGVyZSBjYW4gYmUgbXVsdGlwbGUKLQkJICogYnBmX3tsaXN0X2hlYWQscmJfbm9kZX0gaW4gYSB0eXBlLiBJbnN0ZWFkLCB3ZSB1c2UgdGhlCi0JCSAqIGZvbGxvd2luZyByZXNhb25pbmc6Ci0JCSAqCi0JCSAqIC0gQSB0eXBlIGNhbiBvbmx5IGJlIG93bmVkIGJ5IGFub3RoZXIgdHlwZSBpbiB1c2VyIEJURiBpZiBpdAotCQkgKiAgIGhhcyBhIGJwZl97bGlzdCxyYn1fbm9kZS4gTGV0JiMzOTtzIGNhbGwgdGhlc2Ugbm9kZSB0eXBlcy4KLQkJICogLSBBIHR5cGUgY2FuIG9ubHkgX293bl8gYW5vdGhlciB0eXBlIGluIHVzZXIgQlRGIGlmIGl0IGhhcyBhCi0JCSAqICAgYnBmX3tsaXN0X2hlYWQscmJfcm9vdH0uIExldCYjMzk7cyBjYWxsIHRoZXNlIHJvb3QgdHlwZXMuCi0JCSAqCi0JCSAqIFdlIGVuc3VyZSB0aGF0IGlmIGEgdHlwZSBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgaXRzCi0JCSAqIGVsZW1lbnQgdHlwZXMgY2Fubm90IGJlIHJvb3QgdHlwZXMuCi0JCSAqCi0JCSAqIFRvIGVuc3VyZSBhY3ljbGljaXR5OgotCQkgKgotCQkgKiBXaGVuIEEgaXMgYW4gcm9vdCB0eXBlIGJ1dCBub3QgYSBub2RlLCBpdHMgb3duZXJzaGlwCi0JCSAqIGNoYWluIGNhbiBiZToKLQkJICoJQSAtJmd0OyBCIC0mZ3Q7IEMKLQkJICogV2hlcmU6Ci0JCSAqIC0gQSBpcyBhbiByb290LCBlLmcuIGhhcyBicGZfcmJfcm9vdC4KLQkJICogLSBCIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBlLmcuIGhhcyBicGZfcmJfbm9kZSBhbmQKLQkJICogICBicGZfbGlzdF9oZWFkLgotCQkgKiAtIEMgaXMgb25seSBhbiByb290LCBlLmcuIGhhcyBicGZfbGlzdF9ub2RlCi0JCSAqCi0JCSAqIFdoZW4gQSBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgc29tZSBvdGhlciB0eXBlIGFscmVhZHkKLQkJICogb3ducyBpdCBpbiB0aGUgQlRGIGRvbWFpbiwgaGVuY2UgaXQgY2FuIG5vdCBvd24KLQkJICogYW5vdGhlciByb290IHR5cGUgdGhyb3VnaCBhbnkgb2YgdGhlIG93bmVyc2hpcCBlZGdlcy4KLQkJICoJQSAtJmd0OyBCCi0JCSAqIFdoZXJlOgotCQkgKiAtIEEgaXMgYm90aCBhbiByb290IGFuZCBub2RlLgotCQkgKiAtIEIgaXMgb25seSBhbiBub2RlLgotCQkgKi8KLQkJaWYgKG1ldGEtJmd0O3JlY29yZC0mZ3Q7ZmllbGRfbWFzayAmYW1wOyBCUEZfR1JBUEhfUk9PVCkKLQkJCXJldHVybiAtRUxPT1A7CiYjNDM7c3RhdGljIGludCBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwKJiM0MzsJCQkJICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKQomIzQzO3sKJiM0MzsJdTggKmRlcHRoOwomIzQzOwlpbnQgaSwgcmV0ID0gMDsKJiM0MzsKJiM0MzsJZGVwdGggPSBrdmNhbGxvYyh0YWItJmd0O2NudCwgc2l6ZW9mKCpkZXB0aCksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1dBUk4pOwomIzQzOwlpZiAoIWRlcHRoKQomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyB0YWItJmd0O2NudDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCBpLAomIzQzOwkJCQkJICBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCk7CiYjNDM7CQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCQlicmVhazsKJiM0MzsJCXJldCA9IDA7CiAJfQotCXJldHVybiAwOwomIzQzOwlrdmZyZWUoZGVwdGgpOwomIzQzOwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2J0Zl9zdHJ1Y3Rfc2hvdyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCwKQEAgLTYwNDUsNiAmIzQzOzYwNzksMTAgQEAgc3RhdGljIHN0cnVjdCBidGYgKmJ0Zl9wYXJzZShjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsCiAJCQlpZiAoZXJyICZsdDsgMCkKIAkJCQlnb3RvIGVycm91dF9tZXRhOwogCQl9CiYjNDM7CiYjNDM7CQllcnIgPSBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGJ0Ziwgc3RydWN0X21ldGFfdGFiKTsKJiM0MzsJCWlmIChlcnIgJmx0OyAwKQomIzQzOwkJCWdvdG8gZXJyb3V0X21ldGE7CiAJfQogCiAJZXJyID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCAmYW1wO2Vudi0mZ3Q7bG9nKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jCmluZGV4IGMzZDEzM2M2YTAwZDQuLjUyZmFiYmVlM2RkNWEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuYwpAQCAtNzE0LDcgJiM0Mzs3MTQsNyBAQCBzdGF0aWMgdm9pZCB0ZXN0X2J0Zih2b2lkKQogCQkJYnJlYWs7CiAKIAkJZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7Ci0JCUFTU0VSVF9FUShlcnIsIC1FTE9PUCwgJiMzNDtjaGVjayBidGYmIzM0Oyk7CiYjNDM7CQlBU1NFUlRfRVEoZXJyLCAwLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKIAkJYnRmX19mcmVlKGJ0Zik7CiAJCWJyZWFrOwogCX0KQEAgLTc3Myw3ICYjNDM7NzczLDcgQEAgc3RhdGljIHZvaWQgdGVzdF9idGYodm9pZCkKIAkJCWJyZWFrOwogCiAJCWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwotCQlBU1NFUlRfRVEoZXJyLCAtRUxPT1AsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzOwkJQVNTRVJUX0VRKGVyciwgMCwgJiMzNDtjaGVjayBidGYmIzM0Oyk7CiAJCWJ0Zl9fZnJlZShidGYpOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi44MzY3NDE1NWUzYjc0Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuYwpAQCAtMCwwICYjNDM7MSwyMDIgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2J0Zi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9idGYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dGVzdF9wcm9ncy5oJmd0OwomIzQzOwomIzQzOyNkZWZpbmUgU1BJTl9MT0NLIDIKJiM0MzsjZGVmaW5lIExJU1RfSEVBRCAzCiYjNDM7I2RlZmluZSBMSVNUX05PREUgNAomIzQzOy8qIEtlZXAgaW4gc3luYyB3aXRoIEJURl9NQVhfT1dORVJTSElQX0RFUFRILiAqLwomIzQzOyNkZWZpbmUgTUFYX09XTkVSU0hJUF9ERVBUSCA4CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBidGYgKmluaXRfYnRmKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnRmICpidGY7CiYjNDM7CWludCBpZDsKJiM0MzsKJiM0MzsJYnRmID0gYnRmX19uZXdfZW1wdHkoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgJiMzNDtidGZfX25ld19lbXB0eSYjMzQ7KSkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwlpZCA9IGJ0Zl9fYWRkX2ludChidGYsICYjMzQ7aW50JiMzNDssIDQsIEJURl9JTlRfU0lHTkVEKTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIDEsICYjMzQ7YnRmX19hZGRfaW50JiMzNDspKQomIzQzOwkJZ290byBlcnJfb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7YnBmX3NwaW5fbG9jayYjMzQ7LCA0KTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIFNQSU5fTE9DSywgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgYnBmX3NwaW5fbG9jayYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyX291dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O2JwZl9saXN0X2hlYWQmIzM0OywgMTYpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgTElTVF9IRUFELCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBicGZfbGlzdF9oZWFkJiMzNDspKQomIzQzOwkJZ290byBlcnJfb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7YnBmX2xpc3Rfbm9kZSYjMzQ7LCAyNCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCBMSVNUX05PREUsICYjMzQ7YnRmX19hZGRfc3RydWN0IGJwZl9saXN0X25vZGUmIzM0OykpCiYjNDM7CQlnb3RvIGVycl9vdXQ7CiYjNDM7CXJldHVybiBidGY7CiYjNDM7CiYjNDM7ZXJyX291dDoKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGFkZF9sb2NhbF9rcHRyKHN0cnVjdCBidGYgKmJ0ZiwgaW50IHBvaW50ZWVfaWQsIGNvbnN0IGNoYXIgKnRhZykKJiM0Mzt7CiYjNDM7CWludCBpZDsKJiM0MzsKJiM0MzsJaWQgPSBidGZfX2FkZF90eXBlX3RhZyhidGYsIHRhZywgcG9pbnRlZV9pZCk7CiYjNDM7CWlmICghQVNTRVJUX0dUKGlkLCAwLCAmIzM0O2J0Zl9fYWRkX3R5cGVfdGFnJiMzNDspKQomIzQzOwkJcmV0dXJuIGlkOwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3B0cihidGYsIGlkKTsKJiM0MzsJQVNTRVJUX0dUKGlkLCAwLCAmIzM0O2J0Zl9fYWRkX3B0ciYjMzQ7KTsKJiM0MzsJcmV0dXJuIGlkOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3NlbGZfY3ljbGUoY29uc3QgY2hhciAqdGFnLCBpbnQgZXhwZWN0ZWRfZXJyKQomIzQzO3sKJiM0MzsJc3RydWN0IGJ0ZiAqYnRmOwomIzQzOwlpbnQgaWQsIGVycjsKJiM0MzsKJiM0MzsJYnRmID0gaW5pdF9idGYoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgJiMzNDtpbml0X2J0ZiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJaWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDcsIHRhZyk7CiYjNDM7CWlmIChpZCAmbHQ7PSAwKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDtzZWxmX2N5Y2xlJiMzNDssIDgpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgNywgJiMzNDtidGZfX2FkZF9zdHJ1Y3Qgc2VsZl9jeWNsZSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7bmV4dCYjMzQ7LCA2LCAwLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIHNlbGZfY3ljbGU6Om5leHQmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7CiYjNDM7CUFTU0VSVF9FUShlcnIsIGV4cGVjdGVkX2VyciwgJiMzNDtjaGVjayBidGYmIzM0Oyk7CiYjNDM7b3V0OgomIzQzOwlidGZfX2ZyZWUoYnRmKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9hYmFfY3ljbGUodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZjsKJiM0MzsJaW50IGlkLCBlcnI7CiYjNDM7CiYjNDM7CWJ0ZiA9IGluaXRfYnRmKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7aW5pdF9idGYmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCAxMCwgJiMzNDtrcHRyJiMzNDspOwomIzQzOwlpZiAoaWQgJmx0Oz0gMCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgOSwgJiMzNDtrcHRyJiMzNDspOwomIzQzOwlpZiAoaWQgJmx0Oz0gMCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7Y3ljbGVfYSYjMzQ7LCA4KTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIDksICYjMzQ7YnRmX19hZGRfc3RydWN0IGN5Y2xlX2EmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O2ImIzM0OywgNiwgMCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBjeWNsZV9hOjpiJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDtjeWNsZV9iJiMzNDssIDgpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgMTAsICYjMzQ7YnRmX19hZGRfc3RydWN0IGN5Y2xlX2ImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O2EmIzM0OywgOCwgMCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBjeWNsZV9iOjphJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwomIzQzOwlBU1NFUlRfRVEoZXJyLCAtRUxPT1AsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzO291dDoKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfbWl4ZWRfY3ljbGUodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZjsKJiM0MzsJaW50IGlkLCBlcnI7CiYjNDM7CiYjNDM7CWJ0ZiA9IGluaXRfYnRmKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7aW5pdF9idGYmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA3LCAmIzM0O2twdHImIzM0Oyk7CiYjNDM7CWlmIChpZCAmbHQ7PSAwKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDttaXhlZF9vd25lciYjMzQ7LCAyMCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCA3LCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBtaXhlZF9vd25lciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7cm9vdCYjMzQ7LCBMSVNUX0hFQUQsIDAsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgbWl4ZWRfb3duZXI6OnJvb3QmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O2xvY2smIzM0OywgU1BJTl9MT0NLLCAxMjgsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgbWl4ZWRfb3duZXI6OmxvY2smIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9kZWNsX3RhZyhidGYsICYjMzQ7Y29udGFpbnM6bWl4ZWRfbm9kZTpub2RlJiMzNDssIDcsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgOCwgJiMzNDtidGZfX2FkZF9kZWNsX3RhZyBtaXhlZF9vd25lciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7bWl4ZWRfbm9kZSYjMzQ7LCAzMik7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCA5LCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBtaXhlZF9ub2RlJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtub2RlJiMzNDssIExJU1RfTk9ERSwgMCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBtaXhlZF9ub2RlOjpub2RlJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtvd25lciYjMzQ7LCA2LCAxOTIsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgbWl4ZWRfbm9kZTo6b3duZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7CiYjNDM7CUFTU0VSVF9FUShlcnIsIC1FTE9PUCwgJiMzNDtjaGVjayBidGYmIzM0Oyk7CiYjNDM7b3V0OgomIzQzOwlidGZfX2ZyZWUoYnRmKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9hY3ljbGljX2RlcHRoKGludCBkZXB0aCwgaW50IGV4cGVjdGVkX2VycikKJiM0Mzt7CiYjNDM7CWludCBwdHJfaWRbTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxXTsKJiM0MzsJaW50IGZpcnN0X3N0cnVjdF9pZDsKJiM0MzsJc3RydWN0IGJ0ZiAqYnRmOwomIzQzOwlpbnQgaWQsIGVyciwgaTsKJiM0MzsKJiM0MzsJYnRmID0gaW5pdF9idGYoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgJiMzNDtpbml0X2J0ZiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJZmlyc3Rfc3RydWN0X2lkID0gNSAmIzQzOyAyICogZGVwdGg7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBkZXB0aDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXB0cl9pZFtpXSA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgZmlyc3Rfc3RydWN0X2lkICYjNDM7IGkgJiM0MzsgMSwgJiMzNDtrcHRyJiMzNDspOwomIzQzOwkJaWYgKHB0cl9pZFtpXSAmbHQ7PSAwKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBkZXB0aDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWNoYXIgbmFtZVsxNl07CiYjNDM7CiYjNDM7CQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICYjMzQ7b3duZXJfJWQmIzM0OywgaSk7CiYjNDM7CQlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIDgpOwomIzQzOwkJaWYgKCFBU1NFUlRfRVEoaWQsIGZpcnN0X3N0cnVjdF9pZCAmIzQzOyBpLCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBvd25lciYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtuZXh0JiMzNDssIHB0cl9pZFtpXSwgMCwgMCk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgb3duZXI6Om5leHQmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O3BsYWluX2xlYWYmIzM0OywgNCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCBmaXJzdF9zdHJ1Y3RfaWQgJiM0MzsgZGVwdGgsICYjMzQ7YnRmX19hZGRfc3RydWN0IHBsYWluX2xlYWYmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7CiYjNDM7CUFTU0VSVF9FUShlcnIsIGV4cGVjdGVkX2VyciwgJiMzNDtjaGVjayBidGYmIzM0Oyk7CiYjNDM7b3V0OgomIzQzOwlidGZfX2ZyZWUoYnRmKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X2xvY2FsX2twdHJfb3duZXJzaGlwKHZvaWQpCiYjNDM7ewomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3NlbGZfY3ljbGUmIzM0OykpCiYjNDM7CQl0ZXN0X3NlbGZfY3ljbGUoJiMzNDtrcHRyJiMzNDssIC1FTE9PUCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7dW50cnVzdGVkX3NlbGZfY3ljbGUmIzM0OykpCiYjNDM7CQl0ZXN0X3NlbGZfY3ljbGUoJiMzNDtrcHRyX3VudHJ1c3RlZCYjMzQ7LCAwKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtwZXJjcHVfc2VsZl9jeWNsZSYjMzQ7KSkKJiM0MzsJCXRlc3Rfc2VsZl9jeWNsZSgmIzM0O3BlcmNwdV9rcHRyJiMzNDssIC1FTE9PUCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7QUJBX2N5Y2xlJiMzNDspKQomIzQzOwkJdGVzdF9hYmFfY3ljbGUoKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDttaXhlZF9ncmFwaF9yb290X2N5Y2xlJiMzNDspKQomIzQzOwkJdGVzdF9taXhlZF9jeWNsZSgpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O21heF9hY3ljbGljJiMzNDspKQomIzQzOwkJdGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEgsIDApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3Rvb19kZWVwX2FjeWNsaWMmIzM0OykpCiYjNDM7CQl0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxLCAtRUxPT1ApOwomIzQzO30KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDcwMzUKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiA0ODQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBQYXRjaCBmb3IgVW5pbml0aWFsaXplZCBNZW1vcnkgUmlza3MqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIHBhdGNoIGFuZCBzZWUgaWYgd2UgaGF2ZSBhbnkgS01TQU4gY29uY2VybnMgaGVyZS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGdvIG1ldGhvZGljYWxseSB0aHJvdWdoIHRoZSBjaGFuZ2VzLCBmb2N1c2luZyBvbiB3aGVyZSBkYXRhIGlzIGJlaW5nIGhhbmRsZWQgYW5kIGVzcGVjaWFsbHkgd2hlcmUgbWVtb3J5IGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uIGhhcHBlbnMuCgpGaXJzdCwgdGhlIGBrZXJuZWwvYnBmL2J0Zi5jYCBjaGFuZ2VzOiBJdCBsb29rcyBsaWtlIHRoZXkmIzM5O3JlIHJld29ya2luZyB0aGUgb3duZXJzaGlwIHZhbGlkYXRpb24gbG9naWMgd2l0aGluIHRoZSBCVEYgKEJQRiBUeXBlIEZvcm1hdCkgc3lzdGVtLiBTcGVjaWZpY2FsbHksIHRoZXkmIzM5O3ZlIHNoaWZ0ZWQgdGhlIGN5Y2xlIGRldGVjdGlvbiBhbmQgb3duZXJzaGlwIHZhbGlkYXRpb24gYXJvdW5kIHdpdGhpbiBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoKWAuIEludGVyZXN0aW5nIHRoYXQgdGhleSBhcmUgcmVtb3Zpbmcgb2xkZXIgY3ljbGUgZGV0ZWN0aW9uIGFuZCBtb3Zpbmcgb3duZXJzaGlwIHZhbGlkYXRpb24gbGF0ZXIuCgpUaGUgYWRkaXRpb24gb2YgYGJ0Zl9vd25lZF90eXBlX2lkeCgpYCBpbW1lZGlhdGVseSBncmFicyBteSBhdHRlbnRpb24uIEl0JiMzOTtzIHB1cnBvc2UgaXMgdG8gZmluZCB0aGUgc3RydWN0IG1ldGEgaW5kZXggZm9yIGFuIG93bmVkIHR5cGUuIEkgaGF2ZSBhbiBpdGNoIHRoYXQgdGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBhIHBvdGVudGlhbCBwb2ludCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gYmUgZXhwb3NlZCBpZiBub3QgaGFuZGxlZCBjYXJlZnVsbHksIGVzcGVjaWFsbHkgaWYgdGhlcmUgYXJlIGFueSBzdWJ0bGUgY2hhbmdlcyBpbiBob3cgdGhpcyBvd25lcnNoaXAgaW5mb3JtYXRpb24gaXMgdHJhY2tlZCwgb3IgaG93IGl0IGludGVyYWN0cyB3aXRoIGtlcm5lbCBwb2ludGVycywgdGhpcyBpcyB3aGVyZSB0byBsb29rLiBUaGUgdXNlIG9mIGAtRU5PRU5UYCBmb3Iga2VybmVsIGtwdHJzIGlzIGFsc28gd29ydGggbm90aW5nOyB3ZSBuZWVkIHRvIHNlZSBob3cgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgcmVzdCBvZiB0aGUgY29kZS4KCmBidGZfb3duZXJzaGlwX2RlcHRoKClgIHNlZW1zIHByZXR0eSBzdHJhaWdodGZvcndhcmQ7IHJlY3Vyc2l2ZSBkZXB0aCBjYWxjdWxhdGlvbiB3aXRoIG1lbW9pemF0aW9uLCBhbmQgY2hlY2tzIGFnYWluc3QgYEJURl9NQVhfT1dORVJTSElQX0RFUFRIYC4gU2VlbXMgbm9ybWFsIGVub3VnaCwgYWx0aG91Z2ggcmVjdXJzaXZlIGZ1bmN0aW9ucyBhcmUgYWx3YXlzIHdvcnRoIGEgY2xvc2UgbG9vayBpbiB0aGVzZSBjb250ZXh0cy4KCk5vdywgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKWAgaXMgd2hlcmUgdGhpbmdzIGdldCBhIGJpdCBtb3JlIGNyaXRpY2FsLiBXZSBoYXZlIG1lbW9yeSBhbGxvY2F0aW9uIHdpdGggYGt2Y2FsbG9jYCwgd2hpY2ggaXMgZ29vZC4gQnV0LCB3ZSBoYXZlIGEgY2hlY2sgZm9yIGAhZGVwdGhgIGFuZCBhIHJldHVybiBvZiBgLUVOT01FTWAuIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhpcyBgLUVOT01FTWAgaXMgaGFuZGxlZCBjb3JyZWN0bHkgdXAgdGhlIGNhbGwgc3RhY2sgdG8gYXZvaWQgYW55IHBvdGVudGlhbCB1c2UtYWZ0ZXItZnJlZSBvciBvdGhlciBtZW1vcnktcmVsYXRlZCBpc3N1ZXMsIG9yIHBlcmhhcHMgYSBkZW5pYWwgb2Ygc2VydmljZSBpZiBzb21ldGhpbmcgaXNuJiMzOTt0IGhhbmRsZWQuIFdlIGFsc28gbmVlZCB0byBzZWUgaWYgdGhlIGBrdmZyZWUoZGVwdGgpYCBoYXBwZW5zIGluIGFsbCBjb2RlIHBhdGhzIGFzIHRoaXMgaXMgY3JpdGljYWwgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLiBUaGUgZmFjdCB0aGF0IGl0IGNhbGxzIGBidGZfb3duZXJzaGlwX2RlcHRoKClgIGZvciBlYWNoIHN0cnVjdCBtZXRhIGluZGV4IGlzIGFsc28gaW1wb3J0YW50IHRvIGNvbnNpZGVyLgoKRmluYWxseSwgdGhlIGBidGZfcGFyc2UoKWAgY2FsbCB0byBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCgpYCBpcyB0aGUgZW50cnkgcG9pbnQsIHNvIHdlIG5lZWQgdG8gc2VlIGhvdyBlcnJvcnMgaGVyZSBwcm9wYWdhdGUuIFRoaXMgaXMgd2hlcmUgdGhlIG92ZXJhbGwgc2VjdXJpdHkgaW1wbGljYXRpb25zIHN0YXJ0IHRvIHJldmVhbCB0aGVtc2VsdmVzLgoKSSB3aWxsIGFsc28gY2hlY2sgdGhlIHNlbGYgdGVzdHMgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNgIGFuZCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuY2AuCgpJJiMzOTtsbCBuZWVkIHRvIGdvIGJhY2sgYW5kIHRob3JvdWdobHkgaW5zcGVjdCB0aGUgY29kZSBzdXJyb3VuZGluZyB0aGVzZSBmdW5jdGlvbnMsIHNwZWNpZmljYWxseSB0aGUgY29udGV4dCBvZiBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoKWAgYW5kIGBidGZfcGFyc2VgLCB0byB1bmRlcnN0YW5kIHRoZSBjb250cm9sIGZsb3csIGVycm9yIGhhbmRsaW5nLCBhbmQgbWVtb3J5IG1hbmFnZW1lbnQuIFdlIG5lZWQgdG8gYmUgYWJzb2x1dGVseSBzdXJlIHRoYXQgZXZlcnkgY29kZSBwYXRoIGlzIHNhZmUgYW5kIHRoYXQgdGhlcmUgYXJlIG5vIGdhcHMgdGhhdCBjb3VsZCBsZWFkIHRvIEtNU0FOIHRyaWdnZXJpbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2J0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9idGYuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2J0Zi5jPTQxMzU9c3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9wYXJzZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsXG4tLVxua2VybmVsL2JwZi9idGYuYy00MjY3LVxua2VybmVsL2JwZi9idGYuYzo0MjY4OmludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG5rZXJuZWwvYnBmL2J0Zi5jLTQyNjkte1xuLS1cbmtlcm5lbC9icGYvYnRmLmM9NTk5OT1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNzctXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHN0cnVjdF9tZXRhX3RhYi1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG5rZXJuZWwvYnBmL2J0Zi5jOjYwNzg6XHRcdFx0ZXJyID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBzdHJ1Y3RfbWV0YV90YWItXHUwMDNldHlwZXNbaV0ucmVjb3JkKTtcbmtlcm5lbC9icGYvYnRmLmMtNjA3OS1cdFx0XHRpZiAoZXJyIFx1MDAzYyAwKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxMjoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NTAzCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMzkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIGl0OgoKKipEaXZpbmcgaW50byBCVEYgRmllbGQgSGFuZGxpbmcqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBpbnRvIHRoZSBuaXR0eS1ncml0dHkuIEkmIzM5O20gZ29pbmcgdG8gZGlnIGludG8gdGhlIGBrZXJuZWwvYnBmL2J0Zi5jYCBmaWxlIGFuZCBzcGVjaWZpY2FsbHkgZm9jdXMgb24gdGhlIGNvZGUgc3Vycm91bmRpbmcgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYCBhbmQgYGJ0Zl9wYXJzZWAuIFdlIGtub3cgQlRGJiMzOTtzIGNydWNpYWwgZm9yIGVmZmljaWVudGx5IHJlcHJlc2VudGluZyBhbmQgbWFuYWdpbmcgdHlwZSBpbmZvcm1hdGlvbiBmb3IgZUJQRiBwcm9ncmFtcywgc28gSSB3YW50IHRvIHVuZGVyc3RhbmQgZXhhY3RseSBob3cgdGhlIGtlcm5lbCB2YWxpZGF0ZXMgYW5kIG1hbmlwdWxhdGVzIEJURiBmaWVsZCBkZWZpbml0aW9ucyBkdXJpbmcgcGFyc2luZy4gSXQmIzM5O3MgaW1wZXJhdGl2ZSBJIGdyYXNwIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgcG90ZW50aWFsIGluY29uc2lzdGVuY2llcyBvciBlcnJvcnMgaW4gdGhlIEJURiBkYXRhIGFuZCwgY3J1Y2lhbGx5LCBob3cgaXQgYXR0ZW1wdHMgdG8gY29ycmVjdCB0aGVtLiBJJiMzOTttIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluIGhvdyB0aGV5JiMzOTt2ZSBoYW5kbGVkIHN0cnVjdHVyZSBhbmQgdW5pb24gb2Zmc2V0cywgYW55IHBhZGRpbmcgaXNzdWVzLCBhbmQgYWxzbyBob3cgdHlwZSByZWxhdGlvbnNoaXBzIGFyZSByZXNvbHZlZC4gTGV0JiMzOTtzIHNlZSBob3cgdGhleSYjMzk7dmUgYWRkcmVzc2VkIHBvdGVudGlhbCBjb3JydXB0aW9uIG9yIGVycm9ycyBpbiB0aGUgZmllbGQgZGF0YSBpdHNlbGYsIGFuZCBlbnN1cmUgb3VyIGFzc3VtcHRpb25zIG1hdGNoIHRoZSBpbXBsZW1lbnRhdGlvbi4gVGhpcyBpcyBnb2luZyB0byBiZSBhYm91dCBtYWludGFpbmluZyB0aGUgaW50ZWdyaXR5IG9mIHRoYXQgY3J1Y2lhbCB0eXBlIGluZm9ybWF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxMjoyOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvYnRmLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0MjY1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDkwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzQyNjU6XHRcdHJldHVybiBFUlJfUFRSKHJldCk7XG40MjY2Olx0fVxuNDI2NzpcdFxuNDI2ODpcdGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG40MjY5Olx0e1xuNDI3MDpcdFx0aW50IGk7XG40MjcxOlx0XG40MjcyOlx0XHQvKlxuNDI3MzpcdFx0ICogQ2hlY2sgZmllbGRzIHdoaWNoIHJlcXVpcmUgdGhlIGNvbXBsZXRlIEJURiBhbmQgaW5pdGlhbGl6ZSBydW50aW1lXG40Mjc0Olx0XHQgKiBtZXRhZGF0YS4gT3duZXJzaGlwIHJlbGF0aW9uc2hpcHMgYXJlIHZhbGlkYXRlZCBhZnRlciBldmVyeSByZWNvcmQgaGFzXG40Mjc1Olx0XHQgKiBiZWVuIGZpeGVkIHVwLlxuNDI3NjpcdFx0ICovXG40Mjc3Olx0XHRpZiAoSVNfRVJSX09SX05VTEwocmVjKSB8fCAhKHJlYy1cdTAwM2VmaWVsZF9tYXNrIFx1MDAyNiAoQlBGX0dSQVBIX1JPT1QgfCBCUEZfVVBUUikpKVxuNDI3ODpcdFx0XHRyZXR1cm4gMDtcbjQyNzk6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHJlYy1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG40MjgwOlx0XHRcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKm1ldGE7XG40MjgxOlx0XHRcdGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdDtcbjQyODI6XHRcdFx0dTMyIGJ0Zl9pZDtcbjQyODM6XHRcbjQyODQ6XHRcdFx0aWYgKHJlYy1cdTAwM2VmaWVsZHNbaV0udHlwZSA9PSBCUEZfVVBUUikge1xuNDI4NTpcdFx0XHRcdC8qIFRoZSB1cHRyIG9ubHkgc3VwcG9ydHMgcGlubmluZyBvbmUgcGFnZSBhbmQgY2Fubm90XG40Mjg2Olx0XHRcdFx0ICogcG9pbnQgdG8gYSBrZXJuZWwgc3RydWN0XG40Mjg3Olx0XHRcdFx0ICovXG40Mjg4Olx0XHRcdFx0aWYgKGJ0Zl9pc19rZXJuZWwocmVjLVx1MDAzZWZpZWxkc1tpXS5rcHRyLmJ0ZikpXG40Mjg5Olx0XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjQyOTA6XHRcdFx0XHR0ID0gYnRmX3R5cGVfYnlfaWQocmVjLVx1MDAzZWZpZWxkc1tpXS5rcHRyLmJ0ZixcbjQyOTE6XHRcdFx0XHRcdFx0ICAgcmVjLVx1MDAzZWZpZWxkc1tpXS5rcHRyLmJ0Zl9pZCk7XG40MjkyOlx0XHRcdFx0aWYgKCF0LVx1MDAzZXNpemUpXG40MjkzOlx0XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjQyOTQ6XHRcdFx0XHRpZiAodC1cdTAwM2VzaXplIFx1MDAzZSBQQUdFX1NJWkUpXG40Mjk1Olx0XHRcdFx0XHRyZXR1cm4gLUUyQklHO1xuNDI5NjpcdFx0XHRcdGNvbnRpbnVlO1xuNDI5NzpcdFx0XHR9XG40Mjk4Olx0XG40Mjk5Olx0XHRcdGlmICghKHJlYy1cdTAwM2VmaWVsZHNbaV0udHlwZSBcdTAwMjYgQlBGX0dSQVBIX1JPT1QpKVxuNDMwMDpcdFx0XHRcdGNvbnRpbnVlO1xuNDMwMTpcdFx0XHRidGZfaWQgPSByZWMtXHUwMDNlZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xuNDMwMjpcdFx0XHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xuNDMwMzpcdFx0XHRpZiAoIW1ldGEpXG40MzA0Olx0XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG40MzA1Olx0XHRcdHJlYy1cdTAwM2VmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9yZWMgPSBtZXRhLVx1MDAzZXJlY29yZDtcbjQzMDY6XHRcdH1cbjQzMDc6XHRcdHJldHVybiAwO1xuNDMwODpcdH1cbjQzMDk6XHRcbjQzMTA6XHRzdGF0aWMgaW50IGJ0Zl9vd25lZF90eXBlX2lkeChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsXG40MzExOlx0XHRcdFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9maWVsZCAqZmllbGQpXG40MzEyOlx0e1xuNDMxMzpcdFx0c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqbWV0YTtcbjQzMTQ6XHRcdHUzMiBidGZfaWQ7XG40MzE1Olx0XG40MzE2Olx0XHRpZiAoZmllbGQtXHUwMDNldHlwZSBcdTAwMjYgQlBGX0dSQVBIX1JPT1QpIHtcbjQzMTc6XHRcdFx0YnRmX2lkID0gZmllbGQtXHUwMDNlZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XG40MzE4Olx0XHR9IGVsc2UgaWYgKGZpZWxkLVx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUkVGIHx8IGZpZWxkLVx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUEVSQ1BVKSB7XG40MzE5Olx0XHRcdGlmIChidGZfaXNfa2VybmVsKGZpZWxkLVx1MDAzZWtwdHIuYnRmKSlcbjQzMjA6XHRcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbjQzMjE6XHRcdFx0YnRmX2lkID0gZmllbGQtXHUwMDNla3B0ci5idGZfaWQ7XG40MzIyOlx0XHR9IGVsc2Uge1xuNDMyMzpcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbjQzMjQ6XHRcdH1cbjQzMjU6XHRcbjQzMjY6XHRcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XG40MzI3Olx0XHRpZiAoIW1ldGEpXG40MzI4Olx0XHRcdHJldHVybiBmaWVsZC1cdTAwM2V0eXBlIFx1MDAyNiBCUEZfR1JBUEhfUk9PVCA/IC1FRkFVTFQgOiAtRU5PRU5UO1xuNDMyOTpcdFx0cmV0dXJuIG1ldGEgLSB0YWItXHUwMDNldHlwZXM7XG40MzMwOlx0fVxuNDMzMTpcdFxuNDMzMjpcdC8qXG40MzMzOlx0ICogRWFjaCBvd25lcnNoaXAgZWRnZSBhZGRzIGtlcm5lbCBmcmFtZXMgdGhyb3VnaCBicGZfb2JqX2ZyZWVfZmllbGRzKCkgYW5kXG40MzM0Olx0ICogX19icGZfb2JqX2Ryb3BfaW1wbCgpLiBLZWVwIHRoZSBib3VuZCBkZWxpYmVyYXRlbHkgc21hbGwgYmVjYXVzZSBvYmplY3RcbjQzMzU6XHQgKiBkZXN0cnVjdGlvbiBjYW4gaXRzZWxmIHJ1biBiZWxvdyBhIEJQRiBjYWxsIGNoYWluLiBBIGZpbmFsIHBvaW50ZWUgd2l0aG91dFxuNDMzNjpcdCAqIHNwZWNpYWwgZmllbGRzIGlzIG5vdCBwcmVzZW50IGluIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgYW5kIGFkZHMgb25seSBhXG40MzM3Olx0ICogbm9uLXJlY3Vyc2luZyBkcm9wLlxuNDMzODpcdCAqL1xuNDMzOTpcdCNkZWZpbmUgQlRGX01BWF9PV05FUlNISVBfREVQVEggOFxuNDM0MDpcdFxuNDM0MTpcdHN0YXRpYyBpbnQgYnRmX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG40MzQyOlx0XHRcdFx0ICAgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsIHU4ICpkZXB0aCxcbjQzNDM6XHRcdFx0XHQgICAgICAgaW50IGlkeCwgaW50IGRlcHRoX2xlZnQpXG40MzQ0Olx0e1xuNDM0NTpcdFx0Y29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYyA9IHRhYi1cdTAwM2V0eXBlc1tpZHhdLnJlY29yZDtcbjQzNDY6XHRcdGludCBpLCByZXQsIG1heF9kZXB0aCA9IDA7XG40MzQ3Olx0XG40MzQ4Olx0XHRpZiAoIWRlcHRoX2xlZnQpXG40MzQ5Olx0XHRcdHJldHVybiAtRUxPT1A7XG40MzUwOlx0XHRpZiAoZGVwdGhbaWR4XSlcbjQzNTE6XHRcdFx0Z290byBkb25lO1xuNDM1MjpcdFxuNDM1MzpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgcmVjLVx1MDAzZWNudDsgaSYjNDM7JiM0MzspIHtcbjQzNTQ6XHRcdFx0cmV0ID0gYnRmX293bmVkX3R5cGVfaWR4KGJ0ZiwgdGFiLCBcdTAwMjZyZWMtXHUwMDNlZmllbGRzW2ldKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTAyNjQKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAzMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIGZ1bmN0aW9ucywgdGhpbmtpbmcgdGhyb3VnaCBpdCBhcyBpZiB0aGV5IHdlcmUgbXkgb3duIG1lbnRhbCBwcm9jZXNzZXM6CgoqKlF1aWNrIFNjYW4gb2YgT3duZXJzaGlwIERlcHRoIGFuZCBQYXJzaW5nIEZ1bmN0aW9ucyoqCgpBbHJpZ2h0LCBiZWZvcmUgZGl2aW5nIGludG8gYW55dGhpbmcgdG9vIGRlZXAsIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gaG93IHRoZXNlIHJlbGF0ZWQgZnVuY3Rpb25zIGFyZSBpbnRlcmFjdGluZy4gSSYjMzk7bSB0aGlua2luZyBhYm91dCBgYnRmX293bmVyc2hpcF9kZXB0aGAsIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCwgYW5kIGBidGZfcGFyc2VgIGluIHBhcnRpY3VsYXIuIEltbWVkaWF0ZWx5LCBJJiMzOTttIGdvaW5nIHRvIHdhbnQgdG8gdW5kZXJzdGFuZCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZGVwdGggY2hlY2tpbmcgYW5kIHBhcnNpbmcuIElzIHRoZSBkZXB0aCBjaGVjayBoYXBwZW5pbmcgKmJlZm9yZSogcGFyc2luZywgb3IgaXMgaXQgaW50ZXJsZWF2ZWQgaW4gc29tZSB3YXk/IE9yIGlzIGBidGZfcGFyc2VgIHRoZSBtYWluIGRyaXZlciB3aXRoIHRoZSBkZXB0aCBjaGVja3MgYmVpbmcgc29tZSBraW5kIG9mIGFuY2lsbGFyeSBvciBoZWxwZXIgZnVuY3Rpb24/IEkgd2FudCB0byBrbm93IGlmIHRoZSBgb3duZXJzaGlwX2RlcHRoYCBmdW5jdGlvbnMgYXJlIGp1c3QgZ3VhcmRzLCBzYW5pdHkgY2hlY2tzLCBvciBpZiB0aGV5JiMzOTtyZSBhY3R1YWxseSBmdW5kYW1lbnRhbGx5IGludm9sdmVkIGluIGhvdyB0aGUgQlRGIGRhdGEgaXMgcHJvY2Vzc2VkIG9yIGNvbnN0cnVjdGVkLiBEb2VzIGEgZGVlcCBvd25lcnNoaXAgbWVhbiBzb21ldGhpbmcgZGlmZmVyZW50IGluIHRoZSBjb250ZXh0IG9mIGBidGZfcGFyc2VgPyBBbmQgZG9lcyB0aGlzIGludGVycGxheSBjaGFuZ2UgaG93IEkgYXBwcm9hY2ggYSBwb3RlbnRpYWwgYW5hbHlzaXMgb3IgZGVidWdnaW5nIHNpdHVhdGlvbj8gVGhpcyBmZWVscyBsaWtlIGFuIGltcG9ydGFudCBzdGFydGluZyBwb2ludC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2J0Zi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDM1NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDs0MzU1Olx0XHRcdGlmIChyZXQgPT0gLUVOT0VOVClcbjQzNTY6XHRcdFx0XHRjb250aW51ZTtcbjQzNTc6XHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbjQzNTg6XHRcdFx0XHRyZXR1cm4gcmV0O1xuNDM1OTpcdFx0XHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgcmV0LCBkZXB0aF9sZWZ0IC0gMSk7XG40MzYwOlx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG40MzYxOlx0XHRcdFx0cmV0dXJuIHJldDtcbjQzNjI6XHRcdFx0bWF4X2RlcHRoID0gbWF4KG1heF9kZXB0aCwgcmV0KTtcbjQzNjM6XHRcdH1cbjQzNjQ6XHRcdGRlcHRoW2lkeF0gPSBtYXhfZGVwdGggJiM0MzsgMTtcbjQzNjU6XHRkb25lOlxuNDM2NjpcdFx0cmV0dXJuIGRlcHRoW2lkeF0gXHUwMDNlIGRlcHRoX2xlZnQgPyAtRUxPT1AgOiBkZXB0aFtpZHhdO1xuNDM2NzpcdH1cbjQzNjg6XHRcbjQzNjk6XHRzdGF0aWMgaW50IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuNDM3MDpcdFx0XHRcdFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxuNDM3MTpcdHtcbjQzNzI6XHRcdHU4ICpkZXB0aDtcbjQzNzM6XHRcdGludCBpLCByZXQgPSAwO1xuNDM3NDpcdFxuNDM3NTpcdFx0ZGVwdGggPSBrdmNhbGxvYyh0YWItXHUwMDNlY250LCBzaXplb2YoKmRlcHRoKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTik7XG40Mzc2Olx0XHRpZiAoIWRlcHRoKVxuNDM3NzpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbjQzNzg6XHRcbjQzNzk6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRhYi1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG40MzgwOlx0XHRcdHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCBpLFxuNDM4MTpcdFx0XHRcdFx0XHQgIEJURl9NQVhfT1dORVJTSElQX0RFUFRIKTtcbjQzODI6XHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbjQzODM6XHRcdFx0XHRicmVhaztcbjQzODQ6XHRcdFx0cmV0ID0gMDtcbjQzODU6XHRcdH1cbjQzODY6XHRcdGt2ZnJlZShkZXB0aCk7XG40Mzg3Olx0XHRyZXR1cm4gcmV0O1xuNDM4ODpcdH1cbjQzODk6XHRcbjQzOTA6XHRzdGF0aWMgdm9pZCBfX2J0Zl9zdHJ1Y3Rfc2hvdyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbjQzOTE6XHRcdFx0XHQgICAgICB1MzIgdHlwZV9pZCwgdm9pZCAqZGF0YSwgdTggYml0c19vZmZzZXQsXG40MzkyOlx0XHRcdFx0ICAgICAgc3RydWN0IGJ0Zl9zaG93ICpzaG93KVxuNDM5MzpcdHtcbjQzOTQ6XHRcdGNvbnN0IHN0cnVjdCBidGZfbWVtYmVyICptZW1iZXI7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExMTY5CgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byBgYnRmX3BhcnNlYCoqCgpPa2F5LCB0aW1lIHRvIHplcm8gaW4uIEkmIzM5O20gdGhpbmtpbmcgd2UgbmVlZCB0byB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgYGJ0Zl9wYXJzZWAsIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSA2MDc1LiBNeSBndXQgZmVlbGluZyBpcyB0aGF0IHNvbWV0aGluZyBpbnRlcmVzdGluZyBpcyBoYXBwZW5pbmcsIG9yICpub3QqIGhhcHBlbmluZywgYXJvdW5kIHRoYXQgYXJlYSB3aXRoaW4gdGhlIGZ1bmN0aW9uLiBHaXZlbiB3aGF0IEkmIzM5O3ZlIGJlZW4gc2VlaW5nIHdpdGggdGhlIHJlbGF0ZWQgaXNzdWVzLCB0aGlzIGlzIGEgbGlrZWx5IHBvaW50IGZvciBkZWVwZXIgaW5zcGVjdGlvbi4gVGltZSB0byBmaXJlIHVwIHRoZSBkZWJ1Z2dlciBhbmQgc3RhcnQgdHJhY2luZyBleGVjdXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9idGYuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDYwNzAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7NjA3MDpcdFx0XHRnb3RvIGVycm91dDtcbjYwNzE6XHRcdH1cbjYwNzI6XHRcdGJ0Zi1cdTAwM2VzdHJ1Y3RfbWV0YV90YWIgPSBzdHJ1Y3RfbWV0YV90YWI7XG42MDczOlx0XG42MDc0Olx0XHRpZiAoc3RydWN0X21ldGFfdGFiKSB7XG42MDc1Olx0XHRcdGludCBpO1xuNjA3NjpcdFxuNjA3NzpcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzdHJ1Y3RfbWV0YV90YWItXHUwMDNlY250OyBpJiM0MzsmIzQzOykge1xuNjA3ODpcdFx0XHRcdGVyciA9IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGJ0Ziwgc3RydWN0X21ldGFfdGFiLVx1MDAzZXR5cGVzW2ldLnJlY29yZCk7XG42MDc5Olx0XHRcdFx0aWYgKGVyciBcdTAwM2MgMClcbjYwODA6XHRcdFx0XHRcdGdvdG8gZXJyb3V0X21ldGE7XG42MDgxOlx0XHRcdH1cbjYwODI6XHRcbjYwODM6XHRcdFx0ZXJyID0gYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChidGYsIHN0cnVjdF9tZXRhX3RhYik7XG42MDg0Olx0XHRcdGlmIChlcnIgXHUwMDNjIDApXG42MDg1Olx0XHRcdFx0Z290byBlcnJvdXRfbWV0YTtcbjYwODY6XHRcdH1cbjYwODc6XHRcbjYwODg6XHRcdGVyciA9IGJwZl9sb2dfYXR0cl9maW5hbGl6ZShhdHRyX2xvZywgXHUwMDI2ZW52LVx1MDAzZWxvZyk7XG42MDg5Olx0XHRpZiAoZXJyKVxuNjA5MDpcdFx0XHRnb3RvIGVycm91dF9mcmVlO1xuNjA5MTpcdFxuNjA5MjpcdFx0YnRmX3ZlcmlmaWVyX2Vudl9mcmVlKGVudik7XG42MDkzOlx0XHRyZWZjb3VudF9zZXQoXHUwMDI2YnRmLVx1MDAzZXJlZmNudCwgMSk7XG42MDk0Olx0XHRyZXR1cm4gYnRmO1xuNjA5NTpcdFxuNjA5NjpcdGVycm91dF9tZXRhOlxuNjA5NzpcdFx0YnRmX2ZyZWVfc3RydWN0X21ldGFfdGFiKGJ0Zik7XG42MDk4Olx0ZXJyb3V0OlxuNjA5OTpcdFx0Lyogb3ZlcndyaXRlIGVyciB3aXRoIC1FTk9TUEMgb3IgLUVGQVVMVCAqL1xuNjEwMDpcdFx0cmV0ID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcdTAwMjZlbnYtXHUwMDNlbG9nKTtcbjYxMDE6XHRcdGlmIChyZXQpXG42MTAyOlx0XHRcdGVyciA9IHJldDtcbjYxMDM6XHRlcnJvdXRfZnJlZTpcbjYxMDQ6XHRcdGJ0Zl92ZXJpZmllcl9lbnZfZnJlZShlbnYpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxMjoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTg3MAoJCQkJCQkJb3V0cHV0OiAyMTMKCQkJCQkJCXRob3VnaHRzOiA3MjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gQXNzZXNzbWVudDogQlRGIE93bmVyc2hpcCBWZXJpZmljYXRpb24qKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgZ29hbCBoZXJlIGlzIHRvIGRldGVybWluZSBpZiB0aGlzIHBhdGNoIGludHJvZHVjZXMgYW55IG5ldyByaXNrcyB0aGF0IHJlcXVpcmUgS01TQU4mIzM5O3MgYXR0ZW50aW9uLiBMZXQgbWUgcmVjYXAgbXkgdGhpbmtpbmcuCgpGaXJzdCwgSSB1bmRlcnN0YW5kIHRoaXMgcGF0Y2ggZm9jdXNlcyBvbiBCVEYgKEJlcmtlbGV5IFBhY2tldCBGaWx0ZXIgVHlwZSBGb3JtYXQpIHZlcmlmaWNhdGlvbiwgc3BlY2lmaWNhbGx5IHJlZ2FyZGluZyB0aGUgb3duZXJzaGlwIG9mIHN0cnVjdHVyZXMgd2l0aGluIHRoZXNlIEJURiBkZWZpbml0aW9ucy4gSSBzZWUgdGhhdCBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIGlzIHNldHRpbmcgdXAgdGhlIG5lY2Vzc2FyeSBsaW5rcyBmb3IgdGhpcyBvd25lcnNoaXAgY2hlY2ssIGFuZCBpbXBvcnRhbnRseSwgdGhlIG93bmVyc2hpcCBjeWNsZSBkZXRlY3Rpb24gaXMgbm93IGhhbmRsZWQgYnkgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgLgoKRGVsdmluZyBpbnRvIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCwgdGhlIGtleSBoZXJlIGlzIHRoZSBhbGxvY2F0aW9uIGFuZCB1c2Ugb2YgdGhlIGBkZXB0aGAgYXJyYXkuIEl0IHVzZXMgYGt2Y2FsbG9jYCwgd2hpY2ggaXMgdGhlIGNvcnJlY3QgY2FsbCBmb3IgemVyby1pbml0aWFsaXppbmcgdGhpcyBhcnJheSwgd2hpY2ggaXMgY3J1Y2lhbCBmb3Igb3VyIHNhZmV0eSBhbmFseXNpcy4gVGhpcyBhcnJheSB0cmFja3MgdGhlIG93bmVyc2hpcCBkZXB0aCBvZiBlYWNoIHN0cnVjdHVyZS4gVGhlIGNvZGUgdGhlbiByZWN1cnNpdmVseSBjaGVja3MgdGhlIG93bmVyc2hpcCBkZXB0aCBmb3IgZWFjaCBzdHJ1Y3QgdXAgdG8gYEJURl9NQVhfT1dORVJTSElQX0RFUFRIYC4gVGhlIG1lbW9pemF0aW9uIHdpdGhpbiB0aGUgZGVwdGggY2hlY2sgaXMgYSBnb29kIG9wdGltaXphdGlvbi4gSWYgdGhlIGBkZXB0aGAgaXMgbm9uLXplcm8sIGl0IG1lYW5zIGl0IHdhcyBwcmV2aW91c2x5IGNoZWNrZWQuIEl0IHRoZW4gZnJlZXMgdGhlIG1lbW9yeSwgd2hpY2ggaXMgYWxzbyBpbXBvcnRhbnQuCgpOb3csIHRoZSBjcml0aWNhbCBxdWVzdGlvbjogYXJlIHRoZXJlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcz8gVGhlIGBkZXB0aGAgYXJyYXkgaXMgKnplcm9lZCogYnkgYGt2Y2FsbG9jYC4gQWxsIG90aGVyIHZhcmlhYmxlcyBzZWVtIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQuIE5vdGhpbmcgaXMgZGlyZWN0bHkgY29waWVkIHRvIHVzZXIgc3BhY2Ugb3IgZXhwb3NlZC4gVGhpcyBsb29rcyBnb29kLgoKTmV4dCwgSSBuZWVkIHRvIGNvbnNpZGVyIHBvdGVudGlhbCBidWZmZXIgb3ZlcnJ1bnMsIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGluIEJQRiBvYmplY3RzLCBvciBjaGFuZ2VzIHRvIGxlbmd0aHMuIEhvd2V2ZXIsIHRoaXMgcGF0Y2ggaXMgb25seSB2YWxpZGF0aW5nIGludGVybmFsIHN0cnVjdHVyZXMuIEl0IHNlZW1zIHRvIGJlIHNvbGVseSBpbnZvbHZlZCBpbiB2ZXJpZmljYXRpb24sICpub3QqIGNyZWF0aW5nLCBtb2RpZnlpbmcsIG9yIHNlbmRpbmcgYW55dGhpbmcgdG8gdXNlci1zcGFjZSB0aGF0IGlzbiYjMzk7dCBhbHJlYWR5IGhhbmRsZWQgYnkgb3RoZXIga2VybmVsIGNvZGUuIEkmIzM5O20gc2F0aXNmaWVkIHRoYXQgdGhpcyBwYXRjaCBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IG5ldyB2dWxuZXJhYmlsaXRpZXMgcmVsYXRlZCB0byB0aGVzZSBpc3N1ZXMuIEZ1cnRoZXIsIGlmIHRoZXJlIHdlcmUgYW55IG1lbW9yeSBwcm9ibGVtcyBpbiB0aGUgdGFibGUsIEtBU0FOIHNob3VsZCBoYW5kbGUgdGhlbS4KCkxldCBtZSBnbyB0aHJvdWdoIG15IHVzdWFsIGNoZWNrbGlzdDogbm8ga2VybmVsIHN0cnVjdHVyZXMgYXJlIHNlbnQgdG8gdXNlciBzcGFjZSB3aGVyZSBmaWVsZHMgbWlnaHQgYmUgdW5pbml0aWFsaXplZC4gVGhlcmUgaXMgbm8gY29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIGJhc2VkIG9uIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLiBDb21wbGV4IGRhdGEgc3RydWN0dXJlcywgbGlrZSB0aGUgZGVwdGggYXJyYXksIGFyZSBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQgd2l0aCBga3ZjYWxsb2NgLiBUaGUgYm91bmRzIGNoZWNrcyBhcmUgZ29vZCBhbmQgdGhpcyBwYXRjaCBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IG5ldyBvcHBvcnR1bml0aWVzIHRvIHJlYWQgdW5pbml0aWFsaXplZCBtZW1vcnkuCgpUaGVyZWZvcmUsIGFmdGVyIHRoaXMgZGV0YWlsZWQgYXNzZXNzbWVudCwgSSBjYW4gY29uZmlkZW50bHkgY29uY2x1ZGUgdGhhdCBgTmVlZHNLTVNBTmAgc2hvdWxkIGJlIGZhbHNlLgoKSW4gc3VtbWFyeSwgdGhpcyBwYXRjaCBlbmZvcmNlcyBCVEYgb3duZXJzaGlwIHZlcmlmaWNhdGlvbiB0byBjaGVjayBmb3IgY3ljbGVzIGFuZCBsaW1pdCBkZXB0aC4gVGhlIG1haW4gbWVtb3J5IGNvbmNlcm4gaXMgY29ycmVjdGx5IGhhbmRsZWQgYnkgYGt2Y2FsbG9jYCwgemVyb2luZyB0aGUgYGRlcHRoYCBhcnJheS4gQW55IHBvdGVudGlhbCBpc3N1ZXMgd2l0aCB0aGUgdGFibGUgb3IgbG9vcHMgYXJlIGJldHRlciBhZGRyZXNzZWQgYnkgc3RhbmRhcmQgc2FuaXRpemVycyBzdWNoIGFzIEtBU0FOLgoKSSYjMzk7bSBjb21mb3J0YWJsZSBzZXR0aW5nIHRoZSByZXN1bHRzIG5vdy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggdXBkYXRlcyB0aGUgQlRGIHZlcmlmaWVyIHRvIHZhbGlkYXRlIG93bmVyc2hpcCBhY3ljbGljaXR5IGFuZCBlbmZvcmNlIGEgbWF4aW11bSBvd25lcnNoaXAgZGVwdGggKEJURl9NQVhfT1dORVJTSElQX0RFUFRIKSBhY3Jvc3MgQlBGIGdyYXBoIHJvb3RzIGFuZCBsb2NhbCBrcHRycy5cblxuTWVtb3J5IHNhZmV0eSBhbmFseXNpczpcbjEuIFRoZSB0ZW1wb3JhcnkgZGVwdGggYXJyYXkgdXNlZCBkdXJpbmcgb3duZXJzaGlwIHRyYXZlcnNhbCBpcyBhbGxvY2F0ZWQgdmlhIGt2Y2FsbG9jKCksIGVuc3VyaW5nIGl0IGlzIGZ1bGx5IHplcm8taW5pdGlhbGl6ZWQuXG4yLiBBbGwgbG9jYWwgdmFyaWFibGVzIGluIGJ0Zl9vd25lcnNoaXBfZGVwdGgoKSwgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCgpLCBhbmQgYnRmX293bmVkX3R5cGVfaWR4KCkgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXG4zLiBObyBkYXRhIHN0cnVjdHVyZXMgb3IgYnVmZmVycyBhcmUgY29waWVkIHRvIHVzZXIgc3BhY2UsIGFuZCBubyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkIG9yIHVzZWQgaW4gY29uZGl0aW9uYWwgYnJhbmNoaW5nLlxuNC4gQW55IHBvdGVudGlhbCBpc3N1ZXMgd2l0aCBwb2ludGVyIGFyaXRobWV0aWMgb3IgYXJyYXkgaW5kZXhpbmcgaW50byB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIHdvdWxkIGJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTi5cblxuVGhlcmVmb3JlLCB0aGlzIGNoYW5nZSBkb2VzIG5vdCBpbnRyb2R1Y2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCBuZWVkZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCB1cGRhdGVzIHRoZSBCVEYgdmVyaWZpZXIgdG8gdmFsaWRhdGUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW5kIGVuZm9yY2UgYSBtYXhpbXVtIG93bmVyc2hpcCBkZXB0aCAoQlRGX01BWF9PV05FUlNISVBfREVQVEgpIGFjcm9zcyBCUEYgZ3JhcGggcm9vdHMgYW5kIGxvY2FsIGtwdHJzLlxuXG5NZW1vcnkgc2FmZXR5IGFuYWx5c2lzOlxuMS4gVGhlIHRlbXBvcmFyeSBkZXB0aCBhcnJheSB1c2VkIGR1cmluZyBvd25lcnNoaXAgdHJhdmVyc2FsIGlzIGFsbG9jYXRlZCB2aWEga3ZjYWxsb2MoKSwgZW5zdXJpbmcgaXQgaXMgZnVsbHkgemVyby1pbml0aWFsaXplZC5cbjIuIEFsbCBsb2NhbCB2YXJpYWJsZXMgaW4gYnRmX293bmVyc2hpcF9kZXB0aCgpLCBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKCksIGFuZCBidGZfb3duZWRfdHlwZV9pZHgoKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS5cbjMuIE5vIGRhdGEgc3RydWN0dXJlcyBvciBidWZmZXJzIGFyZSBjb3BpZWQgdG8gdXNlciBzcGFjZSwgYW5kIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHJlYWQgb3IgdXNlZCBpbiBjb25kaXRpb25hbCBicmFuY2hpbmcuXG40LiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIHBvaW50ZXIgYXJpdGhtZXRpYyBvciBhcnJheSBpbmRleGluZyBpbnRvIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgd291bGQgYmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOLlxuXG5UaGVyZWZvcmUsIHRoaXMgY2hhbmdlIGRvZXMgbm90IGludHJvZHVjZSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IG5lZWRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjc6MzMuNjgwODE1OTU3WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTIyNTE1MTkyNDgzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aFwiLFxuICAgIFwiYnRmX293bmVyc2hpcF9kZXB0aFwiLFxuICAgIFwiYnRmX293bmVkX3R5cGVfaWR4XCIsXG4gICAgXCJidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc1wiLFxuICAgIFwiYnRmX3BhcnNlXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCB1cGRhdGVzIHRoZSBCVEYgdmVyaWZpZXIgdG8gdmFsaWRhdGUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW5kIGVuZm9yY2UgYSBtYXhpbXVtIG93bmVyc2hpcCBkZXB0aCAoQlRGX01BWF9PV05FUlNISVBfREVQVEgpIGFjcm9zcyBCUEYgZ3JhcGggcm9vdHMgYW5kIGxvY2FsIGtwdHJzLlxcblxcbk1lbW9yeSBzYWZldHkgYW5hbHlzaXM6XFxuMS4gVGhlIHRlbXBvcmFyeSBkZXB0aCBhcnJheSB1c2VkIGR1cmluZyBvd25lcnNoaXAgdHJhdmVyc2FsIGlzIGFsbG9jYXRlZCB2aWEga3ZjYWxsb2MoKSwgZW5zdXJpbmcgaXQgaXMgZnVsbHkgemVyby1pbml0aWFsaXplZC5cXG4yLiBBbGwgbG9jYWwgdmFyaWFibGVzIGluIGJ0Zl9vd25lcnNoaXBfZGVwdGgoKSwgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCgpLCBhbmQgYnRmX293bmVkX3R5cGVfaWR4KCkgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXFxuMy4gTm8gZGF0YSBzdHJ1Y3R1cmVzIG9yIGJ1ZmZlcnMgYXJlIGNvcGllZCB0byB1c2VyIHNwYWNlLCBhbmQgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgcmVhZCBvciB1c2VkIGluIGNvbmRpdGlvbmFsIGJyYW5jaGluZy5cXG40LiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIHBvaW50ZXIgYXJpdGhtZXRpYyBvciBhcnJheSBpbmRleGluZyBpbnRvIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgd291bGQgYmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOLlxcblxcblRoZXJlZm9yZSwgdGhpcyBjaGFuZ2UgZG9lcyBub3QgaW50cm9kdWNlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgbmVlZGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIEJURiB2YWxpZGF0aW9uIGxvZ2ljIGluIHRoZSBCUEYgc3Vic3lzdGVtIGJ5IHJlcGxhY2luZyB0aGUgZ3JhcGggcm9vdCBhY3ljbGljaXR5IGNoZWNrIHdpdGggYSBuZXcgb3duZXJzaGlwIGRlcHRoIGFuZCBjeWNsZSBkZXRlY3Rpb24gYWxnb3JpdGhtIChidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoIGFuZCBidGZfb3duZXJzaGlwX2RlcHRoKSBjb3ZlcmluZyBib3RoIGdyYXBoIHJvb3RzIGFuZCBsb2NhbCBrcHRycy4gVGhlc2UgY2hhbmdlcyBhcmUgcmVhY2hhYmxlIHZpYSB0aGUgQlBGX0JURl9MT0FEIGNvbW1hbmQgaW4gdGhlIGJwZigpIHN5c3RlbSBjYWxsIGFuZCB3YXJyYW50IGZ1enppbmcgdG8gdmVyaWZ5IGdyYXBoIHRyYXZlcnNhbCBjb3JyZWN0bmVzcyBhbmQgYm91bmQgZW5mb3JjZW1lbnQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDEyOjI3OjMzLjY4MDgyMDEzN1oiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTc5MDg3MzQzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgN2I1YjhmNjc2NTc5MmIzNjg2MDBhZTVhNjRiZmI3N2JkMTFhOTJlOVxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgU3VuIFNlcCA2IDEyOjI3OjMyIDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvYnRmLmMgYi9rZXJuZWwvYnBmL2J0Zi5jXFxuaW5kZXggOWMyY2FiMDhiYjc5NC4uM2M1MDhlYmIyNDM4NCAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvYnBmL2J0Zi5jXFxuKysrIGIva2VybmVsL2JwZi9idGYuY1xcbkBAIC00MjY5LDEzICs0MjY5LDEwIEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXFxuIHtcXG4gXFx0aW50IGk7XFxuIFxcbi1cXHQvKiBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgdGhhdCBzaWduaWZ5IG93bmVyc2hpcCBvZiBzb21lIG90aGVyIHR5cGU6XFxuLVxcdCAqICBrcHRyX3JlZiwgYnBmX2xpc3RfaGVhZCwgYnBmX3JiX3Jvb3QuXFxuLVxcdCAqIGtwdHJfcmVmIG9ubHkgc3VwcG9ydHMgc3RvcmluZyBrZXJuZWwgdHlwZXMsIHdoaWNoIGNhbid0IHN0b3JlXFxuLVxcdCAqIHJlZmVyZW5jZXMgdG8gcHJvZ3JhbSBhbGxvY2F0ZWQgbG9jYWwgdHlwZXMuXFxuLVxcdCAqXFxuLVxcdCAqIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBlbnN1cmUgdGhhdCBicGZfe2xpc3RfaGVhZCxyYl9yb290fSBvd25lcnNoaXBcXG4tXFx0ICogZG9lcyBub3QgZm9ybSBjeWNsZXMuXFxuK1xcdC8qXFxuK1xcdCAqIENoZWNrIGZpZWxkcyB3aGljaCByZXF1aXJlIHRoZSBjb21wbGV0ZSBCVEYgYW5kIGluaXRpYWxpemUgcnVudGltZVxcbitcXHQgKiBtZXRhZGF0YS4gT3duZXJzaGlwIHJlbGF0aW9uc2hpcHMgYXJlIHZhbGlkYXRlZCBhZnRlciBldmVyeSByZWNvcmQgaGFzXFxuK1xcdCAqIGJlZW4gZml4ZWQgdXAuXFxuIFxcdCAqL1xcbiBcXHRpZiAoSVNfRVJSX09SX05VTEwocmVjKSB8fCAhKHJlYy1cXHUwMDNlZmllbGRfbWFzayBcXHUwMDI2IChCUEZfR1JBUEhfUk9PVCB8IEJQRl9VUFRSKSkpXFxuIFxcdFxcdHJldHVybiAwO1xcbkBAIC00MzA2LDUxICs0MzAzLDg4IEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXFxuIFxcdFxcdGlmICghbWV0YSlcXG4gXFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIFxcdFxcdHJlYy1cXHUwMDNlZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfcmVjID0gbWV0YS1cXHUwMDNlcmVjb3JkO1xcbitcXHR9XFxuK1xcdHJldHVybiAwO1xcbit9XFxuIFxcbi1cXHRcXHQvKiBXZSBuZWVkIHRvIHNldCB2YWx1ZV9yZWMgZm9yIGFsbCByb290IHR5cGVzLCBidXQgbm8gbmVlZFxcbi1cXHRcXHQgKiB0byBjaGVjayBvd25lcnNoaXAgY3ljbGUgZm9yIGEgdHlwZSB1bmxlc3MgaXQncyBhbHNvIGFcXG4tXFx0XFx0ICogbm9kZSB0eXBlLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKCEocmVjLVxcdTAwM2VmaWVsZF9tYXNrIFxcdTAwMjYgQlBGX0dSQVBIX05PREUpKVxcbitzdGF0aWMgaW50IGJ0Zl9vd25lZF90eXBlX2lkeChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsXFxuK1xcdFxcdFxcdCAgICAgIGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkKVxcbit7XFxuK1xcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKm1ldGE7XFxuK1xcdHUzMiBidGZfaWQ7XFxuK1xcbitcXHRpZiAoZmllbGQtXFx1MDAzZXR5cGUgXFx1MDAyNiBCUEZfR1JBUEhfUk9PVCkge1xcbitcXHRcXHRidGZfaWQgPSBmaWVsZC1cXHUwMDNlZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XFxuK1xcdH0gZWxzZSBpZiAoZmllbGQtXFx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUkVGIHx8IGZpZWxkLVxcdTAwM2V0eXBlID09IEJQRl9LUFRSX1BFUkNQVSkge1xcbitcXHRcXHRpZiAoYnRmX2lzX2tlcm5lbChmaWVsZC1cXHUwMDNla3B0ci5idGYpKVxcbitcXHRcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4rXFx0XFx0YnRmX2lkID0gZmllbGQtXFx1MDAzZWtwdHIuYnRmX2lkO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4rXFx0fVxcbitcXG4rXFx0bWV0YSA9IGJ0Zl9maW5kX3N0cnVjdF9tZXRhKGJ0ZiwgYnRmX2lkKTtcXG4rXFx0aWYgKCFtZXRhKVxcbitcXHRcXHRyZXR1cm4gZmllbGQtXFx1MDAzZXR5cGUgXFx1MDAyNiBCUEZfR1JBUEhfUk9PVCA/IC1FRkFVTFQgOiAtRU5PRU5UO1xcbitcXHRyZXR1cm4gbWV0YSAtIHRhYi1cXHUwMDNldHlwZXM7XFxuK31cXG4rXFxuKy8qXFxuKyAqIEVhY2ggb3duZXJzaGlwIGVkZ2UgYWRkcyBrZXJuZWwgZnJhbWVzIHRocm91Z2ggYnBmX29ial9mcmVlX2ZpZWxkcygpIGFuZFxcbisgKiBfX2JwZl9vYmpfZHJvcF9pbXBsKCkuIEtlZXAgdGhlIGJvdW5kIGRlbGliZXJhdGVseSBzbWFsbCBiZWNhdXNlIG9iamVjdFxcbisgKiBkZXN0cnVjdGlvbiBjYW4gaXRzZWxmIHJ1biBiZWxvdyBhIEJQRiBjYWxsIGNoYWluLiBBIGZpbmFsIHBvaW50ZWUgd2l0aG91dFxcbisgKiBzcGVjaWFsIGZpZWxkcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIGFuZCBhZGRzIG9ubHkgYVxcbisgKiBub24tcmVjdXJzaW5nIGRyb3AuXFxuKyAqL1xcbisjZGVmaW5lIEJURl9NQVhfT1dORVJTSElQX0RFUFRIIDhcXG4rXFxuK3N0YXRpYyBpbnQgYnRmX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXFxuK1xcdFxcdFxcdCAgICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLCB1OCAqZGVwdGgsXFxuK1xcdFxcdFxcdCAgICAgICBpbnQgaWR4LCBpbnQgZGVwdGhfbGVmdClcXG4re1xcbitcXHRjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjID0gdGFiLVxcdTAwM2V0eXBlc1tpZHhdLnJlY29yZDtcXG4rXFx0aW50IGksIHJldCwgbWF4X2RlcHRoID0gMDtcXG4rXFxuK1xcdGlmICghZGVwdGhfbGVmdClcXG4rXFx0XFx0cmV0dXJuIC1FTE9PUDtcXG4rXFx0aWYgKGRlcHRoW2lkeF0pXFxuK1xcdFxcdGdvdG8gZG9uZTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyByZWMtXFx1MDAzZWNudDsgaSsrKSB7XFxuK1xcdFxcdHJldCA9IGJ0Zl9vd25lZF90eXBlX2lkeChidGYsIHRhYiwgXFx1MDAyNnJlYy1cXHUwMDNlZmllbGRzW2ldKTtcXG4rXFx0XFx0aWYgKHJldCA9PSAtRU5PRU5UKVxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCByZXQsIGRlcHRoX2xlZnQgLSAxKTtcXG4rXFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdG1heF9kZXB0aCA9IG1heChtYXhfZGVwdGgsIHJldCk7XFxuK1xcdH1cXG4rXFx0ZGVwdGhbaWR4XSA9IG1heF9kZXB0aCArIDE7XFxuK2RvbmU6XFxuK1xcdHJldHVybiBkZXB0aFtpZHhdIFxcdTAwM2UgZGVwdGhfbGVmdCA/IC1FTE9PUCA6IGRlcHRoW2lkeF07XFxuK31cXG4gXFxuLVxcdFxcdC8qIFdlIG5lZWQgdG8gZW5zdXJlIG93bmVyc2hpcCBhY3ljbGljaXR5IGFtb25nIGFsbCB0eXBlcy4gVGhlXFxuLVxcdFxcdCAqIHByb3BlciB3YXkgdG8gZG8gaXQgd291bGQgYmUgdG8gdG9wb2xvZ2ljYWxseSBzb3J0IGFsbCBCVEZcXG4tXFx0XFx0ICogSURzIGJhc2VkIG9uIHRoZSBvd25lcnNoaXAgZWRnZXMsIHNpbmNlIHRoZXJlIGNhbiBiZSBtdWx0aXBsZVxcbi1cXHRcXHQgKiBicGZfe2xpc3RfaGVhZCxyYl9ub2RlfSBpbiBhIHR5cGUuIEluc3RlYWQsIHdlIHVzZSB0aGVcXG4tXFx0XFx0ICogZm9sbG93aW5nIHJlc2FvbmluZzpcXG4tXFx0XFx0ICpcXG4tXFx0XFx0ICogLSBBIHR5cGUgY2FuIG9ubHkgYmUgb3duZWQgYnkgYW5vdGhlciB0eXBlIGluIHVzZXIgQlRGIGlmIGl0XFxuLVxcdFxcdCAqICAgaGFzIGEgYnBmX3tsaXN0LHJifV9ub2RlLiBMZXQncyBjYWxsIHRoZXNlIG5vZGUgdHlwZXMuXFxuLVxcdFxcdCAqIC0gQSB0eXBlIGNhbiBvbmx5IF9vd25fIGFub3RoZXIgdHlwZSBpbiB1c2VyIEJURiBpZiBpdCBoYXMgYVxcbi1cXHRcXHQgKiAgIGJwZl97bGlzdF9oZWFkLHJiX3Jvb3R9LiBMZXQncyBjYWxsIHRoZXNlIHJvb3QgdHlwZXMuXFxuLVxcdFxcdCAqXFxuLVxcdFxcdCAqIFdlIGVuc3VyZSB0aGF0IGlmIGEgdHlwZSBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgaXRzXFxuLVxcdFxcdCAqIGVsZW1lbnQgdHlwZXMgY2Fubm90IGJlIHJvb3QgdHlwZXMuXFxuLVxcdFxcdCAqXFxuLVxcdFxcdCAqIFRvIGVuc3VyZSBhY3ljbGljaXR5Olxcbi1cXHRcXHQgKlxcbi1cXHRcXHQgKiBXaGVuIEEgaXMgYW4gcm9vdCB0eXBlIGJ1dCBub3QgYSBub2RlLCBpdHMgb3duZXJzaGlwXFxuLVxcdFxcdCAqIGNoYWluIGNhbiBiZTpcXG4tXFx0XFx0ICpcXHRBIC1cXHUwMDNlIEIgLVxcdTAwM2UgQ1xcbi1cXHRcXHQgKiBXaGVyZTpcXG4tXFx0XFx0ICogLSBBIGlzIGFuIHJvb3QsIGUuZy4gaGFzIGJwZl9yYl9yb290Llxcbi1cXHRcXHQgKiAtIEIgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIGUuZy4gaGFzIGJwZl9yYl9ub2RlIGFuZFxcbi1cXHRcXHQgKiAgIGJwZl9saXN0X2hlYWQuXFxuLVxcdFxcdCAqIC0gQyBpcyBvbmx5IGFuIHJvb3QsIGUuZy4gaGFzIGJwZl9saXN0X25vZGVcXG4tXFx0XFx0ICpcXG4tXFx0XFx0ICogV2hlbiBBIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBzb21lIG90aGVyIHR5cGUgYWxyZWFkeVxcbi1cXHRcXHQgKiBvd25zIGl0IGluIHRoZSBCVEYgZG9tYWluLCBoZW5jZSBpdCBjYW4gbm90IG93blxcbi1cXHRcXHQgKiBhbm90aGVyIHJvb3QgdHlwZSB0aHJvdWdoIGFueSBvZiB0aGUgb3duZXJzaGlwIGVkZ2VzLlxcbi1cXHRcXHQgKlxcdEEgLVxcdTAwM2UgQlxcbi1cXHRcXHQgKiBXaGVyZTpcXG4tXFx0XFx0ICogLSBBIGlzIGJvdGggYW4gcm9vdCBhbmQgbm9kZS5cXG4tXFx0XFx0ICogLSBCIGlzIG9ubHkgYW4gbm9kZS5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdGlmIChtZXRhLVxcdTAwM2VyZWNvcmQtXFx1MDAzZWZpZWxkX21hc2sgXFx1MDAyNiBCUEZfR1JBUEhfUk9PVClcXG4tXFx0XFx0XFx0cmV0dXJuIC1FTE9PUDtcXG4rc3RhdGljIGludCBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG4rXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxcbit7XFxuK1xcdHU4ICpkZXB0aDtcXG4rXFx0aW50IGksIHJldCA9IDA7XFxuK1xcbitcXHRkZXB0aCA9IGt2Y2FsbG9jKHRhYi1cXHUwMDNlY250LCBzaXplb2YoKmRlcHRoKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTik7XFxuK1xcdGlmICghZGVwdGgpXFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHRhYi1cXHUwMDNlY250OyBpKyspIHtcXG4rXFx0XFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIGksXFxuK1xcdFxcdFxcdFxcdFxcdCAgQlRGX01BWF9PV05FUlNISVBfREVQVEgpO1xcbitcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdHJldCA9IDA7XFxuIFxcdH1cXG4tXFx0cmV0dXJuIDA7XFxuK1xcdGt2ZnJlZShkZXB0aCk7XFxuK1xcdHJldHVybiByZXQ7XFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIF9fYnRmX3N0cnVjdF9zaG93KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxcbkBAIC02MDQ1LDYgKzYwNzksMTAgQEAgc3RhdGljIHN0cnVjdCBidGYgKmJ0Zl9wYXJzZShjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXFxuIFxcdFxcdFxcdGlmIChlcnIgXFx1MDAzYyAwKVxcbiBcXHRcXHRcXHRcXHRnb3RvIGVycm91dF9tZXRhO1xcbiBcXHRcXHR9XFxuK1xcbitcXHRcXHRlcnIgPSBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGJ0Ziwgc3RydWN0X21ldGFfdGFiKTtcXG4rXFx0XFx0aWYgKGVyciBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdGdvdG8gZXJyb3V0X21ldGE7XFxuIFxcdH1cXG4gXFxuIFxcdGVyciA9IGJwZl9sb2dfYXR0cl9maW5hbGl6ZShhdHRyX2xvZywgXFx1MDAyNmVudi1cXHUwMDNlbG9nKTtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcXG5pbmRleCBjM2QxMzNjNmEwMGQ0Li41MmZhYmJlZTNkZDVhIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jXFxuQEAgLTcxNCw3ICs3MTQsNyBAQCBzdGF0aWMgdm9pZCB0ZXN0X2J0Zih2b2lkKVxcbiBcXHRcXHRcXHRicmVhaztcXG4gXFxuIFxcdFxcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xcbi1cXHRcXHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFxcXCJjaGVjayBidGZcXFwiKTtcXG4rXFx0XFx0QVNTRVJUX0VRKGVyciwgMCwgXFxcImNoZWNrIGJ0ZlxcXCIpO1xcbiBcXHRcXHRidGZfX2ZyZWUoYnRmKTtcXG4gXFx0XFx0YnJlYWs7XFxuIFxcdH1cXG5AQCAtNzczLDcgKzc3Myw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfYnRmKHZvaWQpXFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXG4gXFx0XFx0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XFxuLVxcdFxcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXFxcImNoZWNrIGJ0ZlxcXCIpO1xcbitcXHRcXHRBU1NFUlRfRVEoZXJyLCAwLCBcXFwiY2hlY2sgYnRmXFxcIik7XFxuIFxcdFxcdGJ0Zl9fZnJlZShidGYpO1xcbiBcXHRcXHRicmVhaztcXG4gXFx0fVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uODM2NzQxNTVlM2I3NFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jXFxuQEAgLTAsMCArMSwyMDIgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9idGYuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2J0Zi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdGVzdF9wcm9ncy5oXFx1MDAzZVxcbitcXG4rI2RlZmluZSBTUElOX0xPQ0sgMlxcbisjZGVmaW5lIExJU1RfSEVBRCAzXFxuKyNkZWZpbmUgTElTVF9OT0RFIDRcXG4rLyogS2VlcCBpbiBzeW5jIHdpdGggQlRGX01BWF9PV05FUlNISVBfREVQVEguICovXFxuKyNkZWZpbmUgTUFYX09XTkVSU0hJUF9ERVBUSCA4XFxuK1xcbitzdGF0aWMgc3RydWN0IGJ0ZiAqaW5pdF9idGYodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgYnRmICpidGY7XFxuK1xcdGludCBpZDtcXG4rXFxuK1xcdGJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFxcXCJidGZfX25ld19lbXB0eVxcXCIpKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0aWQgPSBidGZfX2FkZF9pbnQoYnRmLCBcXFwiaW50XFxcIiwgNCwgQlRGX0lOVF9TSUdORUQpO1xcbitcXHRpZiAoIUFTU0VSVF9FUShpZCwgMSwgXFxcImJ0Zl9fYWRkX2ludFxcXCIpKVxcbitcXHRcXHRnb3RvIGVycl9vdXQ7XFxuK1xcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXFxcImJwZl9zcGluX2xvY2tcXFwiLCA0KTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoaWQsIFNQSU5fTE9DSywgXFxcImJ0Zl9fYWRkX3N0cnVjdCBicGZfc3Bpbl9sb2NrXFxcIikpXFxuK1xcdFxcdGdvdG8gZXJyX291dDtcXG4rXFx0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcXFwiYnBmX2xpc3RfaGVhZFxcXCIsIDE2KTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfSEVBRCwgXFxcImJ0Zl9fYWRkX3N0cnVjdCBicGZfbGlzdF9oZWFkXFxcIikpXFxuK1xcdFxcdGdvdG8gZXJyX291dDtcXG4rXFx0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcXFwiYnBmX2xpc3Rfbm9kZVxcXCIsIDI0KTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfTk9ERSwgXFxcImJ0Zl9fYWRkX3N0cnVjdCBicGZfbGlzdF9ub2RlXFxcIikpXFxuK1xcdFxcdGdvdG8gZXJyX291dDtcXG4rXFx0cmV0dXJuIGJ0ZjtcXG4rXFxuK2Vycl9vdXQ6XFxuK1xcdGJ0Zl9fZnJlZShidGYpO1xcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBhZGRfbG9jYWxfa3B0cihzdHJ1Y3QgYnRmICpidGYsIGludCBwb2ludGVlX2lkLCBjb25zdCBjaGFyICp0YWcpXFxuK3tcXG4rXFx0aW50IGlkO1xcbitcXG4rXFx0aWQgPSBidGZfX2FkZF90eXBlX3RhZyhidGYsIHRhZywgcG9pbnRlZV9pZCk7XFxuK1xcdGlmICghQVNTRVJUX0dUKGlkLCAwLCBcXFwiYnRmX19hZGRfdHlwZV90YWdcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIGlkO1xcbitcXHRpZCA9IGJ0Zl9fYWRkX3B0cihidGYsIGlkKTtcXG4rXFx0QVNTRVJUX0dUKGlkLCAwLCBcXFwiYnRmX19hZGRfcHRyXFxcIik7XFxuK1xcdHJldHVybiBpZDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9zZWxmX2N5Y2xlKGNvbnN0IGNoYXIgKnRhZywgaW50IGV4cGVjdGVkX2VycilcXG4re1xcbitcXHRzdHJ1Y3QgYnRmICpidGY7XFxuK1xcdGludCBpZCwgZXJyO1xcbitcXG4rXFx0YnRmID0gaW5pdF9idGYoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXFxcImluaXRfYnRmXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDcsIHRhZyk7XFxuK1xcdGlmIChpZCBcXHUwMDNjPSAwKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcXFwic2VsZl9jeWNsZVxcXCIsIDgpO1xcbitcXHRpZiAoIUFTU0VSVF9FUShpZCwgNywgXFxcImJ0Zl9fYWRkX3N0cnVjdCBzZWxmX2N5Y2xlXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFxcXCJuZXh0XFxcIiwgNiwgMCwgMCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJ0Zl9fYWRkX2ZpZWxkIHNlbGZfY3ljbGU6Om5leHRcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcXG4rXFx0QVNTRVJUX0VRKGVyciwgZXhwZWN0ZWRfZXJyLCBcXFwiY2hlY2sgYnRmXFxcIik7XFxuK291dDpcXG4rXFx0YnRmX19mcmVlKGJ0Zik7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfYWJhX2N5Y2xlKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IGJ0ZiAqYnRmO1xcbitcXHRpbnQgaWQsIGVycjtcXG4rXFxuK1xcdGJ0ZiA9IGluaXRfYnRmKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFxcXCJpbml0X2J0ZlxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCAxMCwgXFxcImtwdHJcXFwiKTtcXG4rXFx0aWYgKGlkIFxcdTAwM2M9IDApXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgOSwgXFxcImtwdHJcXFwiKTtcXG4rXFx0aWYgKGlkIFxcdTAwM2M9IDApXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFxcXCJjeWNsZV9hXFxcIiwgOCk7XFxuK1xcdGlmICghQVNTRVJUX0VRKGlkLCA5LCBcXFwiYnRmX19hZGRfc3RydWN0IGN5Y2xlX2FcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXFxcImJcXFwiLCA2LCAwLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnRmX19hZGRfZmllbGQgY3ljbGVfYTo6YlxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcXFwiY3ljbGVfYlxcXCIsIDgpO1xcbitcXHRpZiAoIUFTU0VSVF9FUShpZCwgMTAsIFxcXCJidGZfX2FkZF9zdHJ1Y3QgY3ljbGVfYlxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcXFwiYVxcXCIsIDgsIDAsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJidGZfX2FkZF9maWVsZCBjeWNsZV9iOjphXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XFxuK1xcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXFxcImNoZWNrIGJ0ZlxcXCIpO1xcbitvdXQ6XFxuK1xcdGJ0Zl9fZnJlZShidGYpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X21peGVkX2N5Y2xlKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IGJ0ZiAqYnRmO1xcbitcXHRpbnQgaWQsIGVycjtcXG4rXFxuK1xcdGJ0ZiA9IGluaXRfYnRmKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFxcXCJpbml0X2J0ZlxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA3LCBcXFwia3B0clxcXCIpO1xcbitcXHRpZiAoaWQgXFx1MDAzYz0gMClcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXFxcIm1peGVkX293bmVyXFxcIiwgMjApO1xcbitcXHRpZiAoIUFTU0VSVF9FUShpZCwgNywgXFxcImJ0Zl9fYWRkX3N0cnVjdCBtaXhlZF9vd25lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcXFwicm9vdFxcXCIsIExJU1RfSEVBRCwgMCwgMCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJ0Zl9fYWRkX2ZpZWxkIG1peGVkX293bmVyOjpyb290XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFxcXCJsb2NrXFxcIiwgU1BJTl9MT0NLLCAxMjgsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJidGZfX2FkZF9maWVsZCBtaXhlZF9vd25lcjo6bG9ja1xcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWQgPSBidGZfX2FkZF9kZWNsX3RhZyhidGYsIFxcXCJjb250YWluczptaXhlZF9ub2RlOm5vZGVcXFwiLCA3LCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoaWQsIDgsIFxcXCJidGZfX2FkZF9kZWNsX3RhZyBtaXhlZF9vd25lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcXFwibWl4ZWRfbm9kZVxcXCIsIDMyKTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoaWQsIDksIFxcXCJidGZfX2FkZF9zdHJ1Y3QgbWl4ZWRfbm9kZVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcXFwibm9kZVxcXCIsIExJU1RfTk9ERSwgMCwgMCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJ0Zl9fYWRkX2ZpZWxkIG1peGVkX25vZGU6Om5vZGVcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXFxcIm93bmVyXFxcIiwgNiwgMTkyLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnRmX19hZGRfZmllbGQgbWl4ZWRfbm9kZTo6b3duZXJcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcXG4rXFx0QVNTRVJUX0VRKGVyciwgLUVMT09QLCBcXFwiY2hlY2sgYnRmXFxcIik7XFxuK291dDpcXG4rXFx0YnRmX19mcmVlKGJ0Zik7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfYWN5Y2xpY19kZXB0aChpbnQgZGVwdGgsIGludCBleHBlY3RlZF9lcnIpXFxuK3tcXG4rXFx0aW50IHB0cl9pZFtNQVhfT1dORVJTSElQX0RFUFRIICsgMV07XFxuK1xcdGludCBmaXJzdF9zdHJ1Y3RfaWQ7XFxuK1xcdHN0cnVjdCBidGYgKmJ0ZjtcXG4rXFx0aW50IGlkLCBlcnIsIGk7XFxuK1xcbitcXHRidGYgPSBpbml0X2J0ZigpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcXFwiaW5pdF9idGZcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRmaXJzdF9zdHJ1Y3RfaWQgPSA1ICsgMiAqIGRlcHRoO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgZGVwdGg7IGkrKykge1xcbitcXHRcXHRwdHJfaWRbaV0gPSBhZGRfbG9jYWxfa3B0cihidGYsIGZpcnN0X3N0cnVjdF9pZCArIGkgKyAxLCBcXFwia3B0clxcXCIpO1xcbitcXHRcXHRpZiAocHRyX2lkW2ldIFxcdTAwM2M9IDApXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBkZXB0aDsgaSsrKSB7XFxuK1xcdFxcdGNoYXIgbmFtZVsxNl07XFxuK1xcbitcXHRcXHRzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksIFxcXCJvd25lcl8lZFxcXCIsIGkpO1xcbitcXHRcXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIDgpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9FUShpZCwgZmlyc3Rfc3RydWN0X2lkICsgaSwgXFxcImJ0Zl9fYWRkX3N0cnVjdCBvd25lclxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcXFwibmV4dFxcXCIsIHB0cl9pZFtpXSwgMCwgMCk7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJ0Zl9fYWRkX2ZpZWxkIG93bmVyOjpuZXh0XFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXFxcInBsYWluX2xlYWZcXFwiLCA0KTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoaWQsIGZpcnN0X3N0cnVjdF9pZCArIGRlcHRoLCBcXFwiYnRmX19hZGRfc3RydWN0IHBsYWluX2xlYWZcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcXG4rXFx0QVNTRVJUX0VRKGVyciwgZXhwZWN0ZWRfZXJyLCBcXFwiY2hlY2sgYnRmXFxcIik7XFxuK291dDpcXG4rXFx0YnRmX19mcmVlKGJ0Zik7XFxuK31cXG4rXFxuK3ZvaWQgdGVzdF9sb2NhbF9rcHRyX293bmVyc2hpcCh2b2lkKVxcbit7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJzZWxmX2N5Y2xlXFxcIikpXFxuK1xcdFxcdHRlc3Rfc2VsZl9jeWNsZShcXFwia3B0clxcXCIsIC1FTE9PUCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJ1bnRydXN0ZWRfc2VsZl9jeWNsZVxcXCIpKVxcbitcXHRcXHR0ZXN0X3NlbGZfY3ljbGUoXFxcImtwdHJfdW50cnVzdGVkXFxcIiwgMCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJwZXJjcHVfc2VsZl9jeWNsZVxcXCIpKVxcbitcXHRcXHR0ZXN0X3NlbGZfY3ljbGUoXFxcInBlcmNwdV9rcHRyXFxcIiwgLUVMT09QKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcIkFCQV9jeWNsZVxcXCIpKVxcbitcXHRcXHR0ZXN0X2FiYV9jeWNsZSgpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwibWl4ZWRfZ3JhcGhfcm9vdF9jeWNsZVxcXCIpKVxcbitcXHRcXHR0ZXN0X21peGVkX2N5Y2xlKCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJtYXhfYWN5Y2xpY1xcXCIpKVxcbitcXHRcXHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCwgMCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJ0b29fZGVlcF9hY3ljbGljXFxcIikpXFxuK1xcdFxcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRIICsgMSwgLUVMT09QKTtcXG4rfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyNzozNC4yNjA4MTg3N1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6OTc1ODgwMDU3MTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NZU0NBTExcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoXCIsXG4gICAgXCJidGZfb3duZXJzaGlwX2RlcHRoXCIsXG4gICAgXCJidGZfb3duZWRfdHlwZV9pZHhcIixcbiAgICBcImJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzXCIsXG4gICAgXCJidGZfcGFyc2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBCVEYgdmFsaWRhdGlvbiBsb2dpYyBpbiB0aGUgQlBGIHN1YnN5c3RlbSBieSByZXBsYWNpbmcgdGhlIGdyYXBoIHJvb3QgYWN5Y2xpY2l0eSBjaGVjayB3aXRoIGEgbmV3IG93bmVyc2hpcCBkZXB0aCBhbmQgY3ljbGUgZGV0ZWN0aW9uIGFsZ29yaXRobSAoYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCBhbmQgYnRmX293bmVyc2hpcF9kZXB0aCkgY292ZXJpbmcgYm90aCBncmFwaCByb290cyBhbmQgbG9jYWwga3B0cnMuIFRoZXNlIGNoYW5nZXMgYXJlIHJlYWNoYWJsZSB2aWEgdGhlIEJQRl9CVEZfTE9BRCBjb21tYW5kIGluIHRoZSBicGYoKSBzeXN0ZW0gY2FsbCBhbmQgd2FycmFudCBmdXp6aW5nIHRvIHZlcmlmeSBncmFwaCB0cmF2ZXJzYWwgY29ycmVjdG5lc3MgYW5kIGJvdW5kIGVuZm9yY2VtZW50LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDdiNWI4ZjY3NjU3OTJiMzY4NjAwYWU1YTY0YmZiNzdiZDExYTkyZTlcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU3VuIFNlcCA2IDEyOjI3OjMyIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9idGYuYyBiL2tlcm5lbC9icGYvYnRmLmNcbmluZGV4IDljMmNhYjA4YmI3OTQuLjNjNTA4ZWJiMjQzODQgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL2J0Zi5jXG4rKysgYi9rZXJuZWwvYnBmL2J0Zi5jXG5AQCAtNDI2OSwxMyArNDI2OSwxMCBAQCBpbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKVxuIHtcbiBcdGludCBpO1xuIFxuLVx0LyogVGhlcmUgYXJlIHRocmVlIHR5cGVzIHRoYXQgc2lnbmlmeSBvd25lcnNoaXAgb2Ygc29tZSBvdGhlciB0eXBlOlxuLVx0ICogIGtwdHJfcmVmLCBicGZfbGlzdF9oZWFkLCBicGZfcmJfcm9vdC5cbi1cdCAqIGtwdHJfcmVmIG9ubHkgc3VwcG9ydHMgc3RvcmluZyBrZXJuZWwgdHlwZXMsIHdoaWNoIGNhbid0IHN0b3JlXG4tXHQgKiByZWZlcmVuY2VzIHRvIHByb2dyYW0gYWxsb2NhdGVkIGxvY2FsIHR5cGVzLlxuLVx0ICpcbi1cdCAqIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBlbnN1cmUgdGhhdCBicGZfe2xpc3RfaGVhZCxyYl9yb290fSBvd25lcnNoaXBcbi1cdCAqIGRvZXMgbm90IGZvcm0gY3ljbGVzLlxuK1x0LypcbitcdCAqIENoZWNrIGZpZWxkcyB3aGljaCByZXF1aXJlIHRoZSBjb21wbGV0ZSBCVEYgYW5kIGluaXRpYWxpemUgcnVudGltZVxuK1x0ICogbWV0YWRhdGEuIE93bmVyc2hpcCByZWxhdGlvbnNoaXBzIGFyZSB2YWxpZGF0ZWQgYWZ0ZXIgZXZlcnkgcmVjb3JkIGhhc1xuK1x0ICogYmVlbiBmaXhlZCB1cC5cbiBcdCAqL1xuIFx0aWYgKElTX0VSUl9PUl9OVUxMKHJlYykgfHwgIShyZWMtXHUwMDNlZmllbGRfbWFzayBcdTAwMjYgKEJQRl9HUkFQSF9ST09UIHwgQlBGX1VQVFIpKSlcbiBcdFx0cmV0dXJuIDA7XG5AQCAtNDMwNiw1MSArNDMwMyw4OCBAQCBpbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKVxuIFx0XHRpZiAoIW1ldGEpXG4gXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXHRcdHJlYy1cdTAwM2VmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9yZWMgPSBtZXRhLVx1MDAzZXJlY29yZDtcbitcdH1cbitcdHJldHVybiAwO1xuK31cbiBcbi1cdFx0LyogV2UgbmVlZCB0byBzZXQgdmFsdWVfcmVjIGZvciBhbGwgcm9vdCB0eXBlcywgYnV0IG5vIG5lZWRcbi1cdFx0ICogdG8gY2hlY2sgb3duZXJzaGlwIGN5Y2xlIGZvciBhIHR5cGUgdW5sZXNzIGl0J3MgYWxzbyBhXG4tXHRcdCAqIG5vZGUgdHlwZS5cbi1cdFx0ICovXG4tXHRcdGlmICghKHJlYy1cdTAwM2VmaWVsZF9tYXNrIFx1MDAyNiBCUEZfR1JBUEhfTk9ERSkpXG4rc3RhdGljIGludCBidGZfb3duZWRfdHlwZV9pZHgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLFxuK1x0XHRcdCAgICAgIGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkKVxuK3tcbitcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKm1ldGE7XG4rXHR1MzIgYnRmX2lkO1xuK1xuK1x0aWYgKGZpZWxkLVx1MDAzZXR5cGUgXHUwMDI2IEJQRl9HUkFQSF9ST09UKSB7XG4rXHRcdGJ0Zl9pZCA9IGZpZWxkLVx1MDAzZWdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xuK1x0fSBlbHNlIGlmIChmaWVsZC1cdTAwM2V0eXBlID09IEJQRl9LUFRSX1JFRiB8fCBmaWVsZC1cdTAwM2V0eXBlID09IEJQRl9LUFRSX1BFUkNQVSkge1xuK1x0XHRpZiAoYnRmX2lzX2tlcm5lbChmaWVsZC1cdTAwM2VrcHRyLmJ0ZikpXG4rXHRcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHRcdGJ0Zl9pZCA9IGZpZWxkLVx1MDAzZWtwdHIuYnRmX2lkO1xuK1x0fSBlbHNlIHtcbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHR9XG4rXG4rXHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xuK1x0aWYgKCFtZXRhKVxuK1x0XHRyZXR1cm4gZmllbGQtXHUwMDNldHlwZSBcdTAwMjYgQlBGX0dSQVBIX1JPT1QgPyAtRUZBVUxUIDogLUVOT0VOVDtcbitcdHJldHVybiBtZXRhIC0gdGFiLVx1MDAzZXR5cGVzO1xuK31cbitcbisvKlxuKyAqIEVhY2ggb3duZXJzaGlwIGVkZ2UgYWRkcyBrZXJuZWwgZnJhbWVzIHRocm91Z2ggYnBmX29ial9mcmVlX2ZpZWxkcygpIGFuZFxuKyAqIF9fYnBmX29ial9kcm9wX2ltcGwoKS4gS2VlcCB0aGUgYm91bmQgZGVsaWJlcmF0ZWx5IHNtYWxsIGJlY2F1c2Ugb2JqZWN0XG4rICogZGVzdHJ1Y3Rpb24gY2FuIGl0c2VsZiBydW4gYmVsb3cgYSBCUEYgY2FsbCBjaGFpbi4gQSBmaW5hbCBwb2ludGVlIHdpdGhvdXRcbisgKiBzcGVjaWFsIGZpZWxkcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIGFuZCBhZGRzIG9ubHkgYVxuKyAqIG5vbi1yZWN1cnNpbmcgZHJvcC5cbisgKi9cbisjZGVmaW5lIEJURl9NQVhfT1dORVJTSElQX0RFUFRIIDhcbitcbitzdGF0aWMgaW50IGJ0Zl9vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuK1x0XHRcdCAgICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLCB1OCAqZGVwdGgsXG4rXHRcdFx0ICAgICAgIGludCBpZHgsIGludCBkZXB0aF9sZWZ0KVxuK3tcbitcdGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMgPSB0YWItXHUwMDNldHlwZXNbaWR4XS5yZWNvcmQ7XG4rXHRpbnQgaSwgcmV0LCBtYXhfZGVwdGggPSAwO1xuK1xuK1x0aWYgKCFkZXB0aF9sZWZ0KVxuK1x0XHRyZXR1cm4gLUVMT09QO1xuK1x0aWYgKGRlcHRoW2lkeF0pXG4rXHRcdGdvdG8gZG9uZTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHJlYy1cdTAwM2VjbnQ7IGkrKykge1xuK1x0XHRyZXQgPSBidGZfb3duZWRfdHlwZV9pZHgoYnRmLCB0YWIsIFx1MDAyNnJlYy1cdTAwM2VmaWVsZHNbaV0pO1xuK1x0XHRpZiAocmV0ID09IC1FTk9FTlQpXG4gXHRcdFx0Y29udGludWU7XG4rXHRcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdFx0cmV0dXJuIHJldDtcbitcdFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIHJldCwgZGVwdGhfbGVmdCAtIDEpO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXHRcdG1heF9kZXB0aCA9IG1heChtYXhfZGVwdGgsIHJldCk7XG4rXHR9XG4rXHRkZXB0aFtpZHhdID0gbWF4X2RlcHRoICsgMTtcbitkb25lOlxuK1x0cmV0dXJuIGRlcHRoW2lkeF0gXHUwMDNlIGRlcHRoX2xlZnQgPyAtRUxPT1AgOiBkZXB0aFtpZHhdO1xuK31cbiBcbi1cdFx0LyogV2UgbmVlZCB0byBlbnN1cmUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW1vbmcgYWxsIHR5cGVzLiBUaGVcbi1cdFx0ICogcHJvcGVyIHdheSB0byBkbyBpdCB3b3VsZCBiZSB0byB0b3BvbG9naWNhbGx5IHNvcnQgYWxsIEJURlxuLVx0XHQgKiBJRHMgYmFzZWQgb24gdGhlIG93bmVyc2hpcCBlZGdlcywgc2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlXG4tXHRcdCAqIGJwZl97bGlzdF9oZWFkLHJiX25vZGV9IGluIGEgdHlwZS4gSW5zdGVhZCwgd2UgdXNlIHRoZVxuLVx0XHQgKiBmb2xsb3dpbmcgcmVzYW9uaW5nOlxuLVx0XHQgKlxuLVx0XHQgKiAtIEEgdHlwZSBjYW4gb25seSBiZSBvd25lZCBieSBhbm90aGVyIHR5cGUgaW4gdXNlciBCVEYgaWYgaXRcbi1cdFx0ICogICBoYXMgYSBicGZfe2xpc3QscmJ9X25vZGUuIExldCdzIGNhbGwgdGhlc2Ugbm9kZSB0eXBlcy5cbi1cdFx0ICogLSBBIHR5cGUgY2FuIG9ubHkgX293bl8gYW5vdGhlciB0eXBlIGluIHVzZXIgQlRGIGlmIGl0IGhhcyBhXG4tXHRcdCAqICAgYnBmX3tsaXN0X2hlYWQscmJfcm9vdH0uIExldCdzIGNhbGwgdGhlc2Ugcm9vdCB0eXBlcy5cbi1cdFx0ICpcbi1cdFx0ICogV2UgZW5zdXJlIHRoYXQgaWYgYSB0eXBlIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBpdHNcbi1cdFx0ICogZWxlbWVudCB0eXBlcyBjYW5ub3QgYmUgcm9vdCB0eXBlcy5cbi1cdFx0ICpcbi1cdFx0ICogVG8gZW5zdXJlIGFjeWNsaWNpdHk6XG4tXHRcdCAqXG4tXHRcdCAqIFdoZW4gQSBpcyBhbiByb290IHR5cGUgYnV0IG5vdCBhIG5vZGUsIGl0cyBvd25lcnNoaXBcbi1cdFx0ICogY2hhaW4gY2FuIGJlOlxuLVx0XHQgKlx0QSAtXHUwMDNlIEIgLVx1MDAzZSBDXG4tXHRcdCAqIFdoZXJlOlxuLVx0XHQgKiAtIEEgaXMgYW4gcm9vdCwgZS5nLiBoYXMgYnBmX3JiX3Jvb3QuXG4tXHRcdCAqIC0gQiBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgZS5nLiBoYXMgYnBmX3JiX25vZGUgYW5kXG4tXHRcdCAqICAgYnBmX2xpc3RfaGVhZC5cbi1cdFx0ICogLSBDIGlzIG9ubHkgYW4gcm9vdCwgZS5nLiBoYXMgYnBmX2xpc3Rfbm9kZVxuLVx0XHQgKlxuLVx0XHQgKiBXaGVuIEEgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIHNvbWUgb3RoZXIgdHlwZSBhbHJlYWR5XG4tXHRcdCAqIG93bnMgaXQgaW4gdGhlIEJURiBkb21haW4sIGhlbmNlIGl0IGNhbiBub3Qgb3duXG4tXHRcdCAqIGFub3RoZXIgcm9vdCB0eXBlIHRocm91Z2ggYW55IG9mIHRoZSBvd25lcnNoaXAgZWRnZXMuXG4tXHRcdCAqXHRBIC1cdTAwM2UgQlxuLVx0XHQgKiBXaGVyZTpcbi1cdFx0ICogLSBBIGlzIGJvdGggYW4gcm9vdCBhbmQgbm9kZS5cbi1cdFx0ICogLSBCIGlzIG9ubHkgYW4gbm9kZS5cbi1cdFx0ICovXG4tXHRcdGlmIChtZXRhLVx1MDAzZXJlY29yZC1cdTAwM2VmaWVsZF9tYXNrIFx1MDAyNiBCUEZfR1JBUEhfUk9PVClcbi1cdFx0XHRyZXR1cm4gLUVMT09QO1xuK3N0YXRpYyBpbnQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4rXHRcdFx0XHQgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIpXG4re1xuK1x0dTggKmRlcHRoO1xuK1x0aW50IGksIHJldCA9IDA7XG4rXG4rXHRkZXB0aCA9IGt2Y2FsbG9jKHRhYi1cdTAwM2VjbnQsIHNpemVvZigqZGVwdGgpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTtcbitcdGlmICghZGVwdGgpXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgdGFiLVx1MDAzZWNudDsgaSsrKSB7XG4rXHRcdHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCBpLFxuK1x0XHRcdFx0XHQgIEJURl9NQVhfT1dORVJTSElQX0RFUFRIKTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRicmVhaztcbitcdFx0cmV0ID0gMDtcbiBcdH1cbi1cdHJldHVybiAwO1xuK1x0a3ZmcmVlKGRlcHRoKTtcbitcdHJldHVybiByZXQ7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIF9fYnRmX3N0cnVjdF9zaG93KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxuQEAgLTYwNDUsNiArNjA3OSwxMCBAQCBzdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcbiBcdFx0XHRpZiAoZXJyIFx1MDAzYyAwKVxuIFx0XHRcdFx0Z290byBlcnJvdXRfbWV0YTtcbiBcdFx0fVxuK1xuK1x0XHRlcnIgPSBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGJ0Ziwgc3RydWN0X21ldGFfdGFiKTtcbitcdFx0aWYgKGVyciBcdTAwM2MgMClcbitcdFx0XHRnb3RvIGVycm91dF9tZXRhO1xuIFx0fVxuIFxuIFx0ZXJyID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcdTAwMjZlbnYtXHUwMDNlbG9nKTtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuY1xuaW5kZXggYzNkMTMzYzZhMDBkNC4uNTJmYWJiZWUzZGQ1YSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcbkBAIC03MTQsNyArNzE0LDcgQEAgc3RhdGljIHZvaWQgdGVzdF9idGYodm9pZClcbiBcdFx0XHRicmVhaztcbiBcbiBcdFx0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XG4tXHRcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXCJjaGVjayBidGZcIik7XG4rXHRcdEFTU0VSVF9FUShlcnIsIDAsIFwiY2hlY2sgYnRmXCIpO1xuIFx0XHRidGZfX2ZyZWUoYnRmKTtcbiBcdFx0YnJlYWs7XG4gXHR9XG5AQCAtNzczLDcgKzc3Myw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfYnRmKHZvaWQpXG4gXHRcdFx0YnJlYWs7XG4gXG4gXHRcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuLVx0XHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFwiY2hlY2sgYnRmXCIpO1xuK1x0XHRBU1NFUlRfRVEoZXJyLCAwLCBcImNoZWNrIGJ0ZlwiKTtcbiBcdFx0YnRmX19mcmVlKGJ0Zik7XG4gXHRcdGJyZWFrO1xuIFx0fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uODM2NzQxNTVlM2I3NFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuY1xuQEAgLTAsMCArMSwyMDIgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qIENvcHlyaWdodCAoYykgMjAyNiBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cbitcbisjaW5jbHVkZSBcdTAwM2NicGYvYnRmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9idGYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuK1xuKyNkZWZpbmUgU1BJTl9MT0NLIDJcbisjZGVmaW5lIExJU1RfSEVBRCAzXG4rI2RlZmluZSBMSVNUX05PREUgNFxuKy8qIEtlZXAgaW4gc3luYyB3aXRoIEJURl9NQVhfT1dORVJTSElQX0RFUFRILiAqL1xuKyNkZWZpbmUgTUFYX09XTkVSU0hJUF9ERVBUSCA4XG4rXG4rc3RhdGljIHN0cnVjdCBidGYgKmluaXRfYnRmKHZvaWQpXG4re1xuK1x0c3RydWN0IGJ0ZiAqYnRmO1xuK1x0aW50IGlkO1xuK1xuK1x0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiYnRmX19uZXdfZW1wdHlcIikpXG4rXHRcdHJldHVybiBOVUxMO1xuK1x0aWQgPSBidGZfX2FkZF9pbnQoYnRmLCBcImludFwiLCA0LCBCVEZfSU5UX1NJR05FRCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgMSwgXCJidGZfX2FkZF9pbnRcIikpXG4rXHRcdGdvdG8gZXJyX291dDtcbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJicGZfc3Bpbl9sb2NrXCIsIDQpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIFNQSU5fTE9DSywgXCJidGZfX2FkZF9zdHJ1Y3QgYnBmX3NwaW5fbG9ja1wiKSlcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcImJwZl9saXN0X2hlYWRcIiwgMTYpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfSEVBRCwgXCJidGZfX2FkZF9zdHJ1Y3QgYnBmX2xpc3RfaGVhZFwiKSlcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcImJwZl9saXN0X25vZGVcIiwgMjQpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfTk9ERSwgXCJidGZfX2FkZF9zdHJ1Y3QgYnBmX2xpc3Rfbm9kZVwiKSlcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0cmV0dXJuIGJ0ZjtcbitcbitlcnJfb3V0OlxuK1x0YnRmX19mcmVlKGJ0Zik7XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIGludCBhZGRfbG9jYWxfa3B0cihzdHJ1Y3QgYnRmICpidGYsIGludCBwb2ludGVlX2lkLCBjb25zdCBjaGFyICp0YWcpXG4re1xuK1x0aW50IGlkO1xuK1xuK1x0aWQgPSBidGZfX2FkZF90eXBlX3RhZyhidGYsIHRhZywgcG9pbnRlZV9pZCk7XG4rXHRpZiAoIUFTU0VSVF9HVChpZCwgMCwgXCJidGZfX2FkZF90eXBlX3RhZ1wiKSlcbitcdFx0cmV0dXJuIGlkO1xuK1x0aWQgPSBidGZfX2FkZF9wdHIoYnRmLCBpZCk7XG4rXHRBU1NFUlRfR1QoaWQsIDAsIFwiYnRmX19hZGRfcHRyXCIpO1xuK1x0cmV0dXJuIGlkO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X3NlbGZfY3ljbGUoY29uc3QgY2hhciAqdGFnLCBpbnQgZXhwZWN0ZWRfZXJyKVxuK3tcbitcdHN0cnVjdCBidGYgKmJ0ZjtcbitcdGludCBpZCwgZXJyO1xuK1xuK1x0YnRmID0gaW5pdF9idGYoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiaW5pdF9idGZcIikpXG4rXHRcdHJldHVybjtcbitcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA3LCB0YWcpO1xuK1x0aWYgKGlkIFx1MDAzYz0gMClcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwic2VsZl9jeWNsZVwiLCA4KTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCA3LCBcImJ0Zl9fYWRkX3N0cnVjdCBzZWxmX2N5Y2xlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJuZXh0XCIsIDYsIDAsIDApO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIHNlbGZfY3ljbGU6Om5leHRcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XG4rXHRBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsIFwiY2hlY2sgYnRmXCIpO1xuK291dDpcbitcdGJ0Zl9fZnJlZShidGYpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X2FiYV9jeWNsZSh2b2lkKVxuK3tcbitcdHN0cnVjdCBidGYgKmJ0ZjtcbitcdGludCBpZCwgZXJyO1xuK1xuK1x0YnRmID0gaW5pdF9idGYoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiaW5pdF9idGZcIikpXG4rXHRcdHJldHVybjtcbitcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCAxMCwgXCJrcHRyXCIpO1xuK1x0aWYgKGlkIFx1MDAzYz0gMClcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgOSwgXCJrcHRyXCIpO1xuK1x0aWYgKGlkIFx1MDAzYz0gMClcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwiY3ljbGVfYVwiLCA4KTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCA5LCBcImJ0Zl9fYWRkX3N0cnVjdCBjeWNsZV9hXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJiXCIsIDYsIDAsIDApO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIGN5Y2xlX2E6OmJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcImN5Y2xlX2JcIiwgOCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgMTAsIFwiYnRmX19hZGRfc3RydWN0IGN5Y2xlX2JcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcImFcIiwgOCwgMCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgY3ljbGVfYjo6YVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbitcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXCJjaGVjayBidGZcIik7XG4rb3V0OlxuK1x0YnRmX19mcmVlKGJ0Zik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfbWl4ZWRfY3ljbGUodm9pZClcbit7XG4rXHRzdHJ1Y3QgYnRmICpidGY7XG4rXHRpbnQgaWQsIGVycjtcbitcbitcdGJ0ZiA9IGluaXRfYnRmKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcImluaXRfYnRmXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgNywgXCJrcHRyXCIpO1xuK1x0aWYgKGlkIFx1MDAzYz0gMClcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwibWl4ZWRfb3duZXJcIiwgMjApO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIDcsIFwiYnRmX19hZGRfc3RydWN0IG1peGVkX293bmVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJyb290XCIsIExJU1RfSEVBRCwgMCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgbWl4ZWRfb3duZXI6OnJvb3RcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcImxvY2tcIiwgU1BJTl9MT0NLLCAxMjgsIDApO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIG1peGVkX293bmVyOjpsb2NrXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlkID0gYnRmX19hZGRfZGVjbF90YWcoYnRmLCBcImNvbnRhaW5zOm1peGVkX25vZGU6bm9kZVwiLCA3LCAwKTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCA4LCBcImJ0Zl9fYWRkX2RlY2xfdGFnIG1peGVkX293bmVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJtaXhlZF9ub2RlXCIsIDMyKTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCA5LCBcImJ0Zl9fYWRkX3N0cnVjdCBtaXhlZF9ub2RlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJub2RlXCIsIExJU1RfTk9ERSwgMCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgbWl4ZWRfbm9kZTo6bm9kZVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwib3duZXJcIiwgNiwgMTkyLCAwKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBtaXhlZF9ub2RlOjpvd25lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbitcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXCJjaGVjayBidGZcIik7XG4rb3V0OlxuK1x0YnRmX19mcmVlKGJ0Zik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfYWN5Y2xpY19kZXB0aChpbnQgZGVwdGgsIGludCBleHBlY3RlZF9lcnIpXG4re1xuK1x0aW50IHB0cl9pZFtNQVhfT1dORVJTSElQX0RFUFRIICsgMV07XG4rXHRpbnQgZmlyc3Rfc3RydWN0X2lkO1xuK1x0c3RydWN0IGJ0ZiAqYnRmO1xuK1x0aW50IGlkLCBlcnIsIGk7XG4rXG4rXHRidGYgPSBpbml0X2J0ZigpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJpbml0X2J0ZlwiKSlcbitcdFx0cmV0dXJuO1xuK1x0Zmlyc3Rfc3RydWN0X2lkID0gNSArIDIgKiBkZXB0aDtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGRlcHRoOyBpKyspIHtcbitcdFx0cHRyX2lkW2ldID0gYWRkX2xvY2FsX2twdHIoYnRmLCBmaXJzdF9zdHJ1Y3RfaWQgKyBpICsgMSwgXCJrcHRyXCIpO1xuK1x0XHRpZiAocHRyX2lkW2ldIFx1MDAzYz0gMClcbitcdFx0XHRnb3RvIG91dDtcbitcdH1cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGRlcHRoOyBpKyspIHtcbitcdFx0Y2hhciBuYW1lWzE2XTtcbitcbitcdFx0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcIm93bmVyXyVkXCIsIGkpO1xuK1x0XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIDgpO1xuK1x0XHRpZiAoIUFTU0VSVF9FUShpZCwgZmlyc3Rfc3RydWN0X2lkICsgaSwgXCJidGZfX2FkZF9zdHJ1Y3Qgb3duZXJcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJuZXh0XCIsIHB0cl9pZFtpXSwgMCwgMCk7XG4rXHRcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBvd25lcjo6bmV4dFwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdH1cbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJwbGFpbl9sZWFmXCIsIDQpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIGZpcnN0X3N0cnVjdF9pZCArIGRlcHRoLCBcImJ0Zl9fYWRkX3N0cnVjdCBwbGFpbl9sZWFmXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuK1x0QVNTRVJUX0VRKGVyciwgZXhwZWN0ZWRfZXJyLCBcImNoZWNrIGJ0ZlwiKTtcbitvdXQ6XG4rXHRidGZfX2ZyZWUoYnRmKTtcbit9XG4rXG4rdm9pZCB0ZXN0X2xvY2FsX2twdHJfb3duZXJzaGlwKHZvaWQpXG4re1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJzZWxmX2N5Y2xlXCIpKVxuK1x0XHR0ZXN0X3NlbGZfY3ljbGUoXCJrcHRyXCIsIC1FTE9PUCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInVudHJ1c3RlZF9zZWxmX2N5Y2xlXCIpKVxuK1x0XHR0ZXN0X3NlbGZfY3ljbGUoXCJrcHRyX3VudHJ1c3RlZFwiLCAwKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicGVyY3B1X3NlbGZfY3ljbGVcIikpXG4rXHRcdHRlc3Rfc2VsZl9jeWNsZShcInBlcmNwdV9rcHRyXCIsIC1FTE9PUCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcIkFCQV9jeWNsZVwiKSlcbitcdFx0dGVzdF9hYmFfY3ljbGUoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibWl4ZWRfZ3JhcGhfcm9vdF9jeWNsZVwiKSlcbitcdFx0dGVzdF9taXhlZF9jeWNsZSgpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtYXhfYWN5Y2xpY1wiKSlcbitcdFx0dGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEgsIDApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJ0b29fZGVlcF9hY3ljbGljXCIpKVxuK1x0XHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCArIDEsIC1FTE9PUCk7XG4rfVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjc6MzQuMjYwODIwOTFaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo2MTcxMDM0NDg0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEluaXRpYWwgQXNzZXNzbWVudCBvZiB0aGUgQlBGIFBhdGNoKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2guIE15IGltbWVkaWF0ZSBnb2FsIGlzIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyB3YXJyYW50cyBhIGZ1enppbmcgY2FtcGFpZ24sIGFuZCBpZiBzbywgaG93IHRvIGJlc3QgYXBwcm9hY2ggaXQuIFdoYXQgY29uZmlndXJhdGlvbnMgYXJlIGdvaW5nIHRvIGJlIG1vc3QgZWZmZWN0aXZlLCBhbmQgd2hpY2ggc3BlY2lmaWMgc3ltYm9scyBhcmUgdGhlIG1vc3QgbGlrZWx5IHRhcmdldHMgZm9yIGV4cGxvaXRhdGlvbj9cblxuRmlyc3QsIHRoZSBkaWZmIGl0c2VsZi4gT2theSwgaXQgdG91Y2hlcyBga2VybmVsL2JwZi9idGYuY2AgYW5kIGEgZmV3IHRlc3QgZmlsZXMgdW5kZXIgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4uLmAg4oCTIHRoYXQncyBhbHJlYWR5IGludGVyZXN0aW5nLiBMZXQncyBicmVhayBkb3duIHRoZSBjaGFuZ2VzOiBJbiBga2VybmVsL2JwZi9idGYuY2AsIHdlIHNlZSBtb2RpZmljYXRpb25zIHRvIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2AuIFRoZW4sIHNvbWUgbmV3IGhlbHBlciBmdW5jdGlvbnMgaGF2ZSBiZWVuIGludHJvZHVjZWQ6IGBidGZfb3duZWRfdHlwZV9pZHhgLCBgYnRmX293bmVyc2hpcF9kZXB0aGAsIGFuZCBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAuIENydWNpYWxseSwgdGhlcmUncyBhIG5ldyBjYWxsIHRvIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGJ0Ziwgc3RydWN0X21ldGFfdGFiKWAgd2l0aGluIGBidGZfcGFyc2VgLiBUaGF0J3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IGBzdHJ1Y3RfbWV0YV90YWJgIGFjdHVhbGx5ICppcyogd2l0aGluIHRoYXQgY29udGV4dDsgSSdsbCBuZWVkIHRvIGxvb2sgYXQgdGhlIHN1cnJvdW5kaW5nIGNvZGUgdG8gZGV0ZXJtaW5lIGl0cyByb2xlIGFuZCBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0aWVzLlxuXG5Ob3csIEknbSBnb2luZyB0byBzdGFydCBkaWdnaW5nIGludG8gdGhlIGNvZGUgaXRzZWxmLiBUaW1lIHRvIGZpcmUgdXAgbXkgYW5hbHlzaXMgdG9vbHMgYW5kIGdldCBhIGJldHRlciBwaWN0dXJlIG9mIHRoZSBzaXR1YXRpb24uIEkgbmVlZCB0byBjaGVjayBob3cgdGhlc2UgaGVscGVyIGZ1bmN0aW9ucyBpbnRlcmFjdCB3aXRoIHRoZSBleGlzdGluZyBjb2RlIGFuZCB1bmRlcnN0YW5kIHRoZSBwb3RlbnRpYWwgaW1wbGljYXRpb25zIG9mIHRoZXNlIGNoYW5nZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjc4MjMsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxODEsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyNzo0MC40MzE4NTgzNTNaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzAyMzE4MTYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvYnBmL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL2J0Zi5jPTQzNDE9c3RhdGljIGludCBidGZfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNDM2OC1cXG5rZXJuZWwvYnBmL2J0Zi5jOjQzNjk6c3RhdGljIGludCBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG5rZXJuZWwvYnBmL2J0Zi5jLTQzNzAtXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYz01OTk5PXN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2UoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy02MDgyLVxcbmtlcm5lbC9icGYvYnRmLmM6NjA4MzpcXHRcXHRlcnIgPSBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGJ0Ziwgc3RydWN0X21ldGFfdGFiKTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTYwODQtXFx0XFx0aWYgKGVyciBcXHUwMDNjIDApXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDEyOjI3OjQwLjUwMjA5NzU1OFoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIzMjM2MjcxMjIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgeW91IHJlcXVlc3RlZDpcblxuKipEaXZpbmcgRGVlcCBpbnRvIEJURiBhbmQgaXRzIENhbGxlcnMqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gZ2V0IGEgcmVhbGx5IHNvbGlkIGdyYXNwIG9uIHRoZSBiZWhhdmlvciBvZiB0aGVzZSBzcGVjaWZpYyBmdW5jdGlvbnMuIEkga25vdyB0aGUgZ2VuZXJhbCBpZGVhLCBidXQgdG8gdW5kZXJzdGFuZCB0aGUgKndoeSogYW5kIHRoZSBzdWJ0bGV0aWVzLCBJIG5lZWQgdG8gc2VlIHRoZW0gaW4gYWN0aW9uLiBUaGUgYmVzdCB3YXkgdG8gZG8gdGhhdCwgZXNwZWNpYWxseSBpbiB0aGUga2VybmVsLCBpcyB0byBnbyBzdHJhaWdodCB0byB0aGUgc291cmNlLiBTcGVjaWZpY2FsbHksIEkgc2hvdWxkIGNyYWNrIG9wZW4gYGtlcm5lbC9icGYvYnRmLmNgLiBUaGF0J3Mgd2hlcmUgdGhlIG1hZ2ljIGlzIGhhcHBlbmluZywgcmlnaHQ/IEknbSB0aGlua2luZyB0aGUgYmVzdCBzdHJhdGVneSBpcyB0byBsb29rIGF0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGFzIHdlbGwsIHNvIEkgY2FuIHNlZSB3aGF0IHRoZXNlIGZ1bmN0aW9ucyBhcmUgaW50ZXJhY3Rpbmcgd2l0aCwgd2hhdCBjYWxscyB0aGVtLCBhbmQgd2hhdCB0aGV5IGNhbGwuIENvbnRleHQgaXMga2luZywgYW5kIGluIGEgY29tcGxleCBzeXN0ZW0gbGlrZSB0aGUgQlBGIGluZnJhc3RydWN0dXJlLCBjb250ZXh0IGlzIGV2ZXJ5dGhpbmcuIFRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5IGFuZCBzdGFydCB0cmFjaW5nIHRob3NlIGNhbGxzISBMZXQncyBzZWUgd2hhdCB3ZSBjYW4gbGVhcm4gYWJvdXQgdGhlIHJlbGF0aW9uc2hpcCBvZiBmdW5jdGlvbnMsIGFuZCB0aGUgb3ZlcmFsbCByb2xlIHRoZXNlIGZ1bmN0aW9ucyBwbGF5LlxuXG5cbiIsIklucHV0VG9rZW5zIjo4NjE1LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjc6NDIuODI1NzI3ODlaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NzUzNDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2JwZi9idGYuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA0MzAwLFxuICBcIkxpbmVDb3VudFwiOiA5MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCI0MzAwOlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbjQzMDE6XFx0XFx0XFx0YnRmX2lkID0gcmVjLVxcdTAwM2VmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XFxuNDMwMjpcXHRcXHRcXHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xcbjQzMDM6XFx0XFx0XFx0aWYgKCFtZXRhKVxcbjQzMDQ6XFx0XFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuNDMwNTpcXHRcXHRcXHRyZWMtXFx1MDAzZWZpZWxkc1tpXS5ncmFwaF9yb290LnZhbHVlX3JlYyA9IG1ldGEtXFx1MDAzZXJlY29yZDtcXG40MzA2OlxcdFxcdH1cXG40MzA3OlxcdFxcdHJldHVybiAwO1xcbjQzMDg6XFx0fVxcbjQzMDk6XFx0XFxuNDMxMDpcXHRzdGF0aWMgaW50IGJ0Zl9vd25lZF90eXBlX2lkeChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsXFxuNDMxMTpcXHRcXHRcXHRcXHQgICAgICBjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZClcXG40MzEyOlxcdHtcXG40MzEzOlxcdFxcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKm1ldGE7XFxuNDMxNDpcXHRcXHR1MzIgYnRmX2lkO1xcbjQzMTU6XFx0XFxuNDMxNjpcXHRcXHRpZiAoZmllbGQtXFx1MDAzZXR5cGUgXFx1MDAyNiBCUEZfR1JBUEhfUk9PVCkge1xcbjQzMTc6XFx0XFx0XFx0YnRmX2lkID0gZmllbGQtXFx1MDAzZWdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xcbjQzMTg6XFx0XFx0fSBlbHNlIGlmIChmaWVsZC1cXHUwMDNldHlwZSA9PSBCUEZfS1BUUl9SRUYgfHwgZmllbGQtXFx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUEVSQ1BVKSB7XFxuNDMxOTpcXHRcXHRcXHRpZiAoYnRmX2lzX2tlcm5lbChmaWVsZC1cXHUwMDNla3B0ci5idGYpKVxcbjQzMjA6XFx0XFx0XFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuNDMyMTpcXHRcXHRcXHRidGZfaWQgPSBmaWVsZC1cXHUwMDNla3B0ci5idGZfaWQ7XFxuNDMyMjpcXHRcXHR9IGVsc2Uge1xcbjQzMjM6XFx0XFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuNDMyNDpcXHRcXHR9XFxuNDMyNTpcXHRcXG40MzI2OlxcdFxcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XFxuNDMyNzpcXHRcXHRpZiAoIW1ldGEpXFxuNDMyODpcXHRcXHRcXHRyZXR1cm4gZmllbGQtXFx1MDAzZXR5cGUgXFx1MDAyNiBCUEZfR1JBUEhfUk9PVCA/IC1FRkFVTFQgOiAtRU5PRU5UO1xcbjQzMjk6XFx0XFx0cmV0dXJuIG1ldGEgLSB0YWItXFx1MDAzZXR5cGVzO1xcbjQzMzA6XFx0fVxcbjQzMzE6XFx0XFxuNDMzMjpcXHQvKlxcbjQzMzM6XFx0ICogRWFjaCBvd25lcnNoaXAgZWRnZSBhZGRzIGtlcm5lbCBmcmFtZXMgdGhyb3VnaCBicGZfb2JqX2ZyZWVfZmllbGRzKCkgYW5kXFxuNDMzNDpcXHQgKiBfX2JwZl9vYmpfZHJvcF9pbXBsKCkuIEtlZXAgdGhlIGJvdW5kIGRlbGliZXJhdGVseSBzbWFsbCBiZWNhdXNlIG9iamVjdFxcbjQzMzU6XFx0ICogZGVzdHJ1Y3Rpb24gY2FuIGl0c2VsZiBydW4gYmVsb3cgYSBCUEYgY2FsbCBjaGFpbi4gQSBmaW5hbCBwb2ludGVlIHdpdGhvdXRcXG40MzM2OlxcdCAqIHNwZWNpYWwgZmllbGRzIGlzIG5vdCBwcmVzZW50IGluIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgYW5kIGFkZHMgb25seSBhXFxuNDMzNzpcXHQgKiBub24tcmVjdXJzaW5nIGRyb3AuXFxuNDMzODpcXHQgKi9cXG40MzM5OlxcdCNkZWZpbmUgQlRGX01BWF9PV05FUlNISVBfREVQVEggOFxcbjQzNDA6XFx0XFxuNDM0MTpcXHRzdGF0aWMgaW50IGJ0Zl9vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxcbjQzNDI6XFx0XFx0XFx0XFx0ICAgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsIHU4ICpkZXB0aCxcXG40MzQzOlxcdFxcdFxcdFxcdCAgICAgICBpbnQgaWR4LCBpbnQgZGVwdGhfbGVmdClcXG40MzQ0OlxcdHtcXG40MzQ1OlxcdFxcdGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMgPSB0YWItXFx1MDAzZXR5cGVzW2lkeF0ucmVjb3JkO1xcbjQzNDY6XFx0XFx0aW50IGksIHJldCwgbWF4X2RlcHRoID0gMDtcXG40MzQ3OlxcdFxcbjQzNDg6XFx0XFx0aWYgKCFkZXB0aF9sZWZ0KVxcbjQzNDk6XFx0XFx0XFx0cmV0dXJuIC1FTE9PUDtcXG40MzUwOlxcdFxcdGlmIChkZXB0aFtpZHhdKVxcbjQzNTE6XFx0XFx0XFx0Z290byBkb25lO1xcbjQzNTI6XFx0XFxuNDM1MzpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgcmVjLVxcdTAwM2VjbnQ7IGkrKykge1xcbjQzNTQ6XFx0XFx0XFx0cmV0ID0gYnRmX293bmVkX3R5cGVfaWR4KGJ0ZiwgdGFiLCBcXHUwMDI2cmVjLVxcdTAwM2VmaWVsZHNbaV0pO1xcbjQzNTU6XFx0XFx0XFx0aWYgKHJldCA9PSAtRU5PRU5UKVxcbjQzNTY6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuNDM1NzpcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG40MzU4OlxcdFxcdFxcdFxcdHJldHVybiByZXQ7XFxuNDM1OTpcXHRcXHRcXHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgcmV0LCBkZXB0aF9sZWZ0IC0gMSk7XFxuNDM2MDpcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG40MzYxOlxcdFxcdFxcdFxcdHJldHVybiByZXQ7XFxuNDM2MjpcXHRcXHRcXHRtYXhfZGVwdGggPSBtYXgobWF4X2RlcHRoLCByZXQpO1xcbjQzNjM6XFx0XFx0fVxcbjQzNjQ6XFx0XFx0ZGVwdGhbaWR4XSA9IG1heF9kZXB0aCArIDE7XFxuNDM2NTpcXHRkb25lOlxcbjQzNjY6XFx0XFx0cmV0dXJuIGRlcHRoW2lkeF0gXFx1MDAzZSBkZXB0aF9sZWZ0ID8gLUVMT09QIDogZGVwdGhbaWR4XTtcXG40MzY3OlxcdH1cXG40MzY4OlxcdFxcbjQzNjk6XFx0c3RhdGljIGludCBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG40MzcwOlxcdFxcdFxcdFxcdFxcdCAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYilcXG40MzcxOlxcdHtcXG40MzcyOlxcdFxcdHU4ICpkZXB0aDtcXG40MzczOlxcdFxcdGludCBpLCByZXQgPSAwO1xcbjQzNzQ6XFx0XFxuNDM3NTpcXHRcXHRkZXB0aCA9IGt2Y2FsbG9jKHRhYi1cXHUwMDNlY250LCBzaXplb2YoKmRlcHRoKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTik7XFxuNDM3NjpcXHRcXHRpZiAoIWRlcHRoKVxcbjQzNzc6XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuNDM3ODpcXHRcXG40Mzc5OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyB0YWItXFx1MDAzZWNudDsgaSsrKSB7XFxuNDM4MDpcXHRcXHRcXHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgaSxcXG40MzgxOlxcdFxcdFxcdFxcdFxcdFxcdCAgQlRGX01BWF9PV05FUlNISVBfREVQVEgpO1xcbjQzODI6XFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuNDM4MzpcXHRcXHRcXHRcXHRicmVhaztcXG40Mzg0OlxcdFxcdFxcdHJldCA9IDA7XFxuNDM4NTpcXHRcXHR9XFxuNDM4NjpcXHRcXHRrdmZyZWUoZGVwdGgpO1xcbjQzODc6XFx0XFx0cmV0dXJuIHJldDtcXG40Mzg4OlxcdH1cXG40Mzg5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyNzo0Mi44MjYzMDYyOFoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjI1OTk1NzEyODMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHQgcHJvY2Vzc2VzOlxuXG4qKkRlbHZpbmcgaW50byBCVEYgUGFyc2luZyBhbmQgRmllbGQgTWFuaXB1bGF0aW9uKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGBidGZfcGFyc2VgIGFuZCBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIGFyZSBhY3R1YWxseSAqdXNlZCogd2l0aGluIHRoZSBsYXJnZXIgY29udGV4dC4gTXkgZmlyc3QgbW92ZSBpcyBjbGVhcjogSSB3YW50IHRvIHRyYWNlIHRoZSBjYWxsIHBhdGhzLiBJIG5lZWQgdG8gc2VlIHdoZXJlIHRoZXNlIGZ1bmN0aW9ucyBhcmUgaW52b2tlZC4gVW5kZXJzdGFuZGluZyB0aGUgY2FsbGluZyBjb250ZXh0cyB3aWxsIGdpdmUgbWUgaW1tZWRpYXRlIGluc2lnaHQgaW50byB0aGUgcm9sZSBvZiB0aGVzZSBmdW5jdGlvbnMgd2l0aGluIHRoZSBCVEYgKEJQRiBUeXBlIEZvcm1hdCkgaW5mcmFzdHJ1Y3R1cmUuIEFyZSB0aGV5IGNhbGxlZCBkdXJpbmcgQlRGIG9iamVjdCBsb2FkaW5nPyBEdXJpbmcgcHJvZ3JhbSB2ZXJpZmljYXRpb24/IE1heWJlIGR1cmluZyBzb21lIGtpbmQgb2YgdHlwZSBpbnRyb3NwZWN0aW9uIG9yIG9wdGltaXphdGlvbj8gS25vd2luZyB0aGUgY2FsbCBzaXRlcyBpcyBrZXkgdG8gZm9ybXVsYXRpbmcgYSBwcm9wZXIgbWVudGFsIG1vZGVsLiBJJ2xsIHN0YXJ0IHdpdGggYSBzdHJhaWdodGZvcndhcmQgc2VhcmNoIGZvciB0aG9zZSBmdW5jdGlvbiBuYW1lcyBhbmQgZm9sbG93IHRoZSB0cmFpbC4gVGhpcyBzaG91bGQgYmUgaW50ZXJlc3RpbmcuLi4gdGltZSB0byBkaWcgaW4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwMzAwLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyNzo0NS40MjU4ODI2MjJaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzE3MDA0MDUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL2JwZi9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2JwZi9idGYuYz00MTM1PXN0cnVjdCBidGZfcmVjb3JkICpidGZfcGFyc2VfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy00MjY3LVxcbmtlcm5lbC9icGYvYnRmLmM6NDI2ODppbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKVxcbmtlcm5lbC9icGYvYnRmLmMtNDI2OS17XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTU5OTk9c3RhdGljIHN0cnVjdCBidGYgKmJ0Zl9wYXJzZShjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNzctXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHN0cnVjdF9tZXRhX3RhYi1cXHUwMDNlY250OyBpKyspIHtcXG5rZXJuZWwvYnBmL2J0Zi5jOjYwNzg6XFx0XFx0XFx0ZXJyID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBzdHJ1Y3RfbWV0YV90YWItXFx1MDAzZXR5cGVzW2ldLnJlY29yZCk7XFxua2VybmVsL2JwZi9idGYuYy02MDc5LVxcdFxcdFxcdGlmIChlcnIgXFx1MDAzYyAwKVxcbi0tXFxua2VybmVsL2JwZi9zeXNjYWxsLmM9MTI1NT1zdGF0aWMgaW50IG1hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl90b2tlbiAqdG9rZW4sXFxuLS1cXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy0xMzYzLVxcbmtlcm5lbC9icGYvc3lzY2FsbC5jOjEzNjQ6XFx0cmV0ID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBtYXAtXFx1MDAzZXJlY29yZCk7XFxua2VybmVsL2JwZi9zeXNjYWxsLmMtMTM2NS1cXHRpZiAocmV0IFxcdTAwM2MgMClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjc6NDUuNDk3NTg4MTI4WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzcwMzY4OTgzMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipBbmFseXppbmcgYGJ0Zl9wYXJzZWAgQ2FsbHNpdGVzKipcblxuT2theSwgdGltZSB0byBkaXZlIGluLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgXCJXaGVyZSBleGFjdGx5IGlzIHRoaXMgYGJ0Zl9wYXJzZWAgZnVuY3Rpb24gYmVpbmcgaW52b2tlZD9cIiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgY29udGV4dC4gS25vd2luZyB0aGUgY2FsbGluZyBmdW5jdGlvbnMgaXMgY3J1Y2lhbCBmb3IgZ3Jhc3BpbmcgaXRzIHB1cnBvc2Ugd2l0aGluIHRoZSBicm9hZGVyIHN5c3RlbS4gSSdsbCBuZWVkIHRvIHRyYWNlIHRoZSBjYWxsc2l0ZXMgdG8gZmlndXJlIG91dCB3aGF0IGRhdGEgaXQncyBwcm9jZXNzaW5nLCB3aGF0IHJlc291cmNlcyBpdCdzIHV0aWxpemluZywgYW5kIHdoYXQgdGhlIG92ZXJhbGwgd29ya2Zsb3cgbG9va3MgbGlrZSBhcm91bmQgaXQuIEFyZSB3ZSBkZWFsaW5nIHdpdGgga2VybmVsIHNwYWNlLCB1c2VyIHNwYWNlLCBvciBib3RoPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBjb25jdXJyZW5jeSBpc3N1ZXMgdG8gY29uc2lkZXIsIGdpdmVuIGhvdyBtYW55IGNhbGwgc2l0ZXM/IFRoaXMgY291bGQgZ2l2ZSBtZSBhIG11Y2ggYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIG92ZXJhbGwgcHVycG9zZSBvZiB0aGUgcHJvZ3JhbS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTA5NTAsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyNzo0OS4yMDEyODA3WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NTI1NTYzNSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJidGZfcGFyc2VcXFxcKFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvYnBmL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL2J0Zi5jPTU5NjE9c3RhdGljIGludCBidGZfY2hlY2tfbW9kaWZpZXJfY2hhaW5fbGVuZ3RoKHN0cnVjdCBidGZfdmVyaWZpZXJfZW52ICplbnYsXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTU5OTgtXFxua2VybmVsL2JwZi9idGYuYzo1OTk5OnN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2UoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLFxcbmtlcm5lbC9icGYvYnRmLmMtNjAwMC1cXHRcXHRcXHQgICAgIHN0cnVjdCBicGZfbG9nX2F0dHIgKmF0dHJfbG9nKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYz04NDA0PWludCBidGZfbmV3X2ZkKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl9sb2dfYXR0ciAqYXR0cl9sb2cpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTg0MDgtXFxua2VybmVsL2JwZi9idGYuYzo4NDA5OlxcdGJ0ZiA9IGJ0Zl9wYXJzZShhdHRyLCB1YXR0ciwgYXR0cl9sb2cpO1xcbmtlcm5lbC9icGYvYnRmLmMtODQxMC1cXHRpZiAoSVNfRVJSKGJ0ZikpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDEyOjI3OjQ5LjI4NjU0MzEzNVoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxNjIwOTMxMDk1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYW5hbHlzaXMgb2YgdGhlIHNpdHVhdGlvbjpcblxuKipJbnZlc3RpZ2F0aW5nIHRoZSBgYnRmX25ld19mZGAgRnVuY3Rpb24gQ2FsbCoqXG5cbk9rYXksIHNvIEknbSB0cmFjaW5nIGRvd24gdGhpcyBgYnRmX25ld19mZGAgZnVuY3Rpb24uIFRoZSBjYWxsIHN0YWNrIGluZGljYXRlcyBpdCdzIHRyaWdnZXJlZCBmcm9tIHRoZSBgYnBmKEJQRl9CVEZfTE9BRClgIHN5c3RlbSBjYWxsLCBzcGVjaWZpY2FsbHkgdGhyb3VnaCBgc3lzY2FsbC5jYC4gU2luY2UgdGhhdCdzIHRoZSBlbnRyeSBwb2ludCwgaXQncyB0aGUgb2J2aW91cyBwbGFjZSB0byBzdGFydC4gSSdsbCBuZWVkIHRvIGRpdmUgaW50byBga2VybmVsL2JwZi9zeXNjYWxsLmNgIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgYGJ0Zl9uZXdfZmRgIGZ1bmN0aW9uIGlzIGJlaW5nIGludm9rZWQgYW5kIHdoYXQgaW5mb3JtYXRpb24gaXMgYmVpbmcgcGFzc2VkLiBUaGF0IHNob3VsZCBnaXZlIG1lIHRoZSBjb250ZXh0IEkgbmVlZCB0byBmaWd1cmUgb3V0IGV4YWN0bHkgd2hhdCdzIGhhcHBlbmluZy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE0MjksIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyNzo1MC45MDc0Nzg1NVoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzI2NjI1NjYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnRmX25ld19mZFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvYnBmL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL2J0Zi5jPTgzOTI9Y29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBidGZfZm9wcyA9IHtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODM5OC1cXG5rZXJuZWwvYnBmL2J0Zi5jOjgzOTk6c3RhdGljIGludCBfX2J0Zl9uZXdfZmQoc3RydWN0IGJ0ZiAqYnRmKVxcbmtlcm5lbC9icGYvYnRmLmMtODQwMC17XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTg0MDMtXFxua2VybmVsL2JwZi9idGYuYzo4NDA0OmludCBidGZfbmV3X2ZkKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl9sb2dfYXR0ciAqYXR0cl9sb2cpXFxua2VybmVsL2JwZi9idGYuYy04NDA1LXtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODQyNC1cXG5rZXJuZWwvYnBmL2J0Zi5jOjg0MjU6XFx0cmV0ID0gX19idGZfbmV3X2ZkKGJ0Zik7XFxua2VybmVsL2JwZi9idGYuYy04NDI2LVxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYz04NTA0PWludCBidGZfZ2V0X2ZkX2J5X2lkKHUzMiBpZClcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODUxNy1cXG5rZXJuZWwvYnBmL2J0Zi5jOjg1MTg6XFx0ZmQgPSBfX2J0Zl9uZXdfZmQoYnRmKTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTg1MTktXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9ODc1Nj1CUEZfQ0FMTF80KGJwZl9idGZfZmluZF9ieV9uYW1lX2tpbmQsIGNoYXIgKiwgbmFtZSwgaW50LCBuYW1lX3N6LCB1MzIsIGtpbmQsIGludCwgZmxhZ3MpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTg3NjktXFx0aWYgKHJldCBcXHUwMDNlIDAgXFx1MDAyNlxcdTAwMjYgYnRmX2lzX21vZHVsZShidGYpKSB7XFxua2VybmVsL2JwZi9idGYuYzo4NzcwOlxcdFxcdGJ0Zl9vYmpfZmQgPSBfX2J0Zl9uZXdfZmQoYnRmKTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTg3NzEtXFx0XFx0aWYgKGJ0Zl9vYmpfZmQgXFx1MDAzYyAwKSB7XFxuLS1cXG5rZXJuZWwvYnBmL3N5c2NhbGwuYz01NTY0PXN0YXRpYyBpbnQgYnBmX2J0Zl9sb2FkKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl9sb2dfYXR0ciAqYXR0cl9sb2cpXFxuLS1cXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy01NTkwLVxcbmtlcm5lbC9icGYvc3lzY2FsbC5jOjU1OTE6XFx0cmV0dXJuIGJ0Zl9uZXdfZmQoYXR0ciwgdWF0dHIsIGF0dHJfbG9nKTtcXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy01NTkyLX1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjc6NTAuOTgwMTQ2MTU2WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQ5MTQzNTc1ODQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBCVEYgUGF0Y2ggYW5kIEl0cyBJbXBsaWNhdGlvbnMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IHRoaXMgcGF0Y2ggaXMgYWRkcmVzc2luZyBhIGZsYXcgaW4gaG93IHdlIGhhbmRsZSBhbmQgdmVyaWZ5IEJURiBkYXRhLCBzcGVjaWZpY2FsbHkgYXJvdW5kIHRoZSBvd25lcnNoaXAgYW5kIGN5Y2xpY2FsIHJlbGF0aW9uc2hpcHMgb2Ygc3RydWN0cyB3aXRoaW4gdGhlIEJQRiBzeXN0ZW0uIEJlZm9yZSB0aGlzLCBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIGhhZCBhIHByZXR0eSBzaW1wbGlzdGljIGNoZWNrIGZvciBncmFwaCByb290IGFjeWNsaWNpdHkuIEl0IHVzZWQgdGhpcyByYXRoZXIgYmFzaWMgaGV1cmlzdGljOiBcIklmIGEgdHlwZSBpcyBib3RoIGEgcm9vdCBhbmQgYSBub2RlLCBpdCdzIGFscmVhZHkgb3duZWQgYW5kIGNhbid0IG93biBhbm90aGVyIHJvb3QgdHlwZS5cIiBQcm9ibGVtIGlzLCB0aGlzIHdhc24ndCByb2J1c3QgZW5vdWdoLiBJdCBmYWlsZWQgdG8gY29uc2lkZXIgYGtwdHJgIG93bmVyc2hpcCBkZXB0aCBvciBjeWNsZXPigJR0aGUgbG9jYWwgcG9pbnRlciBvd25lcnNoaXAgc2NlbmFyaW9zLCBhbmQgSSBzZWUgdGhlIHByb2JsZW0uIFdlIG5lZWQgc29tZXRoaW5nIG1vcmUgc29waGlzdGljYXRlZC5cblxuVGhlIHBhdGNoIGVzc2VudGlhbGx5IHJlZmFjdG9ycyB0aGlzIGxvZ2ljLCBhbmQgaXQgbG9va3MgbGlrZSBhIGdvb2QgY2hhbmdlLiBJdCBzZXBhcmF0ZXMgdGhlIGluaXRpYWwgZ3JhcGggcm9vdCBzZXR0aW5nIGluIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2AsIG5vdyBqdXN0IHNldHRpbmcgdGhlIGB2YWx1ZV9yZWNgLCBmcm9tIGEgbmV3LCBkZWRpY2F0ZWQgb3duZXJzaGlwIGRlcHRoIGNoZWNrLiBUaGlzIG5ldyBhbGdvcml0aG0sIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCwgaXMgdGhlIGtleS4gSXQncyBkZXNpZ25lZCB0byBjYWxjdWxhdGUgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgIGZvciBhbGwgc3RydWN0IG1ldGFzIHVwIHRvIGEgZGVmaW5lZCBsaW1pdCAoYEJURl9NQVhfT1dORVJTSElQX0RFUFRIYCwgY3VycmVudGx5IDgpLiBUaGlzIGlzIHdoZXJlIHRoZSBoZWF2eSBsaWZ0aW5nIGhhcHBlbnM6IGRldGVjdGluZyBjeWNsZXMgYW5kIGV4Y2Vzc2l2ZSBvd25lcnNoaXAgZGVwdGgsIGNvbnNpZGVyaW5nIGJvdGggdGhlIGdyYXBoIHJvb3RzIChgQlBGX0dSQVBIX1JPT1RgKSBhbmQgdGhlIGxvY2FsIGBrcHRyYCByZWxhdGlvbnNoaXBzIChgQlBGX0tQVFJfUkVGYCBvciBgQlBGX0tQVFJfUEVSQ1BVYCkuIFRoaXMgaXMgYSBtdWNoIG1vcmUgY29tcHJlaGVuc2l2ZSBhcHByb2FjaC5cblxuQWxyaWdodCwgc28gdGhlIGltcGxpY2F0aW9ucyBoZXJlIGFyZSBjbGVhcjogdGhpcyBpbXBhY3RzIEJURiB2ZXJpZmljYXRpb24gYW5kIGxvYWRpbmcgdmlhIHRoZSBgYnBmKEJQRl9CVEZfTE9BRClgIHN5c2NhbGwuIFRoaXMgaXMgcmlnaHQgaW4gdGhlIGNvcmUgb2YgdGhpbmdzLCBga2VybmVsL2JwZi9idGYuY2AuIEFuZCBpdCdzIHJlYWNoYWJsZSB2aWEgYGJwZigpYCB3aXRoIGBCUEZfQlRGX0xPQURgLCB3aGljaCBpcyBhY2Nlc3NpYmxlIGZyb20gYm90aCB1bnByaXZpbGVnZWQgYW5kIHByaXZpbGVnZWQgY29udGV4dHMsIG1lYW5pbmcgaXQncyBhIGdvb2QgdGFyZ2V0IGZvciBmdXp6aW5nLiBXZSBoYXZlIG5ldyByZWN1cnNpb24gbG9naWMsIGdyYXBoIHRyYXZlcnNhbCwgY3ljbGUgZGV0ZWN0aW9uLCBhbmQgZGVwdGggbGltaXRzLiBUaGVzZSBhcmUgYWxsIHBvc2l0aXZlIGluZGljYXRvcnMgdGhhdCBtYWtlIGl0IGEgdmFsdWFibGUgdGFyZ2V0IGZvciBmdXp6aW5nLiBUaGUgbG9jYXRpb24gaW4gdGhlIEJQRiBjb3JlIGlzIGFub3RoZXIgcG9zaXRpdmUuXG5cbk5vdywgSSBzaG91bGQgcXVpY2tseSBjaGVjayB0aGUga2VybmVsIGNvbmZpZyBvcHRpb25zIHRvIGNvbmZpcm0gdGhlIGRlcGVuZGVuY2llcyBmb3IgYGtlcm5lbC9icGYvYnRmLmNgIGFuZCBgQlBGX0JURl9MT0FEYCBhbmQgQlRGIHN1cHBvcnQuIEp1c3QgdG8gbWFrZSBzdXJlIHdlIGtub3cgd2hhdCdzIHJlcXVpcmVkIHRvIG1ha2UgdGhpcyBjb2RlIGFjdGl2ZS4gSSdsbCBjaGVjayBgaW5pdC9LY29uZmlnYCBvciBga2VybmVsL2JwZi9NYWtlZmlsZWAgdG8gY29uZmlybSB0aGUgZGVwZW5kZW5jaWVzIGFuZCBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGFsbCB3ZSBuZWVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjMxMSwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ4OSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyNzo1NS44OTQ1MDY2OTlaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgzMzk2MzM1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJ0ZlxcXFwub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvYnBmL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL01ha2VmaWxlPTEzPW9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gYnBmX2xvY2FsX3N0b3JhZ2UubyBicGZfdGFza19zdG9yYWdlLm9cXG5rZXJuZWwvYnBmL01ha2VmaWxlOjE0Om9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gZml4dXBzLm8gY2ZnLm8gc3RhdGVzLm8gYmFja3RyYWNrLm8gY2hlY2tfYnRmLm9cXG5rZXJuZWwvYnBmL01ha2VmaWxlLTE1LW9iai0ke0NPTkZJR19CUEZfTFNNfVxcdCAgKz0gYnBmX2lub2RlX3N0b3JhZ2Uub1xcbi0tXFxua2VybmVsL2JwZi9NYWtlZmlsZT0xNz1vYmotJChDT05GSUdfQlBGX0pJVCkgKz0gdHJhbXBvbGluZS5vXFxua2VybmVsL2JwZi9NYWtlZmlsZToxODpvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICs9IGJ0Zi5vIG1lbWFsbG9jLm8gcnFzcGlubG9jay5vIHN0cmVhbS5vXFxua2VybmVsL2JwZi9NYWtlZmlsZS0xOS1pZmVxICgkKENPTkZJR19NTVUpJChDT05GSUdfNjRCSVQpLHl5KVxcbi0tXFxua2VybmVsL2JwZi9NYWtlZmlsZT00Mz1pZmVxICgkKENPTkZJR19TWVNGUykseSlcXG5rZXJuZWwvYnBmL01ha2VmaWxlOjQ0Om9iai0kKENPTkZJR19ERUJVR19JTkZPX0JURikgKz0gc3lzZnNfYnRmLm9cXG5rZXJuZWwvYnBmL01ha2VmaWxlLTQ1LWVuZGlmXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDEyOjI3OjU1Ljk3NzkwNzA0NFoiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo2MTcwNjk3NjMwMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipDaGVja2luZyB0aGUgQlBGIENvbmZpZ3VyYXRpb24gTGFuZHNjYXBlKipcblxuT2theSwgc28gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IGBCUEZfU1lTQ0FMTGAgYW5kIGBCUEZgIGFyZSBjb25maWd1cmVkLiBHaXZlbiBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBrZXJuZWwsIEknbGwgc3RhcnQgYnkgY2hlY2tpbmcgdGhlIEtjb25maWcgZmlsZXMuIFRoZSBtb3N0IGxpa2VseSBwbGFjZXMgd291bGQgYmUgYGluaXQvS2NvbmZpZ2AsIGFzIGl0IG9mdGVuIGhvdXNlcyBnbG9iYWwgZmVhdHVyZSB0b2dnbGVzLCBvciBzcGVjaWZpY2FsbHksIGBrZXJuZWwvYnBmL0tjb25maWdgLCBzaW5jZSB0aGF0IGRpcmVjdG9yeSBpcyBkZWRpY2F0ZWQgdG8gQlBGLXJlbGF0ZWQgY29uZmlndXJhdGlvbnMuIEkgbmVlZCB0byBzZWUgaG93IHRoZXNlIG9wdGlvbnMgYXJlIGRlZmluZWQsIHRoZWlyIGRlcGVuZGVuY2llcywgYW5kIGFueSBkZWZhdWx0IHNldHRpbmdzLiBUaGlzIHdpbGwgZ2l2ZSBtZSBhIGNsZWFyIHBpY3R1cmUgb2Ygd2hhdCBjb250cm9scyB0aGUgYWN0aXZhdGlvbiBvZiB0aGVzZSBmZWF0dXJlcy4gS25vd2luZyB0aGlzIGluZm9ybWF0aW9uIHdpbGwgZ3JlYXRseSBoZWxwIHdoZW4gaW52ZXN0aWdhdGluZyBpc3N1ZXMgd2l0aCBCUEYuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNjc5LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjg6NTcuNjg0ODg2MDM2WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MDI2NTc1MzgsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBCUEZfU1lTQ0FMTFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpbml0L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjg6NTguMTg3NTUyMjM0WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIyNjYzNDE4NDUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGlua2luZyBpdDpcblxuKipMb2NhdGluZyB0aGUgQlBGX1NZU0NBTEwgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB0cmFjayBkb3duIHRoZSBkZWZpbml0aW9uIG9mIGBjb25maWcgQlBGX1NZU0NBTExgIGluIHRoZSBLY29uZmlnIGZpbGVzLiBUaGlzIGlzIGxpa2VseSBhIGtleSBjb25maWd1cmF0aW9uIG9wdGlvbiBmb3IgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIEJQRiBzeXNjYWxsIGZ1bmN0aW9uYWxpdHksIGFuZCB1bmRlcnN0YW5kaW5nIGl0cyBkZXBlbmRlbmNpZXMgYW5kIGxvY2F0aW9uIHdpbGwgYmUgZXNzZW50aWFsIGZvciB3aGF0ZXZlciBJJ20gd29ya2luZyBvbi4gVGltZSB0byBkaXZlIGludG8gdGhlIGtlcm5lbCBzb3VyY2UgdHJlZS4gTGV0J3Mgc2VlIGlmIGEgcXVpY2sgYGdyZXBgIHdpbGwgZ2V0IG1lIHN0YXJ0ZWQsIGJ1dCBJJ20gZXhwZWN0aW5nIHRoaXMgb3B0aW9uIHRvIGJlIHByZXR0eSB3aWRlc3ByZWFkIHNvIEkgbWF5IG5lZWQgdG8gdXNlIGEgbW9yZSBwcmVjaXNlIG1ldGhvZCB0byBsb2NhdGUgaXQgd2l0aGluIHRoZSBLY29uZmlnIGhpZXJhcmNoeS4gTGV0J3Mgc3RhcnQgd2l0aCBhIGJhc2ljIHNlYXJjaCB0aG91Z2guIEhvcGVmdWxseSwgaXQncyBub3QgYnVyaWVkIHRvbyBkZWVwIHdpdGhpbiBhbiBpbmNsdWRlLCBhbmQgSSBjYW4gcXVpY2tseSBhc2NlcnRhaW4gaXRzIHBsYWNlIHdpdGhpbiB0aGUgYnJvYWRlciBzeXN0ZW0uIEknbGwgYmUga2VlcGluZyBhbiBleWUgb3V0IGZvciBhbnkgc3Vycm91bmRpbmcgY29udGV4dCwgbGlrZSBgZGVwZW5kcyBvbmAgc3RhdGVtZW50cyBvciBkZWZhdWx0IHZhbHVlcywgYXMgdGhhdCB3aWxsIHByb3ZpZGUgdmFsdWFibGUgaW5zaWdodCBpbnRvIGhvdyB0aGlzIG9wdGlvbiBpbnRlcmFjdHMgd2l0aCBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsLiBPbmNlIEkgaGF2ZSB0aGUgZGVmaW5pdGl2ZSBLY29uZmlnIGZpbGUsIEknbGwgYW5hbHl6ZSB0aGUgc3Vycm91bmRpbmcgYmxvY2tzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzkwMSwiT3V0cHV0VG9rZW5zIjoyMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDEyOjI5OjAwLjQ1Mzg5ODI0OFoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjIzMDMwMTkyNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgQlBGX1NZU0NBTExcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2JwZi9LY29uZmlnPTI5PW1lbnUgXFxcIkJQRiBzdWJzeXN0ZW1cXFwiXFxua2VybmVsL2JwZi9LY29uZmlnLTMwLVxcbmtlcm5lbC9icGYvS2NvbmZpZzozMTpjb25maWcgQlBGX1NZU0NBTExcXG5rZXJuZWwvYnBmL0tjb25maWctMzItXFx0Ym9vbCBcXFwiRW5hYmxlIGJwZigpIHN5c3RlbSBjYWxsXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyOTowMi42ODQyMDU1MzRaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjI2MjA2MDkxNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gcmVhZGluZyB0aGUgcHJvdmlkZWQgdGV4dDpcblxuKipCUEYgQ29uZmlndXJhdGlvbiBUaG91Z2h0cyoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGUgYGtlcm5lbC9icGYvS2NvbmZpZ2AgZmlsZS4gSSdtIGZvY3VzaW5nIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSAzMS4gQmFzZWQgb24gbXkgZXhwZXJpZW5jZSwgSSdtIGV4cGVjdGluZyB0byBzZWUgdGhlIGNvcmUgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gQlBGLCBsaWtlbHkgdGhlIGdlbmVyYWwgZW5hYmxlL2Rpc2FibGUgc3dpdGNoLCBvciBtYXliZSBzb21lIGZ1bmRhbWVudGFsIGZlYXR1cmVzIHRoYXQgYXJlIGNvbnNpZGVyZWQgY3JpdGljYWwuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgY29udHJvbHMgdGhlIGJhc2ljIGJ1aWxkaW5nIGJsb2NrcyBoZXJlLiBMZXQncyBzZWUgaWYgdGhpcyBsaW5lIGlzIGNvbnRyb2xsaW5nIHRoZSBjb3JlIG9yIHNvbWV0aGluZyBzcGVjaWZpYyB0byB0aGUgYXJjaGl0ZWN0dXJlIEkgYW0gc3R1ZHlpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0MjYwLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjk6MDQuOTQ2MjY5MDk5WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk0MzUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9icGYvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAyNSxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAyNTpcXHQjIGRlZmF1bHQgZm9yIGtlcm5lbHMgdGhhdCB3ZXJlIGNvbXBpbGVkIHdpdGggQlBGIEpJVCBzdXBwb3J0LlxcbiAgMjY6XFx0Y29uZmlnIEFSQ0hfV0FOVF9ERUZBVUxUX0JQRl9KSVRcXG4gIDI3OlxcdFxcdGJvb2xcXG4gIDI4OlxcdFxcbiAgMjk6XFx0bWVudSBcXFwiQlBGIHN1YnN5c3RlbVxcXCJcXG4gIDMwOlxcdFxcbiAgMzE6XFx0Y29uZmlnIEJQRl9TWVNDQUxMXFxuICAzMjpcXHRcXHRib29sIFxcXCJFbmFibGUgYnBmKCkgc3lzdGVtIGNhbGxcXFwiXFxuICAzMzpcXHRcXHRzZWxlY3QgQlBGXFxuICAzNDpcXHRcXHRzZWxlY3QgSVJRX1dPUktcXG4gIDM1OlxcdFxcdHNlbGVjdCBORUVEX1RBU0tTX1JDVVxcbiAgMzY6XFx0XFx0c2VsZWN0IFRBU0tTX1RSQUNFX1JDVVxcbiAgMzc6XFx0XFx0c2VsZWN0IEJJTkFSWV9QUklOVEZcXG4gIDM4OlxcdFxcdHNlbGVjdCBORVRfU09DS19NU0cgaWYgTkVUXFxuICAzOTpcXHRcXHRzZWxlY3QgTkVUX1hHUkVTUyBpZiBORVRcXG4gIDQwOlxcdFxcdHNlbGVjdCBQQUdFX1BPT0wgaWYgTkVUXFxuICA0MTpcXHRcXHRkZWZhdWx0IG5cXG4gIDQyOlxcdFxcdGhlbHBcXG4gIDQzOlxcdFxcdCAgRW5hYmxlIHRoZSBicGYoKSBzeXN0ZW0gY2FsbCB0aGF0IGFsbG93cyB0byBtYW5pcHVsYXRlIEJQRiBwcm9ncmFtc1xcbiAgNDQ6XFx0XFx0ICBhbmQgbWFwcyB2aWEgZmlsZSBkZXNjcmlwdG9ycy5cXG4gIDQ1OlxcdFxcbiAgNDY6XFx0Y29uZmlnIEJQRl9KSVRcXG4gIDQ3OlxcdFxcdGJvb2wgXFxcIkVuYWJsZSBCUEYgSnVzdCBJbiBUaW1lIGNvbXBpbGVyXFxcIlxcbiAgNDg6XFx0XFx0ZGVwZW5kcyBvbiBCUEZcXG4gIDQ5OlxcdFxcdGRlcGVuZHMgb24gSEFWRV9DQlBGX0pJVCB8fCBIQVZFX0VCUEZfSklUXFxuICA1MDpcXHRcXHRzZWxlY3QgRVhFQ01FTVxcbiAgNTE6XFx0XFx0aGVscFxcbiAgNTI6XFx0XFx0ICBCUEYgcHJvZ3JhbXMgYXJlIG5vcm1hbGx5IGhhbmRsZWQgYnkgYSBCUEYgaW50ZXJwcmV0ZXIuIFRoaXMgb3B0aW9uXFxuICA1MzpcXHRcXHQgIGFsbG93cyB0aGUga2VybmVsIHRvIGdlbmVyYXRlIG5hdGl2ZSBjb2RlIHdoZW4gYSBwcm9ncmFtIGlzIGxvYWRlZFxcbiAgNTQ6XFx0XFx0ICBpbnRvIHRoZSBrZXJuZWwuIFRoaXMgd2lsbCBzaWduaWZpY2FudGx5IHNwZWVkLXVwIHByb2Nlc3Npbmcgb2YgQlBGXFxuICA1NTpcXHRcXHQgIHByb2dyYW1zLlxcbiAgNTY6XFx0XFxuICA1NzpcXHRcXHQgIE5vdGUsIGFuIGFkbWluIHNob3VsZCBlbmFibGUgdGhpcyBmZWF0dXJlIGNoYW5naW5nOlxcbiAgNTg6XFx0XFx0ICAvcHJvYy9zeXMvbmV0L2NvcmUvYnBmX2ppdF9lbmFibGVcXG4gIDU5OlxcdFxcdCAgL3Byb2Mvc3lzL25ldC9jb3JlL2JwZl9qaXRfaGFyZGVuICAgKG9wdGlvbmFsKVxcbiAgNjA6XFx0XFx0ICAvcHJvYy9zeXMvbmV0L2NvcmUvYnBmX2ppdF9rYWxsc3ltcyAob3B0aW9uYWwpXFxuICA2MTpcXHRcXG4gIDYyOlxcdGNvbmZpZyBCUEZfSklUX0FMV0FZU19PTlxcbiAgNjM6XFx0XFx0Ym9vbCBcXFwiUGVybWFuZW50bHkgZW5hYmxlIEJQRiBKSVQgYW5kIHJlbW92ZSBCUEYgaW50ZXJwcmV0ZXJcXFwiXFxuICA2NDpcXHRcXHRkZXBlbmRzIG9uIEJQRl9TWVNDQUxMIFxcdTAwMjZcXHUwMDI2IEhBVkVfRUJQRl9KSVQgXFx1MDAyNlxcdTAwMjYgQlBGX0pJVFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyOTowNC45NDYzNjUzMTlaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6Njc5NDY4MzgwMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipCVEYgQWN5Y2xpY2l0eSBDaGVjayBhbmQgT3duZXJzaGlwIERlcHRoIFZhbGlkYXRpb24qKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBteSBpbml0aWFsIHRob3VnaHQgaXM6IGBCUEZfU1lTQ0FMTGAgc2VlbXMgbGlrZSB0aGUga2V5IGNvbmZpZyBmbGFnIGhlcmUuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlbid0IGFueSBvdGhlciBoaWRkZW4gZGVwZW5kZW5jaWVzIGZvciBCVEYgZnVuY3Rpb25hbGl0eS4gSXMgYENPTkZJR19ERUJVR19JTkZPX0JURmAgYWxzbyBuZWVkZWQsIG9yIGlzIGBidGYub2AgYnVpbHQgZGlyZWN0bHkgd2hlbiBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyBlbmFibGVkPyBMZXQncyBjaGVjayB0aGUgYGtlcm5lbC9icGYvTWFrZWZpbGVgLi4uIFllcCwgdGhlcmUgaXQgaXM6IGBvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICs9IGJ0Zi5vIG1lbWFsbG9jLm8gcnFzcGlubG9jay5vIHN0cmVhbS5vYC4gU28gYENPTkZJR19CUEZfU1lTQ0FMTGAgKmRvZXMqIGNvbXBpbGUgYGJ0Zi5vYC4gR29vZC5cblxuTm93LCBsZXQncyBpZGVudGlmeSB0aGUgc3BlY2lmaWMgZnVuY3Rpb25zIHRoaXMgcGF0Y2ggaXMgbW9kaWZ5aW5nIG9yIGFkZGluZyDigJMgdGhlIEZvY3VzU3ltYm9scywgc28gdG8gc3BlYWsuIExvb2tpbmcgYXQgYGtlcm5lbC9icGYvYnRmLmNgLCBJIHNlZSB0aGVzZSBjaGFuZ2VkIGZ1bmN0aW9uczpcblxuMS4gIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYFxuMi4gIGBidGZfb3duZXJzaGlwX2RlcHRoYFxuMy4gIGBidGZfb3duZWRfdHlwZV9pZHhgXG40LiAgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYFxuNS4gIGBidGZfcGFyc2VgIChjYWxsZXIgaW5zaWRlIGBidGYuY2ApXG42LiAgYGJ0Zl9uZXdfZmRgIChCVEYgbG9hZCBlbnRyeXBvaW50KVxuXG5BcmUgYW55IG9mIHRoZXNlIHViaXF1aXRvdXM/IFRoZXkgYXJlIGNsZWFybHkgZm9jdXNlZCBvbiBCVEYsIGFuZCBub3QgdXNlZCBldmVyeXdoZXJlIGluIHRoZSBrZXJuZWwuIExldCdzIG1ha2Ugc3VyZS5cblxuKiAgIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCAtIHN0YXRpYywgbmV3XG4qICAgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgIC0gc3RhdGljLCBuZXdcbiogICBgYnRmX293bmVkX3R5cGVfaWR4YCAtIHN0YXRpYywgbmV3XG4qICAgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYCAtIGdsb2JhbCBmdW5jdGlvbiwgbW9kaWZpZWRcbiogICBgYnRmX3BhcnNlYCAtIHN0YXRpYyBmdW5jdGlvbiwgbW9kaWZpZWQgY2FsbGVyXG4qICAgYGJ0Zl9uZXdfZmRgIC0gZ2xvYmFsIGZ1bmN0aW9uXG5cblNpbmNlIHRoZXkgYXJlIGluIGEgQyBmaWxlIGluIGtlcm5lbC9icGYvYnRmLmMsIGV2ZW4gc3RhdGljIGZ1bmN0aW9ucyBpbiB2bWxpbnV4IGhhdmUgc3ltYm9scyBpbiBrYWxsc3ltcyAodW5sZXNzIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyKS4gTGlzdGluZyBzdGF0aWMgZnVuY3Rpb25zIGFuZCBub24tc3RhdGljIG9uZXMgbGlrZSBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIGFuZCBgYnRmX25ld19mZGAgZW5zdXJlcyB0aGUgZnV6emVyIGhpdHMgdGhlbS5cblxuT2theSwgbGV0J3MganVzdCBkb3VibGUtY2hlY2sgZXZlcnl0aGluZyB0byBiZSBjZXJ0YWluLiBXZSdyZSBnb29kIHRvIGdvLlxuXG4qICAgV29ydGhGdXp6aW5nOiBUcnVlXG4qICAgRW5hYmxlQ29uZmlnczogXFxbXCJCUEZcXF9TWVNDQUxMXCJcXF1cbiogICBGb2N1c1N5bWJvbHM6IFxcW1xuICAgICogICBcImJ0ZlxcX2NoZWNrXFxfb3duZXJzaGlwXFxfZGVwdGhcIixcbiAgICAqICAgXCJidGZcXF9vd25lcnNoaXBcXF9kZXB0aFwiLFxuICAgICogICBcImJ0ZlxcX293bmVkXFxfdHlwZVxcX2lkeFwiLFxuICAgICogICBcImJ0ZlxcX2NoZWNrXFxfYW5kXFxfZml4dXBcXF9maWVsZHNcIixcbiAgICAqICAgXCJidGZcXF9wYXJzZVwiLFxuICAgICogICBcImJ0ZlxcX25ld1xcX2ZkXCJcbiAgICBcXF1cblxuRmluYWxseSwgdGhlIHJlYXNvbmluZzogVGhpcyBwYXRjaCBpcyByZWZhY3RvcmluZyB0aGUgYWN5Y2xpY2l0eSBjaGVjayBmb3IgQlRGIHN0cnVjdHVyZXMgYW5kIGFkZGluZyBhIG5ldyByZWN1cnNpdmUgZGVwdGggdmFsaWRhdGlvbiBhbGdvcml0aG0gKGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCwgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgLCBgYnRmX293bmVkX3R5cGVfaWR4YCkgdG8gZW5mb3JjZSBvd25lcnNoaXAgZ3JhcGggZGVwdGggbGltaXRzIGFuZCBkZXRlY3QgY3ljbGVzIGFjcm9zcyBncmFwaCByb290cyBhbmQgbG9jYWwga3B0cnMgZHVyaW5nIEJURiBsb2FkaW5nLiBUaGlzICptb2RpZmllcyogcmVhY2hhYmxlIGxvZ2ljIGluIHRoZSBjb3JlIEJQRiBzdWJzeXN0ZW0gZXhwb3NlZCB2aWEgdGhlIGBCUEZfQlRGX0xPQURgIGNvbW1hbmQgb2YgdGhlIGBicGYoKWAgc3lzY2FsbC5cblxuQWxsIGNsZWFyLCBhbGwgdmVyaWZpZWQuIEknbSByZWFkeSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1MDI1LCJPdXRwdXRUb2tlbnMiOjE4MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc1NCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDEyOjI5OjExLjc0MTA1Mjc5MloiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwNzc2ODA0MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NZU0NBTExcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoXCIsXG4gICAgXCJidGZfb3duZXJzaGlwX2RlcHRoXCIsXG4gICAgXCJidGZfb3duZWRfdHlwZV9pZHhcIixcbiAgICBcImJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzXCIsXG4gICAgXCJidGZfcGFyc2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBCVEYgdmFsaWRhdGlvbiBsb2dpYyBpbiB0aGUgQlBGIHN1YnN5c3RlbSBieSByZXBsYWNpbmcgdGhlIGdyYXBoIHJvb3QgYWN5Y2xpY2l0eSBjaGVjayB3aXRoIGEgbmV3IG93bmVyc2hpcCBkZXB0aCBhbmQgY3ljbGUgZGV0ZWN0aW9uIGFsZ29yaXRobSAoYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCBhbmQgYnRmX293bmVyc2hpcF9kZXB0aCkgY292ZXJpbmcgYm90aCBncmFwaCByb290cyBhbmQgbG9jYWwga3B0cnMuIFRoZXNlIGNoYW5nZXMgYXJlIHJlYWNoYWJsZSB2aWEgdGhlIEJQRl9CVEZfTE9BRCBjb21tYW5kIGluIHRoZSBicGYoKSBzeXN0ZW0gY2FsbCBhbmQgd2FycmFudCBmdXp6aW5nIHRvIHZlcmlmeSBncmFwaCB0cmF2ZXJzYWwgY29ycmVjdG5lc3MgYW5kIGJvdW5kIGVuZm9yY2VtZW50LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aFwiLFxuICAgIFwiYnRmX293bmVyc2hpcF9kZXB0aFwiLFxuICAgIFwiYnRmX293bmVkX3R5cGVfaWR4XCIsXG4gICAgXCJidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc1wiLFxuICAgIFwiYnRmX3BhcnNlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgQlRGIHZhbGlkYXRpb24gbG9naWMgaW4gdGhlIEJQRiBzdWJzeXN0ZW0gYnkgcmVwbGFjaW5nIHRoZSBncmFwaCByb290IGFjeWNsaWNpdHkgY2hlY2sgd2l0aCBhIG5ldyBvd25lcnNoaXAgZGVwdGggYW5kIGN5Y2xlIGRldGVjdGlvbiBhbGdvcml0aG0gKGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGggYW5kIGJ0Zl9vd25lcnNoaXBfZGVwdGgpIGNvdmVyaW5nIGJvdGggZ3JhcGggcm9vdHMgYW5kIGxvY2FsIGtwdHJzLiBUaGVzZSBjaGFuZ2VzIGFyZSByZWFjaGFibGUgdmlhIHRoZSBCUEZfQlRGX0xPQUQgY29tbWFuZCBpbiB0aGUgYnBmKCkgc3lzdGVtIGNhbGwgYW5kIHdhcnJhbnQgZnV6emluZyB0byB2ZXJpZnkgZ3JhcGggdHJhdmVyc2FsIGNvcnJlY3RuZXNzIGFuZCBib3VuZCBlbmZvcmNlbWVudC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjk6MTEuODQ4ODMwMjg1WiIsIlNlcSI6MjMsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDM0NzE2OTIyNSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDEyOjI5OjExLjg0OTczNzQzNVoiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjI0MzQ2MjU3NTE1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCB1cGRhdGVzIHRoZSBCVEYgdmVyaWZpZXIgdG8gdmFsaWRhdGUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW5kIGVuZm9yY2UgYSBtYXhpbXVtIG93bmVyc2hpcCBkZXB0aCAoQlRGX01BWF9PV05FUlNISVBfREVQVEgpIGFjcm9zcyBCUEYgZ3JhcGggcm9vdHMgYW5kIGxvY2FsIGtwdHJzLlxcblxcbk1lbW9yeSBzYWZldHkgYW5hbHlzaXM6XFxuMS4gVGhlIHRlbXBvcmFyeSBkZXB0aCBhcnJheSB1c2VkIGR1cmluZyBvd25lcnNoaXAgdHJhdmVyc2FsIGlzIGFsbG9jYXRlZCB2aWEga3ZjYWxsb2MoKSwgZW5zdXJpbmcgaXQgaXMgZnVsbHkgemVyby1pbml0aWFsaXplZC5cXG4yLiBBbGwgbG9jYWwgdmFyaWFibGVzIGluIGJ0Zl9vd25lcnNoaXBfZGVwdGgoKSwgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCgpLCBhbmQgYnRmX293bmVkX3R5cGVfaWR4KCkgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXFxuMy4gTm8gZGF0YSBzdHJ1Y3R1cmVzIG9yIGJ1ZmZlcnMgYXJlIGNvcGllZCB0byB1c2VyIHNwYWNlLCBhbmQgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgcmVhZCBvciB1c2VkIGluIGNvbmRpdGlvbmFsIGJyYW5jaGluZy5cXG40LiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIHBvaW50ZXIgYXJpdGhtZXRpYyBvciBhcnJheSBpbmRleGluZyBpbnRvIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgd291bGQgYmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOLlxcblxcblRoZXJlZm9yZSwgdGhpcyBjaGFuZ2UgZG9lcyBub3QgaW50cm9kdWNlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgbmVlZGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDdiNWI4ZjY3NjU3OTJiMzY4NjAwYWU1YTY0YmZiNzdiZDExYTkyZTlcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU3VuIFNlcCA2IDEyOjI3OjMyIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9idGYuYyBiL2tlcm5lbC9icGYvYnRmLmNcbmluZGV4IDljMmNhYjA4YmI3OTQuLjNjNTA4ZWJiMjQzODQgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL2J0Zi5jXG4rKysgYi9rZXJuZWwvYnBmL2J0Zi5jXG5AQCAtNDI2OSwxMyArNDI2OSwxMCBAQCBpbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKVxuIHtcbiBcdGludCBpO1xuIFxuLVx0LyogVGhlcmUgYXJlIHRocmVlIHR5cGVzIHRoYXQgc2lnbmlmeSBvd25lcnNoaXAgb2Ygc29tZSBvdGhlciB0eXBlOlxuLVx0ICogIGtwdHJfcmVmLCBicGZfbGlzdF9oZWFkLCBicGZfcmJfcm9vdC5cbi1cdCAqIGtwdHJfcmVmIG9ubHkgc3VwcG9ydHMgc3RvcmluZyBrZXJuZWwgdHlwZXMsIHdoaWNoIGNhbid0IHN0b3JlXG4tXHQgKiByZWZlcmVuY2VzIHRvIHByb2dyYW0gYWxsb2NhdGVkIGxvY2FsIHR5cGVzLlxuLVx0ICpcbi1cdCAqIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBlbnN1cmUgdGhhdCBicGZfe2xpc3RfaGVhZCxyYl9yb290fSBvd25lcnNoaXBcbi1cdCAqIGRvZXMgbm90IGZvcm0gY3ljbGVzLlxuK1x0LypcbitcdCAqIENoZWNrIGZpZWxkcyB3aGljaCByZXF1aXJlIHRoZSBjb21wbGV0ZSBCVEYgYW5kIGluaXRpYWxpemUgcnVudGltZVxuK1x0ICogbWV0YWRhdGEuIE93bmVyc2hpcCByZWxhdGlvbnNoaXBzIGFyZSB2YWxpZGF0ZWQgYWZ0ZXIgZXZlcnkgcmVjb3JkIGhhc1xuK1x0ICogYmVlbiBmaXhlZCB1cC5cbiBcdCAqL1xuIFx0aWYgKElTX0VSUl9PUl9OVUxMKHJlYykgfHwgIShyZWMtXHUwMDNlZmllbGRfbWFzayBcdTAwMjYgKEJQRl9HUkFQSF9ST09UIHwgQlBGX1VQVFIpKSlcbiBcdFx0cmV0dXJuIDA7XG5AQCAtNDMwNiw1MSArNDMwMyw4OCBAQCBpbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKVxuIFx0XHRpZiAoIW1ldGEpXG4gXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXHRcdHJlYy1cdTAwM2VmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9yZWMgPSBtZXRhLVx1MDAzZXJlY29yZDtcbitcdH1cbitcdHJldHVybiAwO1xuK31cbiBcbi1cdFx0LyogV2UgbmVlZCB0byBzZXQgdmFsdWVfcmVjIGZvciBhbGwgcm9vdCB0eXBlcywgYnV0IG5vIG5lZWRcbi1cdFx0ICogdG8gY2hlY2sgb3duZXJzaGlwIGN5Y2xlIGZvciBhIHR5cGUgdW5sZXNzIGl0J3MgYWxzbyBhXG4tXHRcdCAqIG5vZGUgdHlwZS5cbi1cdFx0ICovXG4tXHRcdGlmICghKHJlYy1cdTAwM2VmaWVsZF9tYXNrIFx1MDAyNiBCUEZfR1JBUEhfTk9ERSkpXG4rc3RhdGljIGludCBidGZfb3duZWRfdHlwZV9pZHgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLFxuK1x0XHRcdCAgICAgIGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkKVxuK3tcbitcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKm1ldGE7XG4rXHR1MzIgYnRmX2lkO1xuK1xuK1x0aWYgKGZpZWxkLVx1MDAzZXR5cGUgXHUwMDI2IEJQRl9HUkFQSF9ST09UKSB7XG4rXHRcdGJ0Zl9pZCA9IGZpZWxkLVx1MDAzZWdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xuK1x0fSBlbHNlIGlmIChmaWVsZC1cdTAwM2V0eXBlID09IEJQRl9LUFRSX1JFRiB8fCBmaWVsZC1cdTAwM2V0eXBlID09IEJQRl9LUFRSX1BFUkNQVSkge1xuK1x0XHRpZiAoYnRmX2lzX2tlcm5lbChmaWVsZC1cdTAwM2VrcHRyLmJ0ZikpXG4rXHRcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHRcdGJ0Zl9pZCA9IGZpZWxkLVx1MDAzZWtwdHIuYnRmX2lkO1xuK1x0fSBlbHNlIHtcbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHR9XG4rXG4rXHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xuK1x0aWYgKCFtZXRhKVxuK1x0XHRyZXR1cm4gZmllbGQtXHUwMDNldHlwZSBcdTAwMjYgQlBGX0dSQVBIX1JPT1QgPyAtRUZBVUxUIDogLUVOT0VOVDtcbitcdHJldHVybiBtZXRhIC0gdGFiLVx1MDAzZXR5cGVzO1xuK31cbitcbisvKlxuKyAqIEVhY2ggb3duZXJzaGlwIGVkZ2UgYWRkcyBrZXJuZWwgZnJhbWVzIHRocm91Z2ggYnBmX29ial9mcmVlX2ZpZWxkcygpIGFuZFxuKyAqIF9fYnBmX29ial9kcm9wX2ltcGwoKS4gS2VlcCB0aGUgYm91bmQgZGVsaWJlcmF0ZWx5IHNtYWxsIGJlY2F1c2Ugb2JqZWN0XG4rICogZGVzdHJ1Y3Rpb24gY2FuIGl0c2VsZiBydW4gYmVsb3cgYSBCUEYgY2FsbCBjaGFpbi4gQSBmaW5hbCBwb2ludGVlIHdpdGhvdXRcbisgKiBzcGVjaWFsIGZpZWxkcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIGFuZCBhZGRzIG9ubHkgYVxuKyAqIG5vbi1yZWN1cnNpbmcgZHJvcC5cbisgKi9cbisjZGVmaW5lIEJURl9NQVhfT1dORVJTSElQX0RFUFRIIDhcbitcbitzdGF0aWMgaW50IGJ0Zl9vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuK1x0XHRcdCAgICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLCB1OCAqZGVwdGgsXG4rXHRcdFx0ICAgICAgIGludCBpZHgsIGludCBkZXB0aF9sZWZ0KVxuK3tcbitcdGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMgPSB0YWItXHUwMDNldHlwZXNbaWR4XS5yZWNvcmQ7XG4rXHRpbnQgaSwgcmV0LCBtYXhfZGVwdGggPSAwO1xuK1xuK1x0aWYgKCFkZXB0aF9sZWZ0KVxuK1x0XHRyZXR1cm4gLUVMT09QO1xuK1x0aWYgKGRlcHRoW2lkeF0pXG4rXHRcdGdvdG8gZG9uZTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHJlYy1cdTAwM2VjbnQ7IGkrKykge1xuK1x0XHRyZXQgPSBidGZfb3duZWRfdHlwZV9pZHgoYnRmLCB0YWIsIFx1MDAyNnJlYy1cdTAwM2VmaWVsZHNbaV0pO1xuK1x0XHRpZiAocmV0ID09IC1FTk9FTlQpXG4gXHRcdFx0Y29udGludWU7XG4rXHRcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdFx0cmV0dXJuIHJldDtcbitcdFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIHJldCwgZGVwdGhfbGVmdCAtIDEpO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXHRcdG1heF9kZXB0aCA9IG1heChtYXhfZGVwdGgsIHJldCk7XG4rXHR9XG4rXHRkZXB0aFtpZHhdID0gbWF4X2RlcHRoICsgMTtcbitkb25lOlxuK1x0cmV0dXJuIGRlcHRoW2lkeF0gXHUwMDNlIGRlcHRoX2xlZnQgPyAtRUxPT1AgOiBkZXB0aFtpZHhdO1xuK31cbiBcbi1cdFx0LyogV2UgbmVlZCB0byBlbnN1cmUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW1vbmcgYWxsIHR5cGVzLiBUaGVcbi1cdFx0ICogcHJvcGVyIHdheSB0byBkbyBpdCB3b3VsZCBiZSB0byB0b3BvbG9naWNhbGx5IHNvcnQgYWxsIEJURlxuLVx0XHQgKiBJRHMgYmFzZWQgb24gdGhlIG93bmVyc2hpcCBlZGdlcywgc2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlXG4tXHRcdCAqIGJwZl97bGlzdF9oZWFkLHJiX25vZGV9IGluIGEgdHlwZS4gSW5zdGVhZCwgd2UgdXNlIHRoZVxuLVx0XHQgKiBmb2xsb3dpbmcgcmVzYW9uaW5nOlxuLVx0XHQgKlxuLVx0XHQgKiAtIEEgdHlwZSBjYW4gb25seSBiZSBvd25lZCBieSBhbm90aGVyIHR5cGUgaW4gdXNlciBCVEYgaWYgaXRcbi1cdFx0ICogICBoYXMgYSBicGZfe2xpc3QscmJ9X25vZGUuIExldCdzIGNhbGwgdGhlc2Ugbm9kZSB0eXBlcy5cbi1cdFx0ICogLSBBIHR5cGUgY2FuIG9ubHkgX293bl8gYW5vdGhlciB0eXBlIGluIHVzZXIgQlRGIGlmIGl0IGhhcyBhXG4tXHRcdCAqICAgYnBmX3tsaXN0X2hlYWQscmJfcm9vdH0uIExldCdzIGNhbGwgdGhlc2Ugcm9vdCB0eXBlcy5cbi1cdFx0ICpcbi1cdFx0ICogV2UgZW5zdXJlIHRoYXQgaWYgYSB0eXBlIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBpdHNcbi1cdFx0ICogZWxlbWVudCB0eXBlcyBjYW5ub3QgYmUgcm9vdCB0eXBlcy5cbi1cdFx0ICpcbi1cdFx0ICogVG8gZW5zdXJlIGFjeWNsaWNpdHk6XG4tXHRcdCAqXG4tXHRcdCAqIFdoZW4gQSBpcyBhbiByb290IHR5cGUgYnV0IG5vdCBhIG5vZGUsIGl0cyBvd25lcnNoaXBcbi1cdFx0ICogY2hhaW4gY2FuIGJlOlxuLVx0XHQgKlx0QSAtXHUwMDNlIEIgLVx1MDAzZSBDXG4tXHRcdCAqIFdoZXJlOlxuLVx0XHQgKiAtIEEgaXMgYW4gcm9vdCwgZS5nLiBoYXMgYnBmX3JiX3Jvb3QuXG4tXHRcdCAqIC0gQiBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgZS5nLiBoYXMgYnBmX3JiX25vZGUgYW5kXG4tXHRcdCAqICAgYnBmX2xpc3RfaGVhZC5cbi1cdFx0ICogLSBDIGlzIG9ubHkgYW4gcm9vdCwgZS5nLiBoYXMgYnBmX2xpc3Rfbm9kZVxuLVx0XHQgKlxuLVx0XHQgKiBXaGVuIEEgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIHNvbWUgb3RoZXIgdHlwZSBhbHJlYWR5XG4tXHRcdCAqIG93bnMgaXQgaW4gdGhlIEJURiBkb21haW4sIGhlbmNlIGl0IGNhbiBub3Qgb3duXG4tXHRcdCAqIGFub3RoZXIgcm9vdCB0eXBlIHRocm91Z2ggYW55IG9mIHRoZSBvd25lcnNoaXAgZWRnZXMuXG4tXHRcdCAqXHRBIC1cdTAwM2UgQlxuLVx0XHQgKiBXaGVyZTpcbi1cdFx0ICogLSBBIGlzIGJvdGggYW4gcm9vdCBhbmQgbm9kZS5cbi1cdFx0ICogLSBCIGlzIG9ubHkgYW4gbm9kZS5cbi1cdFx0ICovXG4tXHRcdGlmIChtZXRhLVx1MDAzZXJlY29yZC1cdTAwM2VmaWVsZF9tYXNrIFx1MDAyNiBCUEZfR1JBUEhfUk9PVClcbi1cdFx0XHRyZXR1cm4gLUVMT09QO1xuK3N0YXRpYyBpbnQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4rXHRcdFx0XHQgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIpXG4re1xuK1x0dTggKmRlcHRoO1xuK1x0aW50IGksIHJldCA9IDA7XG4rXG4rXHRkZXB0aCA9IGt2Y2FsbG9jKHRhYi1cdTAwM2VjbnQsIHNpemVvZigqZGVwdGgpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTtcbitcdGlmICghZGVwdGgpXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgdGFiLVx1MDAzZWNudDsgaSsrKSB7XG4rXHRcdHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCBpLFxuK1x0XHRcdFx0XHQgIEJURl9NQVhfT1dORVJTSElQX0RFUFRIKTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRicmVhaztcbitcdFx0cmV0ID0gMDtcbiBcdH1cbi1cdHJldHVybiAwO1xuK1x0a3ZmcmVlKGRlcHRoKTtcbitcdHJldHVybiByZXQ7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIF9fYnRmX3N0cnVjdF9zaG93KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxuQEAgLTYwNDUsNiArNjA3OSwxMCBAQCBzdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcbiBcdFx0XHRpZiAoZXJyIFx1MDAzYyAwKVxuIFx0XHRcdFx0Z290byBlcnJvdXRfbWV0YTtcbiBcdFx0fVxuK1xuK1x0XHRlcnIgPSBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGJ0Ziwgc3RydWN0X21ldGFfdGFiKTtcbitcdFx0aWYgKGVyciBcdTAwM2MgMClcbitcdFx0XHRnb3RvIGVycm91dF9tZXRhO1xuIFx0fVxuIFxuIFx0ZXJyID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcdTAwMjZlbnYtXHUwMDNlbG9nKTtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuY1xuaW5kZXggYzNkMTMzYzZhMDBkNC4uNTJmYWJiZWUzZGQ1YSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcbkBAIC03MTQsNyArNzE0LDcgQEAgc3RhdGljIHZvaWQgdGVzdF9idGYodm9pZClcbiBcdFx0XHRicmVhaztcbiBcbiBcdFx0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XG4tXHRcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXCJjaGVjayBidGZcIik7XG4rXHRcdEFTU0VSVF9FUShlcnIsIDAsIFwiY2hlY2sgYnRmXCIpO1xuIFx0XHRidGZfX2ZyZWUoYnRmKTtcbiBcdFx0YnJlYWs7XG4gXHR9XG5AQCAtNzczLDcgKzc3Myw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfYnRmKHZvaWQpXG4gXHRcdFx0YnJlYWs7XG4gXG4gXHRcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuLVx0XHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFwiY2hlY2sgYnRmXCIpO1xuK1x0XHRBU1NFUlRfRVEoZXJyLCAwLCBcImNoZWNrIGJ0ZlwiKTtcbiBcdFx0YnRmX19mcmVlKGJ0Zik7XG4gXHRcdGJyZWFrO1xuIFx0fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uODM2NzQxNTVlM2I3NFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuY1xuQEAgLTAsMCArMSwyMDIgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qIENvcHlyaWdodCAoYykgMjAyNiBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cbitcbisjaW5jbHVkZSBcdTAwM2NicGYvYnRmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9idGYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuK1xuKyNkZWZpbmUgU1BJTl9MT0NLIDJcbisjZGVmaW5lIExJU1RfSEVBRCAzXG4rI2RlZmluZSBMSVNUX05PREUgNFxuKy8qIEtlZXAgaW4gc3luYyB3aXRoIEJURl9NQVhfT1dORVJTSElQX0RFUFRILiAqL1xuKyNkZWZpbmUgTUFYX09XTkVSU0hJUF9ERVBUSCA4XG4rXG4rc3RhdGljIHN0cnVjdCBidGYgKmluaXRfYnRmKHZvaWQpXG4re1xuK1x0c3RydWN0IGJ0ZiAqYnRmO1xuK1x0aW50IGlkO1xuK1xuK1x0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiYnRmX19uZXdfZW1wdHlcIikpXG4rXHRcdHJldHVybiBOVUxMO1xuK1x0aWQgPSBidGZfX2FkZF9pbnQoYnRmLCBcImludFwiLCA0LCBCVEZfSU5UX1NJR05FRCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgMSwgXCJidGZfX2FkZF9pbnRcIikpXG4rXHRcdGdvdG8gZXJyX291dDtcbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJicGZfc3Bpbl9sb2NrXCIsIDQpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIFNQSU5fTE9DSywgXCJidGZfX2FkZF9zdHJ1Y3QgYnBmX3NwaW5fbG9ja1wiKSlcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcImJwZl9saXN0X2hlYWRcIiwgMTYpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfSEVBRCwgXCJidGZfX2FkZF9zdHJ1Y3QgYnBmX2xpc3RfaGVhZFwiKSlcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcImJwZl9saXN0X25vZGVcIiwgMjQpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfTk9ERSwgXCJidGZfX2FkZF9zdHJ1Y3QgYnBmX2xpc3Rfbm9kZVwiKSlcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0cmV0dXJuIGJ0ZjtcbitcbitlcnJfb3V0OlxuK1x0YnRmX19mcmVlKGJ0Zik7XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIGludCBhZGRfbG9jYWxfa3B0cihzdHJ1Y3QgYnRmICpidGYsIGludCBwb2ludGVlX2lkLCBjb25zdCBjaGFyICp0YWcpXG4re1xuK1x0aW50IGlkO1xuK1xuK1x0aWQgPSBidGZfX2FkZF90eXBlX3RhZyhidGYsIHRhZywgcG9pbnRlZV9pZCk7XG4rXHRpZiAoIUFTU0VSVF9HVChpZCwgMCwgXCJidGZfX2FkZF90eXBlX3RhZ1wiKSlcbitcdFx0cmV0dXJuIGlkO1xuK1x0aWQgPSBidGZfX2FkZF9wdHIoYnRmLCBpZCk7XG4rXHRBU1NFUlRfR1QoaWQsIDAsIFwiYnRmX19hZGRfcHRyXCIpO1xuK1x0cmV0dXJuIGlkO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X3NlbGZfY3ljbGUoY29uc3QgY2hhciAqdGFnLCBpbnQgZXhwZWN0ZWRfZXJyKVxuK3tcbitcdHN0cnVjdCBidGYgKmJ0ZjtcbitcdGludCBpZCwgZXJyO1xuK1xuK1x0YnRmID0gaW5pdF9idGYoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiaW5pdF9idGZcIikpXG4rXHRcdHJldHVybjtcbitcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA3LCB0YWcpO1xuK1x0aWYgKGlkIFx1MDAzYz0gMClcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwic2VsZl9jeWNsZVwiLCA4KTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCA3LCBcImJ0Zl9fYWRkX3N0cnVjdCBzZWxmX2N5Y2xlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJuZXh0XCIsIDYsIDAsIDApO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIHNlbGZfY3ljbGU6Om5leHRcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XG4rXHRBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsIFwiY2hlY2sgYnRmXCIpO1xuK291dDpcbitcdGJ0Zl9fZnJlZShidGYpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X2FiYV9jeWNsZSh2b2lkKVxuK3tcbitcdHN0cnVjdCBidGYgKmJ0ZjtcbitcdGludCBpZCwgZXJyO1xuK1xuK1x0YnRmID0gaW5pdF9idGYoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiaW5pdF9idGZcIikpXG4rXHRcdHJldHVybjtcbitcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCAxMCwgXCJrcHRyXCIpO1xuK1x0aWYgKGlkIFx1MDAzYz0gMClcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgOSwgXCJrcHRyXCIpO1xuK1x0aWYgKGlkIFx1MDAzYz0gMClcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwiY3ljbGVfYVwiLCA4KTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCA5LCBcImJ0Zl9fYWRkX3N0cnVjdCBjeWNsZV9hXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJiXCIsIDYsIDAsIDApO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIGN5Y2xlX2E6OmJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcImN5Y2xlX2JcIiwgOCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgMTAsIFwiYnRmX19hZGRfc3RydWN0IGN5Y2xlX2JcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcImFcIiwgOCwgMCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgY3ljbGVfYjo6YVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbitcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXCJjaGVjayBidGZcIik7XG4rb3V0OlxuK1x0YnRmX19mcmVlKGJ0Zik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfbWl4ZWRfY3ljbGUodm9pZClcbit7XG4rXHRzdHJ1Y3QgYnRmICpidGY7XG4rXHRpbnQgaWQsIGVycjtcbitcbitcdGJ0ZiA9IGluaXRfYnRmKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcImluaXRfYnRmXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgNywgXCJrcHRyXCIpO1xuK1x0aWYgKGlkIFx1MDAzYz0gMClcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwibWl4ZWRfb3duZXJcIiwgMjApO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIDcsIFwiYnRmX19hZGRfc3RydWN0IG1peGVkX293bmVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJyb290XCIsIExJU1RfSEVBRCwgMCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgbWl4ZWRfb3duZXI6OnJvb3RcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcImxvY2tcIiwgU1BJTl9MT0NLLCAxMjgsIDApO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIG1peGVkX293bmVyOjpsb2NrXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlkID0gYnRmX19hZGRfZGVjbF90YWcoYnRmLCBcImNvbnRhaW5zOm1peGVkX25vZGU6bm9kZVwiLCA3LCAwKTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCA4LCBcImJ0Zl9fYWRkX2RlY2xfdGFnIG1peGVkX293bmVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJtaXhlZF9ub2RlXCIsIDMyKTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCA5LCBcImJ0Zl9fYWRkX3N0cnVjdCBtaXhlZF9ub2RlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJub2RlXCIsIExJU1RfTk9ERSwgMCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgbWl4ZWRfbm9kZTo6bm9kZVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwib3duZXJcIiwgNiwgMTkyLCAwKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBtaXhlZF9ub2RlOjpvd25lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbitcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXCJjaGVjayBidGZcIik7XG4rb3V0OlxuK1x0YnRmX19mcmVlKGJ0Zik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfYWN5Y2xpY19kZXB0aChpbnQgZGVwdGgsIGludCBleHBlY3RlZF9lcnIpXG4re1xuK1x0aW50IHB0cl9pZFtNQVhfT1dORVJTSElQX0RFUFRIICsgMV07XG4rXHRpbnQgZmlyc3Rfc3RydWN0X2lkO1xuK1x0c3RydWN0IGJ0ZiAqYnRmO1xuK1x0aW50IGlkLCBlcnIsIGk7XG4rXG4rXHRidGYgPSBpbml0X2J0ZigpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJpbml0X2J0ZlwiKSlcbitcdFx0cmV0dXJuO1xuK1x0Zmlyc3Rfc3RydWN0X2lkID0gNSArIDIgKiBkZXB0aDtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGRlcHRoOyBpKyspIHtcbitcdFx0cHRyX2lkW2ldID0gYWRkX2xvY2FsX2twdHIoYnRmLCBmaXJzdF9zdHJ1Y3RfaWQgKyBpICsgMSwgXCJrcHRyXCIpO1xuK1x0XHRpZiAocHRyX2lkW2ldIFx1MDAzYz0gMClcbitcdFx0XHRnb3RvIG91dDtcbitcdH1cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGRlcHRoOyBpKyspIHtcbitcdFx0Y2hhciBuYW1lWzE2XTtcbitcbitcdFx0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcIm93bmVyXyVkXCIsIGkpO1xuK1x0XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIDgpO1xuK1x0XHRpZiAoIUFTU0VSVF9FUShpZCwgZmlyc3Rfc3RydWN0X2lkICsgaSwgXCJidGZfX2FkZF9zdHJ1Y3Qgb3duZXJcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJuZXh0XCIsIHB0cl9pZFtpXSwgMCwgMCk7XG4rXHRcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBvd25lcjo6bmV4dFwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdH1cbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJwbGFpbl9sZWFmXCIsIDQpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIGZpcnN0X3N0cnVjdF9pZCArIGRlcHRoLCBcImJ0Zl9fYWRkX3N0cnVjdCBwbGFpbl9sZWFmXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuK1x0QVNTRVJUX0VRKGVyciwgZXhwZWN0ZWRfZXJyLCBcImNoZWNrIGJ0ZlwiKTtcbitvdXQ6XG4rXHRidGZfX2ZyZWUoYnRmKTtcbit9XG4rXG4rdm9pZCB0ZXN0X2xvY2FsX2twdHJfb3duZXJzaGlwKHZvaWQpXG4re1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJzZWxmX2N5Y2xlXCIpKVxuK1x0XHR0ZXN0X3NlbGZfY3ljbGUoXCJrcHRyXCIsIC1FTE9PUCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInVudHJ1c3RlZF9zZWxmX2N5Y2xlXCIpKVxuK1x0XHR0ZXN0X3NlbGZfY3ljbGUoXCJrcHRyX3VudHJ1c3RlZFwiLCAwKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicGVyY3B1X3NlbGZfY3ljbGVcIikpXG4rXHRcdHRlc3Rfc2VsZl9jeWNsZShcInBlcmNwdV9rcHRyXCIsIC1FTE9PUCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcIkFCQV9jeWNsZVwiKSlcbitcdFx0dGVzdF9hYmFfY3ljbGUoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibWl4ZWRfZ3JhcGhfcm9vdF9jeWNsZVwiKSlcbitcdFx0dGVzdF9taXhlZF9jeWNsZSgpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtYXhfYWN5Y2xpY1wiKSlcbitcdFx0dGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEgsIDApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJ0b29fZGVlcF9hY3ljbGljXCIpKVxuK1x0XHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCArIDEsIC1FTE9PUCk7XG4rfVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjk6MTEuODQ5NzM4OTc1WiIsIlNlcSI6MjUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjg3MzE0NjA0ODksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBQYXRjaCBmb3IgVW5pbml0aWFsaXplZCBNZW1vcnkgUmlza3MqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBwYXRjaCBhbmQgc2VlIGlmIHdlIGhhdmUgYW55IEtNU0FOIGNvbmNlcm5zIGhlcmUuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBnbyBtZXRob2RpY2FsbHkgdGhyb3VnaCB0aGUgY2hhbmdlcywgZm9jdXNpbmcgb24gd2hlcmUgZGF0YSBpcyBiZWluZyBoYW5kbGVkIGFuZCBlc3BlY2lhbGx5IHdoZXJlIG1lbW9yeSBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiBoYXBwZW5zLlxuXG5GaXJzdCwgdGhlIGBrZXJuZWwvYnBmL2J0Zi5jYCBjaGFuZ2VzOiBJdCBsb29rcyBsaWtlIHRoZXkncmUgcmV3b3JraW5nIHRoZSBvd25lcnNoaXAgdmFsaWRhdGlvbiBsb2dpYyB3aXRoaW4gdGhlIEJURiAoQlBGIFR5cGUgRm9ybWF0KSBzeXN0ZW0uIFNwZWNpZmljYWxseSwgdGhleSd2ZSBzaGlmdGVkIHRoZSBjeWNsZSBkZXRlY3Rpb24gYW5kIG93bmVyc2hpcCB2YWxpZGF0aW9uIGFyb3VuZCB3aXRoaW4gYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKClgLiBJbnRlcmVzdGluZyB0aGF0IHRoZXkgYXJlIHJlbW92aW5nIG9sZGVyIGN5Y2xlIGRldGVjdGlvbiBhbmQgbW92aW5nIG93bmVyc2hpcCB2YWxpZGF0aW9uIGxhdGVyLlxuXG5UaGUgYWRkaXRpb24gb2YgYGJ0Zl9vd25lZF90eXBlX2lkeCgpYCBpbW1lZGlhdGVseSBncmFicyBteSBhdHRlbnRpb24uIEl0J3MgcHVycG9zZSBpcyB0byBmaW5kIHRoZSBzdHJ1Y3QgbWV0YSBpbmRleCBmb3IgYW4gb3duZWQgdHlwZS4gSSBoYXZlIGFuIGl0Y2ggdGhhdCB0aGlzIGZ1bmN0aW9uIGNvdWxkIGJlIGEgcG90ZW50aWFsIHBvaW50IGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSB0byBiZSBleHBvc2VkIGlmIG5vdCBoYW5kbGVkIGNhcmVmdWxseSwgZXNwZWNpYWxseSBpZiB0aGVyZSBhcmUgYW55IHN1YnRsZSBjaGFuZ2VzIGluIGhvdyB0aGlzIG93bmVyc2hpcCBpbmZvcm1hdGlvbiBpcyB0cmFja2VkLCBvciBob3cgaXQgaW50ZXJhY3RzIHdpdGgga2VybmVsIHBvaW50ZXJzLCB0aGlzIGlzIHdoZXJlIHRvIGxvb2suIFRoZSB1c2Ugb2YgYC1FTk9FTlRgIGZvciBrZXJuZWwga3B0cnMgaXMgYWxzbyB3b3J0aCBub3Rpbmc7IHdlIG5lZWQgdG8gc2VlIGhvdyB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSByZXN0IG9mIHRoZSBjb2RlLlxuXG5gYnRmX293bmVyc2hpcF9kZXB0aCgpYCBzZWVtcyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkOyByZWN1cnNpdmUgZGVwdGggY2FsY3VsYXRpb24gd2l0aCBtZW1vaXphdGlvbiwgYW5kIGNoZWNrcyBhZ2FpbnN0IGBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSGAuIFNlZW1zIG5vcm1hbCBlbm91Z2gsIGFsdGhvdWdoIHJlY3Vyc2l2ZSBmdW5jdGlvbnMgYXJlIGFsd2F5cyB3b3J0aCBhIGNsb3NlIGxvb2sgaW4gdGhlc2UgY29udGV4dHMuXG5cbk5vdywgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKWAgaXMgd2hlcmUgdGhpbmdzIGdldCBhIGJpdCBtb3JlIGNyaXRpY2FsLiBXZSBoYXZlIG1lbW9yeSBhbGxvY2F0aW9uIHdpdGggYGt2Y2FsbG9jYCwgd2hpY2ggaXMgZ29vZC4gQnV0LCB3ZSBoYXZlIGEgY2hlY2sgZm9yIGAhZGVwdGhgIGFuZCBhIHJldHVybiBvZiBgLUVOT01FTWAuIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhpcyBgLUVOT01FTWAgaXMgaGFuZGxlZCBjb3JyZWN0bHkgdXAgdGhlIGNhbGwgc3RhY2sgdG8gYXZvaWQgYW55IHBvdGVudGlhbCB1c2UtYWZ0ZXItZnJlZSBvciBvdGhlciBtZW1vcnktcmVsYXRlZCBpc3N1ZXMsIG9yIHBlcmhhcHMgYSBkZW5pYWwgb2Ygc2VydmljZSBpZiBzb21ldGhpbmcgaXNuJ3QgaGFuZGxlZC4gV2UgYWxzbyBuZWVkIHRvIHNlZSBpZiB0aGUgYGt2ZnJlZShkZXB0aClgIGhhcHBlbnMgaW4gYWxsIGNvZGUgcGF0aHMgYXMgdGhpcyBpcyBjcml0aWNhbCB0byBhdm9pZCBtZW1vcnkgbGVha3MuIFRoZSBmYWN0IHRoYXQgaXQgY2FsbHMgYGJ0Zl9vd25lcnNoaXBfZGVwdGgoKWAgZm9yIGVhY2ggc3RydWN0IG1ldGEgaW5kZXggaXMgYWxzbyBpbXBvcnRhbnQgdG8gY29uc2lkZXIuXG5cbkZpbmFsbHksIHRoZSBgYnRmX3BhcnNlKClgIGNhbGwgdG8gYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKWAgaXMgdGhlIGVudHJ5IHBvaW50LCBzbyB3ZSBuZWVkIHRvIHNlZSBob3cgZXJyb3JzIGhlcmUgcHJvcGFnYXRlLiBUaGlzIGlzIHdoZXJlIHRoZSBvdmVyYWxsIHNlY3VyaXR5IGltcGxpY2F0aW9ucyBzdGFydCB0byByZXZlYWwgdGhlbXNlbHZlcy5cblxuSSB3aWxsIGFsc28gY2hlY2sgdGhlIHNlbGYgdGVzdHMgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNgIGFuZCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuY2AuXG5cbkknbGwgbmVlZCB0byBnbyBiYWNrIGFuZCB0aG9yb3VnaGx5IGluc3BlY3QgdGhlIGNvZGUgc3Vycm91bmRpbmcgdGhlc2UgZnVuY3Rpb25zLCBzcGVjaWZpY2FsbHkgdGhlIGNvbnRleHQgb2YgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKClgIGFuZCBgYnRmX3BhcnNlYCwgdG8gdW5kZXJzdGFuZCB0aGUgY29udHJvbCBmbG93LCBlcnJvciBoYW5kbGluZywgYW5kIG1lbW9yeSBtYW5hZ2VtZW50LiBXZSBuZWVkIHRvIGJlIGFic29sdXRlbHkgc3VyZSB0aGF0IGV2ZXJ5IGNvZGUgcGF0aCBpcyBzYWZlIGFuZCB0aGF0IHRoZXJlIGFyZSBubyBnYXBzIHRoYXQgY291bGQgbGVhZCB0byBLTVNBTiB0cmlnZ2VyaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3MDM1LCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDg0LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjk6MjAuNTgxMjAyMDY0WiIsIlNlcSI6MjYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDIyMzM5ODQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL2JwZi9idGYuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL2J0Zi5jPTQxMzU9c3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9wYXJzZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTQyNjctXFxua2VybmVsL2JwZi9idGYuYzo0MjY4OmludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXFxua2VybmVsL2JwZi9idGYuYy00MjY5LXtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NTk5OT1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjA3Ny1cXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2Mgc3RydWN0X21ldGFfdGFiLVxcdTAwM2VjbnQ7IGkrKykge1xcbmtlcm5lbC9icGYvYnRmLmM6NjA3ODpcXHRcXHRcXHRlcnIgPSBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhidGYsIHN0cnVjdF9tZXRhX3RhYi1cXHUwMDNldHlwZXNbaV0ucmVjb3JkKTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNzktXFx0XFx0XFx0aWYgKGVyciBcXHUwMDNjIDApXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDEyOjI5OjIwLjY4MzQ0MTE4OFoiLCJTZXEiOjI3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNDk2Mzg2MDgwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIGl0OlxuXG4qKkRpdmluZyBpbnRvIEJURiBGaWVsZCBIYW5kbGluZyoqXG5cbkFscmlnaHQsIGxldCdzIGdldCBpbnRvIHRoZSBuaXR0eS1ncml0dHkuIEknbSBnb2luZyB0byBkaWcgaW50byB0aGUgYGtlcm5lbC9icGYvYnRmLmNgIGZpbGUgYW5kIHNwZWNpZmljYWxseSBmb2N1cyBvbiB0aGUgY29kZSBzdXJyb3VuZGluZyBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIGFuZCBgYnRmX3BhcnNlYC4gV2Uga25vdyBCVEYncyBjcnVjaWFsIGZvciBlZmZpY2llbnRseSByZXByZXNlbnRpbmcgYW5kIG1hbmFnaW5nIHR5cGUgaW5mb3JtYXRpb24gZm9yIGVCUEYgcHJvZ3JhbXMsIHNvIEkgd2FudCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgaG93IHRoZSBrZXJuZWwgdmFsaWRhdGVzIGFuZCBtYW5pcHVsYXRlcyBCVEYgZmllbGQgZGVmaW5pdGlvbnMgZHVyaW5nIHBhcnNpbmcuIEl0J3MgaW1wZXJhdGl2ZSBJIGdyYXNwIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgcG90ZW50aWFsIGluY29uc2lzdGVuY2llcyBvciBlcnJvcnMgaW4gdGhlIEJURiBkYXRhIGFuZCwgY3J1Y2lhbGx5LCBob3cgaXQgYXR0ZW1wdHMgdG8gY29ycmVjdCB0aGVtLiBJJ20gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gaG93IHRoZXkndmUgaGFuZGxlZCBzdHJ1Y3R1cmUgYW5kIHVuaW9uIG9mZnNldHMsIGFueSBwYWRkaW5nIGlzc3VlcywgYW5kIGFsc28gaG93IHR5cGUgcmVsYXRpb25zaGlwcyBhcmUgcmVzb2x2ZWQuIExldCdzIHNlZSBob3cgdGhleSd2ZSBhZGRyZXNzZWQgcG90ZW50aWFsIGNvcnJ1cHRpb24gb3IgZXJyb3JzIGluIHRoZSBmaWVsZCBkYXRhIGl0c2VsZiwgYW5kIGVuc3VyZSBvdXIgYXNzdW1wdGlvbnMgbWF0Y2ggdGhlIGltcGxlbWVudGF0aW9uLiBUaGlzIGlzIGdvaW5nIHRvIGJlIGFib3V0IG1haW50YWluaW5nIHRoZSBpbnRlZ3JpdHkgb2YgdGhhdCBjcnVjaWFsIHR5cGUgaW5mb3JtYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg1MDMsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyOToyMy4xNzk4Mjk2NzdaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzA4MTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9icGYvYnRmLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDI2NSxcbiAgXCJMaW5lQ291bnRcIjogOTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiNDI2NTpcXHRcXHRyZXR1cm4gRVJSX1BUUihyZXQpO1xcbjQyNjY6XFx0fVxcbjQyNjc6XFx0XFxuNDI2ODpcXHRpbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKVxcbjQyNjk6XFx0e1xcbjQyNzA6XFx0XFx0aW50IGk7XFxuNDI3MTpcXHRcXG40MjcyOlxcdFxcdC8qXFxuNDI3MzpcXHRcXHQgKiBDaGVjayBmaWVsZHMgd2hpY2ggcmVxdWlyZSB0aGUgY29tcGxldGUgQlRGIGFuZCBpbml0aWFsaXplIHJ1bnRpbWVcXG40Mjc0OlxcdFxcdCAqIG1ldGFkYXRhLiBPd25lcnNoaXAgcmVsYXRpb25zaGlwcyBhcmUgdmFsaWRhdGVkIGFmdGVyIGV2ZXJ5IHJlY29yZCBoYXNcXG40Mjc1OlxcdFxcdCAqIGJlZW4gZml4ZWQgdXAuXFxuNDI3NjpcXHRcXHQgKi9cXG40Mjc3OlxcdFxcdGlmIChJU19FUlJfT1JfTlVMTChyZWMpIHx8ICEocmVjLVxcdTAwM2VmaWVsZF9tYXNrIFxcdTAwMjYgKEJQRl9HUkFQSF9ST09UIHwgQlBGX1VQVFIpKSlcXG40Mjc4OlxcdFxcdFxcdHJldHVybiAwO1xcbjQyNzk6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHJlYy1cXHUwMDNlY250OyBpKyspIHtcXG40MjgwOlxcdFxcdFxcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKm1ldGE7XFxuNDI4MTpcXHRcXHRcXHRjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQ7XFxuNDI4MjpcXHRcXHRcXHR1MzIgYnRmX2lkO1xcbjQyODM6XFx0XFxuNDI4NDpcXHRcXHRcXHRpZiAocmVjLVxcdTAwM2VmaWVsZHNbaV0udHlwZSA9PSBCUEZfVVBUUikge1xcbjQyODU6XFx0XFx0XFx0XFx0LyogVGhlIHVwdHIgb25seSBzdXBwb3J0cyBwaW5uaW5nIG9uZSBwYWdlIGFuZCBjYW5ub3RcXG40Mjg2OlxcdFxcdFxcdFxcdCAqIHBvaW50IHRvIGEga2VybmVsIHN0cnVjdFxcbjQyODc6XFx0XFx0XFx0XFx0ICovXFxuNDI4ODpcXHRcXHRcXHRcXHRpZiAoYnRmX2lzX2tlcm5lbChyZWMtXFx1MDAzZWZpZWxkc1tpXS5rcHRyLmJ0ZikpXFxuNDI4OTpcXHRcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG40MjkwOlxcdFxcdFxcdFxcdHQgPSBidGZfdHlwZV9ieV9pZChyZWMtXFx1MDAzZWZpZWxkc1tpXS5rcHRyLmJ0ZixcXG40MjkxOlxcdFxcdFxcdFxcdFxcdFxcdCAgIHJlYy1cXHUwMDNlZmllbGRzW2ldLmtwdHIuYnRmX2lkKTtcXG40MjkyOlxcdFxcdFxcdFxcdGlmICghdC1cXHUwMDNlc2l6ZSlcXG40MjkzOlxcdFxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjQyOTQ6XFx0XFx0XFx0XFx0aWYgKHQtXFx1MDAzZXNpemUgXFx1MDAzZSBQQUdFX1NJWkUpXFxuNDI5NTpcXHRcXHRcXHRcXHRcXHRyZXR1cm4gLUUyQklHO1xcbjQyOTY6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuNDI5NzpcXHRcXHRcXHR9XFxuNDI5ODpcXHRcXG40Mjk5OlxcdFxcdFxcdGlmICghKHJlYy1cXHUwMDNlZmllbGRzW2ldLnR5cGUgXFx1MDAyNiBCUEZfR1JBUEhfUk9PVCkpXFxuNDMwMDpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG40MzAxOlxcdFxcdFxcdGJ0Zl9pZCA9IHJlYy1cXHUwMDNlZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xcbjQzMDI6XFx0XFx0XFx0bWV0YSA9IGJ0Zl9maW5kX3N0cnVjdF9tZXRhKGJ0ZiwgYnRmX2lkKTtcXG40MzAzOlxcdFxcdFxcdGlmICghbWV0YSlcXG40MzA0OlxcdFxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbjQzMDU6XFx0XFx0XFx0cmVjLVxcdTAwM2VmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9yZWMgPSBtZXRhLVxcdTAwM2VyZWNvcmQ7XFxuNDMwNjpcXHRcXHR9XFxuNDMwNzpcXHRcXHRyZXR1cm4gMDtcXG40MzA4OlxcdH1cXG40MzA5OlxcdFxcbjQzMTA6XFx0c3RhdGljIGludCBidGZfb3duZWRfdHlwZV9pZHgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLFxcbjQzMTE6XFx0XFx0XFx0XFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9maWVsZCAqZmllbGQpXFxuNDMxMjpcXHR7XFxuNDMxMzpcXHRcXHRzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhICptZXRhO1xcbjQzMTQ6XFx0XFx0dTMyIGJ0Zl9pZDtcXG40MzE1OlxcdFxcbjQzMTY6XFx0XFx0aWYgKGZpZWxkLVxcdTAwM2V0eXBlIFxcdTAwMjYgQlBGX0dSQVBIX1JPT1QpIHtcXG40MzE3OlxcdFxcdFxcdGJ0Zl9pZCA9IGZpZWxkLVxcdTAwM2VncmFwaF9yb290LnZhbHVlX2J0Zl9pZDtcXG40MzE4OlxcdFxcdH0gZWxzZSBpZiAoZmllbGQtXFx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUkVGIHx8IGZpZWxkLVxcdTAwM2V0eXBlID09IEJQRl9LUFRSX1BFUkNQVSkge1xcbjQzMTk6XFx0XFx0XFx0aWYgKGJ0Zl9pc19rZXJuZWwoZmllbGQtXFx1MDAzZWtwdHIuYnRmKSlcXG40MzIwOlxcdFxcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbjQzMjE6XFx0XFx0XFx0YnRmX2lkID0gZmllbGQtXFx1MDAzZWtwdHIuYnRmX2lkO1xcbjQzMjI6XFx0XFx0fSBlbHNlIHtcXG40MzIzOlxcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbjQzMjQ6XFx0XFx0fVxcbjQzMjU6XFx0XFxuNDMyNjpcXHRcXHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xcbjQzMjc6XFx0XFx0aWYgKCFtZXRhKVxcbjQzMjg6XFx0XFx0XFx0cmV0dXJuIGZpZWxkLVxcdTAwM2V0eXBlIFxcdTAwMjYgQlBGX0dSQVBIX1JPT1QgPyAtRUZBVUxUIDogLUVOT0VOVDtcXG40MzI5OlxcdFxcdHJldHVybiBtZXRhIC0gdGFiLVxcdTAwM2V0eXBlcztcXG40MzMwOlxcdH1cXG40MzMxOlxcdFxcbjQzMzI6XFx0LypcXG40MzMzOlxcdCAqIEVhY2ggb3duZXJzaGlwIGVkZ2UgYWRkcyBrZXJuZWwgZnJhbWVzIHRocm91Z2ggYnBmX29ial9mcmVlX2ZpZWxkcygpIGFuZFxcbjQzMzQ6XFx0ICogX19icGZfb2JqX2Ryb3BfaW1wbCgpLiBLZWVwIHRoZSBib3VuZCBkZWxpYmVyYXRlbHkgc21hbGwgYmVjYXVzZSBvYmplY3RcXG40MzM1OlxcdCAqIGRlc3RydWN0aW9uIGNhbiBpdHNlbGYgcnVuIGJlbG93IGEgQlBGIGNhbGwgY2hhaW4uIEEgZmluYWwgcG9pbnRlZSB3aXRob3V0XFxuNDMzNjpcXHQgKiBzcGVjaWFsIGZpZWxkcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIGFuZCBhZGRzIG9ubHkgYVxcbjQzMzc6XFx0ICogbm9uLXJlY3Vyc2luZyBkcm9wLlxcbjQzMzg6XFx0ICovXFxuNDMzOTpcXHQjZGVmaW5lIEJURl9NQVhfT1dORVJTSElQX0RFUFRIIDhcXG40MzQwOlxcdFxcbjQzNDE6XFx0c3RhdGljIGludCBidGZfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG40MzQyOlxcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLCB1OCAqZGVwdGgsXFxuNDM0MzpcXHRcXHRcXHRcXHQgICAgICAgaW50IGlkeCwgaW50IGRlcHRoX2xlZnQpXFxuNDM0NDpcXHR7XFxuNDM0NTpcXHRcXHRjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjID0gdGFiLVxcdTAwM2V0eXBlc1tpZHhdLnJlY29yZDtcXG40MzQ2OlxcdFxcdGludCBpLCByZXQsIG1heF9kZXB0aCA9IDA7XFxuNDM0NzpcXHRcXG40MzQ4OlxcdFxcdGlmICghZGVwdGhfbGVmdClcXG40MzQ5OlxcdFxcdFxcdHJldHVybiAtRUxPT1A7XFxuNDM1MDpcXHRcXHRpZiAoZGVwdGhbaWR4XSlcXG40MzUxOlxcdFxcdFxcdGdvdG8gZG9uZTtcXG40MzUyOlxcdFxcbjQzNTM6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHJlYy1cXHUwMDNlY250OyBpKyspIHtcXG40MzU0OlxcdFxcdFxcdHJldCA9IGJ0Zl9vd25lZF90eXBlX2lkeChidGYsIHRhYiwgXFx1MDAyNnJlYy1cXHUwMDNlZmllbGRzW2ldKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjk6MjMuMTgwMTM5ODI3WiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQ0NDA0MjUwOTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIGZ1bmN0aW9ucywgdGhpbmtpbmcgdGhyb3VnaCBpdCBhcyBpZiB0aGV5IHdlcmUgbXkgb3duIG1lbnRhbCBwcm9jZXNzZXM6XG5cbioqUXVpY2sgU2NhbiBvZiBPd25lcnNoaXAgRGVwdGggYW5kIFBhcnNpbmcgRnVuY3Rpb25zKipcblxuQWxyaWdodCwgYmVmb3JlIGRpdmluZyBpbnRvIGFueXRoaW5nIHRvbyBkZWVwLCBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIGhvdyB0aGVzZSByZWxhdGVkIGZ1bmN0aW9ucyBhcmUgaW50ZXJhY3RpbmcuIEknbSB0aGlua2luZyBhYm91dCBgYnRmX293bmVyc2hpcF9kZXB0aGAsIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCwgYW5kIGBidGZfcGFyc2VgIGluIHBhcnRpY3VsYXIuIEltbWVkaWF0ZWx5LCBJJ20gZ29pbmcgdG8gd2FudCB0byB1bmRlcnN0YW5kIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBkZXB0aCBjaGVja2luZyBhbmQgcGFyc2luZy4gSXMgdGhlIGRlcHRoIGNoZWNrIGhhcHBlbmluZyAqYmVmb3JlKiBwYXJzaW5nLCBvciBpcyBpdCBpbnRlcmxlYXZlZCBpbiBzb21lIHdheT8gT3IgaXMgYGJ0Zl9wYXJzZWAgdGhlIG1haW4gZHJpdmVyIHdpdGggdGhlIGRlcHRoIGNoZWNrcyBiZWluZyBzb21lIGtpbmQgb2YgYW5jaWxsYXJ5IG9yIGhlbHBlciBmdW5jdGlvbj8gSSB3YW50IHRvIGtub3cgaWYgdGhlIGBvd25lcnNoaXBfZGVwdGhgIGZ1bmN0aW9ucyBhcmUganVzdCBndWFyZHMsIHNhbml0eSBjaGVja3MsIG9yIGlmIHRoZXkncmUgYWN0dWFsbHkgZnVuZGFtZW50YWxseSBpbnZvbHZlZCBpbiBob3cgdGhlIEJURiBkYXRhIGlzIHByb2Nlc3NlZCBvciBjb25zdHJ1Y3RlZC4gRG9lcyBhIGRlZXAgb3duZXJzaGlwIG1lYW4gc29tZXRoaW5nIGRpZmZlcmVudCBpbiB0aGUgY29udGV4dCBvZiBgYnRmX3BhcnNlYD8gQW5kIGRvZXMgdGhpcyBpbnRlcnBsYXkgY2hhbmdlIGhvdyBJIGFwcHJvYWNoIGEgcG90ZW50aWFsIGFuYWx5c2lzIG9yIGRlYnVnZ2luZyBzaXR1YXRpb24/IFRoaXMgZmVlbHMgbGlrZSBhbiBpbXBvcnRhbnQgc3RhcnRpbmcgcG9pbnQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwMjY0LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyOToyNy42MjA1NjkzOTFaIiwiU2VxIjozMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mzk4MDAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9icGYvYnRmLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDM1NSxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiNDM1NTpcXHRcXHRcXHRpZiAocmV0ID09IC1FTk9FTlQpXFxuNDM1NjpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG40MzU3OlxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbjQzNTg6XFx0XFx0XFx0XFx0cmV0dXJuIHJldDtcXG40MzU5OlxcdFxcdFxcdHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCByZXQsIGRlcHRoX2xlZnQgLSAxKTtcXG40MzYwOlxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbjQzNjE6XFx0XFx0XFx0XFx0cmV0dXJuIHJldDtcXG40MzYyOlxcdFxcdFxcdG1heF9kZXB0aCA9IG1heChtYXhfZGVwdGgsIHJldCk7XFxuNDM2MzpcXHRcXHR9XFxuNDM2NDpcXHRcXHRkZXB0aFtpZHhdID0gbWF4X2RlcHRoICsgMTtcXG40MzY1OlxcdGRvbmU6XFxuNDM2NjpcXHRcXHRyZXR1cm4gZGVwdGhbaWR4XSBcXHUwMDNlIGRlcHRoX2xlZnQgPyAtRUxPT1AgOiBkZXB0aFtpZHhdO1xcbjQzNjc6XFx0fVxcbjQzNjg6XFx0XFxuNDM2OTpcXHRzdGF0aWMgaW50IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxcbjQzNzA6XFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxcbjQzNzE6XFx0e1xcbjQzNzI6XFx0XFx0dTggKmRlcHRoO1xcbjQzNzM6XFx0XFx0aW50IGksIHJldCA9IDA7XFxuNDM3NDpcXHRcXG40Mzc1OlxcdFxcdGRlcHRoID0ga3ZjYWxsb2ModGFiLVxcdTAwM2VjbnQsIHNpemVvZigqZGVwdGgpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTtcXG40Mzc2OlxcdFxcdGlmICghZGVwdGgpXFxuNDM3NzpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG40Mzc4OlxcdFxcbjQzNzk6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHRhYi1cXHUwMDNlY250OyBpKyspIHtcXG40MzgwOlxcdFxcdFxcdHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCBpLFxcbjQzODE6XFx0XFx0XFx0XFx0XFx0XFx0ICBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCk7XFxuNDM4MjpcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG40MzgzOlxcdFxcdFxcdFxcdGJyZWFrO1xcbjQzODQ6XFx0XFx0XFx0cmV0ID0gMDtcXG40Mzg1OlxcdFxcdH1cXG40Mzg2OlxcdFxcdGt2ZnJlZShkZXB0aCk7XFxuNDM4NzpcXHRcXHRyZXR1cm4gcmV0O1xcbjQzODg6XFx0fVxcbjQzODk6XFx0XFxuNDM5MDpcXHRzdGF0aWMgdm9pZCBfX2J0Zl9zdHJ1Y3Rfc2hvdyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcXG40MzkxOlxcdFxcdFxcdFxcdCAgICAgIHUzMiB0eXBlX2lkLCB2b2lkICpkYXRhLCB1OCBiaXRzX29mZnNldCxcXG40MzkyOlxcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCBidGZfc2hvdyAqc2hvdylcXG40MzkzOlxcdHtcXG40Mzk0OlxcdFxcdGNvbnN0IHN0cnVjdCBidGZfbWVtYmVyICptZW1iZXI7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDEyOjI5OjI3LjYyMDk3MDQ1MVoiLCJTZXEiOjMxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMjE3MjcxNzM4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIGBidGZfcGFyc2VgKipcblxuT2theSwgdGltZSB0byB6ZXJvIGluLiBJJ20gdGhpbmtpbmcgd2UgbmVlZCB0byB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgYGJ0Zl9wYXJzZWAsIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSA2MDc1LiBNeSBndXQgZmVlbGluZyBpcyB0aGF0IHNvbWV0aGluZyBpbnRlcmVzdGluZyBpcyBoYXBwZW5pbmcsIG9yICpub3QqIGhhcHBlbmluZywgYXJvdW5kIHRoYXQgYXJlYSB3aXRoaW4gdGhlIGZ1bmN0aW9uLiBHaXZlbiB3aGF0IEkndmUgYmVlbiBzZWVpbmcgd2l0aCB0aGUgcmVsYXRlZCBpc3N1ZXMsIHRoaXMgaXMgYSBsaWtlbHkgcG9pbnQgZm9yIGRlZXBlciBpbnNwZWN0aW9uLiBUaW1lIHRvIGZpcmUgdXAgdGhlIGRlYnVnZ2VyIGFuZCBzdGFydCB0cmFjaW5nIGV4ZWN1dGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTExNjksIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDEyOjI5OjI5LjgzODI0NTc4OVoiLCJTZXEiOjMyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNzQ0NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2JwZi9idGYuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA2MDcwLFxuICBcIkxpbmVDb3VudFwiOiAzNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCI2MDcwOlxcdFxcdFxcdGdvdG8gZXJyb3V0O1xcbjYwNzE6XFx0XFx0fVxcbjYwNzI6XFx0XFx0YnRmLVxcdTAwM2VzdHJ1Y3RfbWV0YV90YWIgPSBzdHJ1Y3RfbWV0YV90YWI7XFxuNjA3MzpcXHRcXG42MDc0OlxcdFxcdGlmIChzdHJ1Y3RfbWV0YV90YWIpIHtcXG42MDc1OlxcdFxcdFxcdGludCBpO1xcbjYwNzY6XFx0XFxuNjA3NzpcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2Mgc3RydWN0X21ldGFfdGFiLVxcdTAwM2VjbnQ7IGkrKykge1xcbjYwNzg6XFx0XFx0XFx0XFx0ZXJyID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBzdHJ1Y3RfbWV0YV90YWItXFx1MDAzZXR5cGVzW2ldLnJlY29yZCk7XFxuNjA3OTpcXHRcXHRcXHRcXHRpZiAoZXJyIFxcdTAwM2MgMClcXG42MDgwOlxcdFxcdFxcdFxcdFxcdGdvdG8gZXJyb3V0X21ldGE7XFxuNjA4MTpcXHRcXHRcXHR9XFxuNjA4MjpcXHRcXG42MDgzOlxcdFxcdFxcdGVyciA9IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoYnRmLCBzdHJ1Y3RfbWV0YV90YWIpO1xcbjYwODQ6XFx0XFx0XFx0aWYgKGVyciBcXHUwMDNjIDApXFxuNjA4NTpcXHRcXHRcXHRcXHRnb3RvIGVycm91dF9tZXRhO1xcbjYwODY6XFx0XFx0fVxcbjYwODc6XFx0XFxuNjA4ODpcXHRcXHRlcnIgPSBicGZfbG9nX2F0dHJfZmluYWxpemUoYXR0cl9sb2csIFxcdTAwMjZlbnYtXFx1MDAzZWxvZyk7XFxuNjA4OTpcXHRcXHRpZiAoZXJyKVxcbjYwOTA6XFx0XFx0XFx0Z290byBlcnJvdXRfZnJlZTtcXG42MDkxOlxcdFxcbjYwOTI6XFx0XFx0YnRmX3ZlcmlmaWVyX2Vudl9mcmVlKGVudik7XFxuNjA5MzpcXHRcXHRyZWZjb3VudF9zZXQoXFx1MDAyNmJ0Zi1cXHUwMDNlcmVmY250LCAxKTtcXG42MDk0OlxcdFxcdHJldHVybiBidGY7XFxuNjA5NTpcXHRcXG42MDk2OlxcdGVycm91dF9tZXRhOlxcbjYwOTc6XFx0XFx0YnRmX2ZyZWVfc3RydWN0X21ldGFfdGFiKGJ0Zik7XFxuNjA5ODpcXHRlcnJvdXQ6XFxuNjA5OTpcXHRcXHQvKiBvdmVyd3JpdGUgZXJyIHdpdGggLUVOT1NQQyBvciAtRUZBVUxUICovXFxuNjEwMDpcXHRcXHRyZXQgPSBicGZfbG9nX2F0dHJfZmluYWxpemUoYXR0cl9sb2csIFxcdTAwMjZlbnYtXFx1MDAzZWxvZyk7XFxuNjEwMTpcXHRcXHRpZiAocmV0KVxcbjYxMDI6XFx0XFx0XFx0ZXJyID0gcmV0O1xcbjYxMDM6XFx0ZXJyb3V0X2ZyZWU6XFxuNjEwNDpcXHRcXHRidGZfdmVyaWZpZXJfZW52X2ZyZWUoZW52KTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjk6MjkuODM4NjI1MDQ5WiIsIlNlcSI6MzMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjYzNTczNDk0NTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gQXNzZXNzbWVudDogQlRGIE93bmVyc2hpcCBWZXJpZmljYXRpb24qKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGdvYWwgaGVyZSBpcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGFueSBuZXcgcmlza3MgdGhhdCByZXF1aXJlIEtNU0FOJ3MgYXR0ZW50aW9uLiBMZXQgbWUgcmVjYXAgbXkgdGhpbmtpbmcuXG5cbkZpcnN0LCBJIHVuZGVyc3RhbmQgdGhpcyBwYXRjaCBmb2N1c2VzIG9uIEJURiAoQmVya2VsZXkgUGFja2V0IEZpbHRlciBUeXBlIEZvcm1hdCkgdmVyaWZpY2F0aW9uLCBzcGVjaWZpY2FsbHkgcmVnYXJkaW5nIHRoZSBvd25lcnNoaXAgb2Ygc3RydWN0dXJlcyB3aXRoaW4gdGhlc2UgQlRGIGRlZmluaXRpb25zLiBJIHNlZSB0aGF0IGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2AgaXMgc2V0dGluZyB1cCB0aGUgbmVjZXNzYXJ5IGxpbmtzIGZvciB0aGlzIG93bmVyc2hpcCBjaGVjaywgYW5kIGltcG9ydGFudGx5LCB0aGUgb3duZXJzaGlwIGN5Y2xlIGRldGVjdGlvbiBpcyBub3cgaGFuZGxlZCBieSBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAuXG5cbkRlbHZpbmcgaW50byBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAsIHRoZSBrZXkgaGVyZSBpcyB0aGUgYWxsb2NhdGlvbiBhbmQgdXNlIG9mIHRoZSBgZGVwdGhgIGFycmF5LiBJdCB1c2VzIGBrdmNhbGxvY2AsIHdoaWNoIGlzIHRoZSBjb3JyZWN0IGNhbGwgZm9yIHplcm8taW5pdGlhbGl6aW5nIHRoaXMgYXJyYXksIHdoaWNoIGlzIGNydWNpYWwgZm9yIG91ciBzYWZldHkgYW5hbHlzaXMuIFRoaXMgYXJyYXkgdHJhY2tzIHRoZSBvd25lcnNoaXAgZGVwdGggb2YgZWFjaCBzdHJ1Y3R1cmUuIFRoZSBjb2RlIHRoZW4gcmVjdXJzaXZlbHkgY2hlY2tzIHRoZSBvd25lcnNoaXAgZGVwdGggZm9yIGVhY2ggc3RydWN0IHVwIHRvIGBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSGAuIFRoZSBtZW1vaXphdGlvbiB3aXRoaW4gdGhlIGRlcHRoIGNoZWNrIGlzIGEgZ29vZCBvcHRpbWl6YXRpb24uIElmIHRoZSBgZGVwdGhgIGlzIG5vbi16ZXJvLCBpdCBtZWFucyBpdCB3YXMgcHJldmlvdXNseSBjaGVja2VkLiBJdCB0aGVuIGZyZWVzIHRoZSBtZW1vcnksIHdoaWNoIGlzIGFsc28gaW1wb3J0YW50LlxuXG5Ob3csIHRoZSBjcml0aWNhbCBxdWVzdGlvbjogYXJlIHRoZXJlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcz8gVGhlIGBkZXB0aGAgYXJyYXkgaXMgKnplcm9lZCogYnkgYGt2Y2FsbG9jYC4gQWxsIG90aGVyIHZhcmlhYmxlcyBzZWVtIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQuIE5vdGhpbmcgaXMgZGlyZWN0bHkgY29waWVkIHRvIHVzZXIgc3BhY2Ugb3IgZXhwb3NlZC4gVGhpcyBsb29rcyBnb29kLlxuXG5OZXh0LCBJIG5lZWQgdG8gY29uc2lkZXIgcG90ZW50aWFsIGJ1ZmZlciBvdmVycnVucywgdW5pbml0aWFsaXplZCBmaWVsZHMgaW4gQlBGIG9iamVjdHMsIG9yIGNoYW5nZXMgdG8gbGVuZ3Rocy4gSG93ZXZlciwgdGhpcyBwYXRjaCBpcyBvbmx5IHZhbGlkYXRpbmcgaW50ZXJuYWwgc3RydWN0dXJlcy4gSXQgc2VlbXMgdG8gYmUgc29sZWx5IGludm9sdmVkIGluIHZlcmlmaWNhdGlvbiwgKm5vdCogY3JlYXRpbmcsIG1vZGlmeWluZywgb3Igc2VuZGluZyBhbnl0aGluZyB0byB1c2VyLXNwYWNlIHRoYXQgaXNuJ3QgYWxyZWFkeSBoYW5kbGVkIGJ5IG90aGVyIGtlcm5lbCBjb2RlLiBJJ20gc2F0aXNmaWVkIHRoYXQgdGhpcyBwYXRjaCBkb2Vzbid0IGludHJvZHVjZSBhbnkgbmV3IHZ1bG5lcmFiaWxpdGllcyByZWxhdGVkIHRvIHRoZXNlIGlzc3Vlcy4gRnVydGhlciwgaWYgdGhlcmUgd2VyZSBhbnkgbWVtb3J5IHByb2JsZW1zIGluIHRoZSB0YWJsZSwgS0FTQU4gc2hvdWxkIGhhbmRsZSB0aGVtLlxuXG5MZXQgbWUgZ28gdGhyb3VnaCBteSB1c3VhbCBjaGVja2xpc3Q6IG5vIGtlcm5lbCBzdHJ1Y3R1cmVzIGFyZSBzZW50IHRvIHVzZXIgc3BhY2Ugd2hlcmUgZmllbGRzIG1pZ2h0IGJlIHVuaW5pdGlhbGl6ZWQuIFRoZXJlIGlzIG5vIGNvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyBiYXNlZCBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy4gQ29tcGxleCBkYXRhIHN0cnVjdHVyZXMsIGxpa2UgdGhlIGRlcHRoIGFycmF5LCBhcmUgY29ycmVjdGx5IGluaXRpYWxpemVkIHdpdGggYGt2Y2FsbG9jYC4gVGhlIGJvdW5kcyBjaGVja3MgYXJlIGdvb2QgYW5kIHRoaXMgcGF0Y2ggZG9lc24ndCBpbnRyb2R1Y2UgYW55IG5ldyBvcHBvcnR1bml0aWVzIHRvIHJlYWQgdW5pbml0aWFsaXplZCBtZW1vcnkuXG5cblRoZXJlZm9yZSwgYWZ0ZXIgdGhpcyBkZXRhaWxlZCBhc3Nlc3NtZW50LCBJIGNhbiBjb25maWRlbnRseSBjb25jbHVkZSB0aGF0IGBOZWVkc0tNU0FOYCBzaG91bGQgYmUgZmFsc2UuXG5cbkluIHN1bW1hcnksIHRoaXMgcGF0Y2ggZW5mb3JjZXMgQlRGIG93bmVyc2hpcCB2ZXJpZmljYXRpb24gdG8gY2hlY2sgZm9yIGN5Y2xlcyBhbmQgbGltaXQgZGVwdGguIFRoZSBtYWluIG1lbW9yeSBjb25jZXJuIGlzIGNvcnJlY3RseSBoYW5kbGVkIGJ5IGBrdmNhbGxvY2AsIHplcm9pbmcgdGhlIGBkZXB0aGAgYXJyYXkuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggdGhlIHRhYmxlIG9yIGxvb3BzIGFyZSBiZXR0ZXIgYWRkcmVzc2VkIGJ5IHN0YW5kYXJkIHNhbml0aXplcnMgc3VjaCBhcyBLQVNBTi5cblxuSSdtIGNvbWZvcnRhYmxlIHNldHRpbmcgdGhlIHJlc3VsdHMgbm93LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTg3MCwiT3V0cHV0VG9rZW5zIjoyMTMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3MjIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyOTozNi4xOTU5Nzc2N1oiLCJTZXEiOjM0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1OTcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggdXBkYXRlcyB0aGUgQlRGIHZlcmlmaWVyIHRvIHZhbGlkYXRlIG93bmVyc2hpcCBhY3ljbGljaXR5IGFuZCBlbmZvcmNlIGEgbWF4aW11bSBvd25lcnNoaXAgZGVwdGggKEJURl9NQVhfT1dORVJTSElQX0RFUFRIKSBhY3Jvc3MgQlBGIGdyYXBoIHJvb3RzIGFuZCBsb2NhbCBrcHRycy5cXG5cXG5NZW1vcnkgc2FmZXR5IGFuYWx5c2lzOlxcbjEuIFRoZSB0ZW1wb3JhcnkgZGVwdGggYXJyYXkgdXNlZCBkdXJpbmcgb3duZXJzaGlwIHRyYXZlcnNhbCBpcyBhbGxvY2F0ZWQgdmlhIGt2Y2FsbG9jKCksIGVuc3VyaW5nIGl0IGlzIGZ1bGx5IHplcm8taW5pdGlhbGl6ZWQuXFxuMi4gQWxsIGxvY2FsIHZhcmlhYmxlcyBpbiBidGZfb3duZXJzaGlwX2RlcHRoKCksIGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKSwgYW5kIGJ0Zl9vd25lZF90eXBlX2lkeCgpIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLlxcbjMuIE5vIGRhdGEgc3RydWN0dXJlcyBvciBidWZmZXJzIGFyZSBjb3BpZWQgdG8gdXNlciBzcGFjZSwgYW5kIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHJlYWQgb3IgdXNlZCBpbiBjb25kaXRpb25hbCBicmFuY2hpbmcuXFxuNC4gQW55IHBvdGVudGlhbCBpc3N1ZXMgd2l0aCBwb2ludGVyIGFyaXRobWV0aWMgb3IgYXJyYXkgaW5kZXhpbmcgaW50byB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIHdvdWxkIGJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTi5cXG5cXG5UaGVyZWZvcmUsIHRoaXMgY2hhbmdlIGRvZXMgbm90IGludHJvZHVjZSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IG5lZWRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCB1cGRhdGVzIHRoZSBCVEYgdmVyaWZpZXIgdG8gdmFsaWRhdGUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW5kIGVuZm9yY2UgYSBtYXhpbXVtIG93bmVyc2hpcCBkZXB0aCAoQlRGX01BWF9PV05FUlNISVBfREVQVEgpIGFjcm9zcyBCUEYgZ3JhcGggcm9vdHMgYW5kIGxvY2FsIGtwdHJzLlxcblxcbk1lbW9yeSBzYWZldHkgYW5hbHlzaXM6XFxuMS4gVGhlIHRlbXBvcmFyeSBkZXB0aCBhcnJheSB1c2VkIGR1cmluZyBvd25lcnNoaXAgdHJhdmVyc2FsIGlzIGFsbG9jYXRlZCB2aWEga3ZjYWxsb2MoKSwgZW5zdXJpbmcgaXQgaXMgZnVsbHkgemVyby1pbml0aWFsaXplZC5cXG4yLiBBbGwgbG9jYWwgdmFyaWFibGVzIGluIGJ0Zl9vd25lcnNoaXBfZGVwdGgoKSwgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCgpLCBhbmQgYnRmX293bmVkX3R5cGVfaWR4KCkgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXFxuMy4gTm8gZGF0YSBzdHJ1Y3R1cmVzIG9yIGJ1ZmZlcnMgYXJlIGNvcGllZCB0byB1c2VyIHNwYWNlLCBhbmQgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgcmVhZCBvciB1c2VkIGluIGNvbmRpdGlvbmFsIGJyYW5jaGluZy5cXG40LiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIHBvaW50ZXIgYXJpdGhtZXRpYyBvciBhcnJheSBpbmRleGluZyBpbnRvIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgd291bGQgYmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOLlxcblxcblRoZXJlZm9yZSwgdGhpcyBjaGFuZ2UgZG9lcyBub3QgaW50cm9kdWNlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgbmVlZGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflow8br8j[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-06 12:25:08 +0000 UTC FinishedAt: 2026-09-06 12:29:37 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "3ccdb07813829ba9487273e75d1cb238cfa774c1", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "3ccdb07813829ba9487273e75d1cb238cfa774c1", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL" ], "series_id": "178ac02d-2978-4e9e-a971-b60726da3acb" }, "track": "KASAN", "fuzz": { "focus": [ "bpf" ], "focus_symbols": [ "btf_check_ownership_depth", "btf_ownership_depth", "btf_owned_type_idx", "btf_check_and_fixup_fields", "btf_parse" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI3PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCYjMzQ7LAogICAgJiMzNDtidGZfb3duZXJzaGlwX2RlcHRoJiMzNDssCiAgICAmIzM0O2J0Zl9vd25lZF90eXBlX2lkeCYjMzQ7LAogICAgJiMzNDtidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyYjMzQ7LAogICAgJiMzNDtidGZfcGFyc2UmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCB1cGRhdGVzIHRoZSBCVEYgdmVyaWZpZXIgdG8gdmFsaWRhdGUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW5kIGVuZm9yY2UgYSBtYXhpbXVtIG93bmVyc2hpcCBkZXB0aCAoQlRGX01BWF9PV05FUlNISVBfREVQVEgpIGFjcm9zcyBCUEYgZ3JhcGggcm9vdHMgYW5kIGxvY2FsIGtwdHJzLlxuXG5NZW1vcnkgc2FmZXR5IGFuYWx5c2lzOlxuMS4gVGhlIHRlbXBvcmFyeSBkZXB0aCBhcnJheSB1c2VkIGR1cmluZyBvd25lcnNoaXAgdHJhdmVyc2FsIGlzIGFsbG9jYXRlZCB2aWEga3ZjYWxsb2MoKSwgZW5zdXJpbmcgaXQgaXMgZnVsbHkgemVyby1pbml0aWFsaXplZC5cbjIuIEFsbCBsb2NhbCB2YXJpYWJsZXMgaW4gYnRmX293bmVyc2hpcF9kZXB0aCgpLCBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKCksIGFuZCBidGZfb3duZWRfdHlwZV9pZHgoKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS5cbjMuIE5vIGRhdGEgc3RydWN0dXJlcyBvciBidWZmZXJzIGFyZSBjb3BpZWQgdG8gdXNlciBzcGFjZSwgYW5kIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHJlYWQgb3IgdXNlZCBpbiBjb25kaXRpb25hbCBicmFuY2hpbmcuXG40LiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIHBvaW50ZXIgYXJpdGhtZXRpYyBvciBhcnJheSBpbmRleGluZyBpbnRvIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgd291bGQgYmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOLlxuXG5UaGVyZWZvcmUsIHRoaXMgY2hhbmdlIGRvZXMgbm90IGludHJvZHVjZSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IG5lZWRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgQlRGIHZhbGlkYXRpb24gbG9naWMgaW4gdGhlIEJQRiBzdWJzeXN0ZW0gYnkgcmVwbGFjaW5nIHRoZSBncmFwaCByb290IGFjeWNsaWNpdHkgY2hlY2sgd2l0aCBhIG5ldyBvd25lcnNoaXAgZGVwdGggYW5kIGN5Y2xlIGRldGVjdGlvbiBhbGdvcml0aG0gKGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGggYW5kIGJ0Zl9vd25lcnNoaXBfZGVwdGgpIGNvdmVyaW5nIGJvdGggZ3JhcGggcm9vdHMgYW5kIGxvY2FsIGtwdHJzLiBUaGVzZSBjaGFuZ2VzIGFyZSByZWFjaGFibGUgdmlhIHRoZSBCUEZfQlRGX0xPQUQgY29tbWFuZCBpbiB0aGUgYnBmKCkgc3lzdGVtIGNhbGwgYW5kIHdhcnJhbnQgZnV6emluZyB0byB2ZXJpZnkgZ3JhcGggdHJhdmVyc2FsIGNvcnJlY3RuZXNzIGFuZCBib3VuZCBlbmZvcmNlbWVudC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxMjoyNzwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDdiNWI4ZjY3NjU3OTJiMzY4NjAwYWU1YTY0YmZiNzdiZDExYTkyZTlcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU3VuIFNlcCA2IDEyOjI3OjMyIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvYnRmLmMgYi9rZXJuZWwvYnBmL2J0Zi5jXG5pbmRleCA5YzJjYWIwOGJiNzk0Li4zYzUwOGViYjI0Mzg0IDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9idGYuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9idGYuY1xuQEAgLTQyNjksMTMgJiM0Mzs0MjY5LDEwIEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG4ge1xuIFx0aW50IGk7XG4gXG4tXHQvKiBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgdGhhdCBzaWduaWZ5IG93bmVyc2hpcCBvZiBzb21lIG90aGVyIHR5cGU6XG4tXHQgKiAga3B0cl9yZWYsIGJwZl9saXN0X2hlYWQsIGJwZl9yYl9yb290LlxuLVx0ICoga3B0cl9yZWYgb25seSBzdXBwb3J0cyBzdG9yaW5nIGtlcm5lbCB0eXBlcywgd2hpY2ggY2FuJiMzOTt0IHN0b3JlXG4tXHQgKiByZWZlcmVuY2VzIHRvIHByb2dyYW0gYWxsb2NhdGVkIGxvY2FsIHR5cGVzLlxuLVx0ICpcbi1cdCAqIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBlbnN1cmUgdGhhdCBicGZfe2xpc3RfaGVhZCxyYl9yb290fSBvd25lcnNoaXBcbi1cdCAqIGRvZXMgbm90IGZvcm0gY3ljbGVzLlxuJiM0MztcdC8qXG4mIzQzO1x0ICogQ2hlY2sgZmllbGRzIHdoaWNoIHJlcXVpcmUgdGhlIGNvbXBsZXRlIEJURiBhbmQgaW5pdGlhbGl6ZSBydW50aW1lXG4mIzQzO1x0ICogbWV0YWRhdGEuIE93bmVyc2hpcCByZWxhdGlvbnNoaXBzIGFyZSB2YWxpZGF0ZWQgYWZ0ZXIgZXZlcnkgcmVjb3JkIGhhc1xuJiM0MztcdCAqIGJlZW4gZml4ZWQgdXAuXG4gXHQgKi9cbiBcdGlmIChJU19FUlJfT1JfTlVMTChyZWMpIHx8ICEocmVjLVx1MDAzZWZpZWxkX21hc2sgXHUwMDI2IChCUEZfR1JBUEhfUk9PVCB8IEJQRl9VUFRSKSkpXG4gXHRcdHJldHVybiAwO1xuQEAgLTQzMDYsNTEgJiM0Mzs0MzAzLDg4IEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG4gXHRcdGlmICghbWV0YSlcbiBcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcdFx0cmVjLVx1MDAzZWZpZWxkc1tpXS5ncmFwaF9yb290LnZhbHVlX3JlYyA9IG1ldGEtXHUwMDNlcmVjb3JkO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuIFxuLVx0XHQvKiBXZSBuZWVkIHRvIHNldCB2YWx1ZV9yZWMgZm9yIGFsbCByb290IHR5cGVzLCBidXQgbm8gbmVlZFxuLVx0XHQgKiB0byBjaGVjayBvd25lcnNoaXAgY3ljbGUgZm9yIGEgdHlwZSB1bmxlc3MgaXQmIzM5O3MgYWxzbyBhXG4tXHRcdCAqIG5vZGUgdHlwZS5cbi1cdFx0ICovXG4tXHRcdGlmICghKHJlYy1cdTAwM2VmaWVsZF9tYXNrIFx1MDAyNiBCUEZfR1JBUEhfTk9ERSkpXG4mIzQzO3N0YXRpYyBpbnQgYnRmX293bmVkX3R5cGVfaWR4KGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYixcbiYjNDM7XHRcdFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9maWVsZCAqZmllbGQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhICptZXRhO1xuJiM0MztcdHUzMiBidGZfaWQ7XG4mIzQzO1xuJiM0MztcdGlmIChmaWVsZC1cdTAwM2V0eXBlIFx1MDAyNiBCUEZfR1JBUEhfUk9PVCkge1xuJiM0MztcdFx0YnRmX2lkID0gZmllbGQtXHUwMDNlZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XG4mIzQzO1x0fSBlbHNlIGlmIChmaWVsZC1cdTAwM2V0eXBlID09IEJQRl9LUFRSX1JFRiB8fCBmaWVsZC1cdTAwM2V0eXBlID09IEJQRl9LUFRSX1BFUkNQVSkge1xuJiM0MztcdFx0aWYgKGJ0Zl9pc19rZXJuZWwoZmllbGQtXHUwMDNla3B0ci5idGYpKVxuJiM0MztcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHRcdGJ0Zl9pZCA9IGZpZWxkLVx1MDAzZWtwdHIuYnRmX2lkO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XG4mIzQzO1x0aWYgKCFtZXRhKVxuJiM0MztcdFx0cmV0dXJuIGZpZWxkLVx1MDAzZXR5cGUgXHUwMDI2IEJQRl9HUkFQSF9ST09UID8gLUVGQVVMVCA6IC1FTk9FTlQ7XG4mIzQzO1x0cmV0dXJuIG1ldGEgLSB0YWItXHUwMDNldHlwZXM7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEVhY2ggb3duZXJzaGlwIGVkZ2UgYWRkcyBrZXJuZWwgZnJhbWVzIHRocm91Z2ggYnBmX29ial9mcmVlX2ZpZWxkcygpIGFuZFxuJiM0MzsgKiBfX2JwZl9vYmpfZHJvcF9pbXBsKCkuIEtlZXAgdGhlIGJvdW5kIGRlbGliZXJhdGVseSBzbWFsbCBiZWNhdXNlIG9iamVjdFxuJiM0MzsgKiBkZXN0cnVjdGlvbiBjYW4gaXRzZWxmIHJ1biBiZWxvdyBhIEJQRiBjYWxsIGNoYWluLiBBIGZpbmFsIHBvaW50ZWUgd2l0aG91dFxuJiM0MzsgKiBzcGVjaWFsIGZpZWxkcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIGFuZCBhZGRzIG9ubHkgYVxuJiM0MzsgKiBub24tcmVjdXJzaW5nIGRyb3AuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIEJURl9NQVhfT1dORVJTSElQX0RFUFRIIDhcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgYnRmX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4mIzQzO1x0XHRcdCAgICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLCB1OCAqZGVwdGgsXG4mIzQzO1x0XHRcdCAgICAgICBpbnQgaWR4LCBpbnQgZGVwdGhfbGVmdClcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMgPSB0YWItXHUwMDNldHlwZXNbaWR4XS5yZWNvcmQ7XG4mIzQzO1x0aW50IGksIHJldCwgbWF4X2RlcHRoID0gMDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFkZXB0aF9sZWZ0KVxuJiM0MztcdFx0cmV0dXJuIC1FTE9PUDtcbiYjNDM7XHRpZiAoZGVwdGhbaWR4XSlcbiYjNDM7XHRcdGdvdG8gZG9uZTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgcmVjLVx1MDAzZWNudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHJldCA9IGJ0Zl9vd25lZF90eXBlX2lkeChidGYsIHRhYiwgXHUwMDI2cmVjLVx1MDAzZWZpZWxkc1tpXSk7XG4mIzQzO1x0XHRpZiAocmV0ID09IC1FTk9FTlQpXG4gXHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIHJldCwgZGVwdGhfbGVmdCAtIDEpO1xuJiM0MztcdFx0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRcdG1heF9kZXB0aCA9IG1heChtYXhfZGVwdGgsIHJldCk7XG4mIzQzO1x0fVxuJiM0MztcdGRlcHRoW2lkeF0gPSBtYXhfZGVwdGggJiM0MzsgMTtcbiYjNDM7ZG9uZTpcbiYjNDM7XHRyZXR1cm4gZGVwdGhbaWR4XSBcdTAwM2UgZGVwdGhfbGVmdCA/IC1FTE9PUCA6IGRlcHRoW2lkeF07XG4mIzQzO31cbiBcbi1cdFx0LyogV2UgbmVlZCB0byBlbnN1cmUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW1vbmcgYWxsIHR5cGVzLiBUaGVcbi1cdFx0ICogcHJvcGVyIHdheSB0byBkbyBpdCB3b3VsZCBiZSB0byB0b3BvbG9naWNhbGx5IHNvcnQgYWxsIEJURlxuLVx0XHQgKiBJRHMgYmFzZWQgb24gdGhlIG93bmVyc2hpcCBlZGdlcywgc2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlXG4tXHRcdCAqIGJwZl97bGlzdF9oZWFkLHJiX25vZGV9IGluIGEgdHlwZS4gSW5zdGVhZCwgd2UgdXNlIHRoZVxuLVx0XHQgKiBmb2xsb3dpbmcgcmVzYW9uaW5nOlxuLVx0XHQgKlxuLVx0XHQgKiAtIEEgdHlwZSBjYW4gb25seSBiZSBvd25lZCBieSBhbm90aGVyIHR5cGUgaW4gdXNlciBCVEYgaWYgaXRcbi1cdFx0ICogICBoYXMgYSBicGZfe2xpc3QscmJ9X25vZGUuIExldCYjMzk7cyBjYWxsIHRoZXNlIG5vZGUgdHlwZXMuXG4tXHRcdCAqIC0gQSB0eXBlIGNhbiBvbmx5IF9vd25fIGFub3RoZXIgdHlwZSBpbiB1c2VyIEJURiBpZiBpdCBoYXMgYVxuLVx0XHQgKiAgIGJwZl97bGlzdF9oZWFkLHJiX3Jvb3R9LiBMZXQmIzM5O3MgY2FsbCB0aGVzZSByb290IHR5cGVzLlxuLVx0XHQgKlxuLVx0XHQgKiBXZSBlbnN1cmUgdGhhdCBpZiBhIHR5cGUgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIGl0c1xuLVx0XHQgKiBlbGVtZW50IHR5cGVzIGNhbm5vdCBiZSByb290IHR5cGVzLlxuLVx0XHQgKlxuLVx0XHQgKiBUbyBlbnN1cmUgYWN5Y2xpY2l0eTpcbi1cdFx0ICpcbi1cdFx0ICogV2hlbiBBIGlzIGFuIHJvb3QgdHlwZSBidXQgbm90IGEgbm9kZSwgaXRzIG93bmVyc2hpcFxuLVx0XHQgKiBjaGFpbiBjYW4gYmU6XG4tXHRcdCAqXHRBIC1cdTAwM2UgQiAtXHUwMDNlIENcbi1cdFx0ICogV2hlcmU6XG4tXHRcdCAqIC0gQSBpcyBhbiByb290LCBlLmcuIGhhcyBicGZfcmJfcm9vdC5cbi1cdFx0ICogLSBCIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBlLmcuIGhhcyBicGZfcmJfbm9kZSBhbmRcbi1cdFx0ICogICBicGZfbGlzdF9oZWFkLlxuLVx0XHQgKiAtIEMgaXMgb25seSBhbiByb290LCBlLmcuIGhhcyBicGZfbGlzdF9ub2RlXG4tXHRcdCAqXG4tXHRcdCAqIFdoZW4gQSBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgc29tZSBvdGhlciB0eXBlIGFscmVhZHlcbi1cdFx0ICogb3ducyBpdCBpbiB0aGUgQlRGIGRvbWFpbiwgaGVuY2UgaXQgY2FuIG5vdCBvd25cbi1cdFx0ICogYW5vdGhlciByb290IHR5cGUgdGhyb3VnaCBhbnkgb2YgdGhlIG93bmVyc2hpcCBlZGdlcy5cbi1cdFx0ICpcdEEgLVx1MDAzZSBCXG4tXHRcdCAqIFdoZXJlOlxuLVx0XHQgKiAtIEEgaXMgYm90aCBhbiByb290IGFuZCBub2RlLlxuLVx0XHQgKiAtIEIgaXMgb25seSBhbiBub2RlLlxuLVx0XHQgKi9cbi1cdFx0aWYgKG1ldGEtXHUwMDNlcmVjb3JkLVx1MDAzZWZpZWxkX21hc2sgXHUwMDI2IEJQRl9HUkFQSF9ST09UKVxuLVx0XHRcdHJldHVybiAtRUxPT1A7XG4mIzQzO3N0YXRpYyBpbnQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4mIzQzO1x0XHRcdFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxuJiM0Mzt7XG4mIzQzO1x0dTggKmRlcHRoO1xuJiM0MztcdGludCBpLCByZXQgPSAwO1xuJiM0MztcbiYjNDM7XHRkZXB0aCA9IGt2Y2FsbG9jKHRhYi1cdTAwM2VjbnQsIHNpemVvZigqZGVwdGgpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTtcbiYjNDM7XHRpZiAoIWRlcHRoKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRhYi1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgaSxcbiYjNDM7XHRcdFx0XHRcdCAgQlRGX01BWF9PV05FUlNISVBfREVQVEgpO1xuJiM0MztcdFx0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRyZXQgPSAwO1xuIFx0fVxuLVx0cmV0dXJuIDA7XG4mIzQzO1x0a3ZmcmVlKGRlcHRoKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBfX2J0Zl9zdHJ1Y3Rfc2hvdyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbkBAIC02MDQ1LDYgJiM0Mzs2MDc5LDEwIEBAIHN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2UoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLFxuIFx0XHRcdGlmIChlcnIgXHUwMDNjIDApXG4gXHRcdFx0XHRnb3RvIGVycm91dF9tZXRhO1xuIFx0XHR9XG4mIzQzO1xuJiM0MztcdFx0ZXJyID0gYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChidGYsIHN0cnVjdF9tZXRhX3RhYik7XG4mIzQzO1x0XHRpZiAoZXJyIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRnb3RvIGVycm91dF9tZXRhO1xuIFx0fVxuIFxuIFx0ZXJyID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcdTAwMjZlbnYtXHUwMDNlbG9nKTtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuY1xuaW5kZXggYzNkMTMzYzZhMDBkNC4uNTJmYWJiZWUzZGQ1YSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcbkBAIC03MTQsNyAmIzQzOzcxNCw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfYnRmKHZvaWQpXG4gXHRcdFx0YnJlYWs7XG4gXG4gXHRcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuLVx0XHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFwmIzM0O2NoZWNrIGJ0ZlwmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfRVEoZXJyLCAwLCBcJiMzNDtjaGVjayBidGZcJiMzNDspO1xuIFx0XHRidGZfX2ZyZWUoYnRmKTtcbiBcdFx0YnJlYWs7XG4gXHR9XG5AQCAtNzczLDcgJiM0Mzs3NzMsNyBAQCBzdGF0aWMgdm9pZCB0ZXN0X2J0Zih2b2lkKVxuIFx0XHRcdGJyZWFrO1xuIFxuIFx0XHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbi1cdFx0QVNTRVJUX0VRKGVyciwgLUVMT09QLCBcJiMzNDtjaGVjayBidGZcJiMzNDspO1xuJiM0MztcdFx0QVNTRVJUX0VRKGVyciwgMCwgXCYjMzQ7Y2hlY2sgYnRmXCYjMzQ7KTtcbiBcdFx0YnRmX19mcmVlKGJ0Zik7XG4gXHRcdGJyZWFrO1xuIFx0fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uODM2NzQxNTVlM2I3NFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuY1xuQEAgLTAsMCAmIzQzOzEsMjAyIEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9idGYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU1BJTl9MT0NLIDJcbiYjNDM7I2RlZmluZSBMSVNUX0hFQUQgM1xuJiM0MzsjZGVmaW5lIExJU1RfTk9ERSA0XG4mIzQzOy8qIEtlZXAgaW4gc3luYyB3aXRoIEJURl9NQVhfT1dORVJTSElQX0RFUFRILiAqL1xuJiM0MzsjZGVmaW5lIE1BWF9PV05FUlNISVBfREVQVEggOFxuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBidGYgKmluaXRfYnRmKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnRmICpidGY7XG4mIzQzO1x0aW50IGlkO1xuJiM0MztcbiYjNDM7XHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwmIzM0O2J0Zl9fbmV3X2VtcHR5XCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdGlkID0gYnRmX19hZGRfaW50KGJ0ZiwgXCYjMzQ7aW50XCYjMzQ7LCA0LCBCVEZfSU5UX1NJR05FRCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoaWQsIDEsIFwmIzM0O2J0Zl9fYWRkX2ludFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGVycl9vdXQ7XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcJiMzNDticGZfc3Bpbl9sb2NrXCYjMzQ7LCA0KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShpZCwgU1BJTl9MT0NLLCBcJiMzNDtidGZfX2FkZF9zdHJ1Y3QgYnBmX3NwaW5fbG9ja1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGVycl9vdXQ7XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcJiMzNDticGZfbGlzdF9oZWFkXCYjMzQ7LCAxNik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfSEVBRCwgXCYjMzQ7YnRmX19hZGRfc3RydWN0IGJwZl9saXN0X2hlYWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBlcnJfb3V0O1xuJiM0MztcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCYjMzQ7YnBmX2xpc3Rfbm9kZVwmIzM0OywgMjQpO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKGlkLCBMSVNUX05PREUsIFwmIzM0O2J0Zl9fYWRkX3N0cnVjdCBicGZfbGlzdF9ub2RlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZXJyX291dDtcbiYjNDM7XHRyZXR1cm4gYnRmO1xuJiM0MztcbiYjNDM7ZXJyX291dDpcbiYjNDM7XHRidGZfX2ZyZWUoYnRmKTtcbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBhZGRfbG9jYWxfa3B0cihzdHJ1Y3QgYnRmICpidGYsIGludCBwb2ludGVlX2lkLCBjb25zdCBjaGFyICp0YWcpXG4mIzQzO3tcbiYjNDM7XHRpbnQgaWQ7XG4mIzQzO1xuJiM0MztcdGlkID0gYnRmX19hZGRfdHlwZV90YWcoYnRmLCB0YWcsIHBvaW50ZWVfaWQpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKGlkLCAwLCBcJiMzNDtidGZfX2FkZF90eXBlX3RhZ1wmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gaWQ7XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9wdHIoYnRmLCBpZCk7XG4mIzQzO1x0QVNTRVJUX0dUKGlkLCAwLCBcJiMzNDtidGZfX2FkZF9wdHJcJiMzNDspO1xuJiM0MztcdHJldHVybiBpZDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9zZWxmX2N5Y2xlKGNvbnN0IGNoYXIgKnRhZywgaW50IGV4cGVjdGVkX2VycilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBidGYgKmJ0ZjtcbiYjNDM7XHRpbnQgaWQsIGVycjtcbiYjNDM7XG4mIzQzO1x0YnRmID0gaW5pdF9idGYoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcJiMzNDtpbml0X2J0ZlwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDcsIHRhZyk7XG4mIzQzO1x0aWYgKGlkIFx1MDAzYz0gMClcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCYjMzQ7c2VsZl9jeWNsZVwmIzM0OywgOCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoaWQsIDcsIFwmIzM0O2J0Zl9fYWRkX3N0cnVjdCBzZWxmX2N5Y2xlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCYjMzQ7bmV4dFwmIzM0OywgNiwgMCwgMCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtidGZfX2FkZF9maWVsZCBzZWxmX2N5Y2xlOjpuZXh0XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbiYjNDM7XHRBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsIFwmIzM0O2NoZWNrIGJ0ZlwmIzM0Oyk7XG4mIzQzO291dDpcbiYjNDM7XHRidGZfX2ZyZWUoYnRmKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9hYmFfY3ljbGUodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBidGYgKmJ0ZjtcbiYjNDM7XHRpbnQgaWQsIGVycjtcbiYjNDM7XG4mIzQzO1x0YnRmID0gaW5pdF9idGYoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcJiMzNDtpbml0X2J0ZlwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDEwLCBcJiMzNDtrcHRyXCYjMzQ7KTtcbiYjNDM7XHRpZiAoaWQgXHUwMDNjPSAwKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDksIFwmIzM0O2twdHJcJiMzNDspO1xuJiM0MztcdGlmIChpZCBcdTAwM2M9IDApXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwmIzM0O2N5Y2xlX2FcJiMzNDssIDgpO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKGlkLCA5LCBcJiMzNDtidGZfX2FkZF9zdHJ1Y3QgY3ljbGVfYVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwmIzM0O2JcJiMzNDssIDYsIDAsIDApO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnRmX19hZGRfZmllbGQgY3ljbGVfYTo6YlwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwmIzM0O2N5Y2xlX2JcJiMzNDssIDgpO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKGlkLCAxMCwgXCYjMzQ7YnRmX19hZGRfc3RydWN0IGN5Y2xlX2JcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDthXCYjMzQ7LCA4LCAwLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2J0Zl9fYWRkX2ZpZWxkIGN5Y2xlX2I6OmFcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuJiM0MztcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXCYjMzQ7Y2hlY2sgYnRmXCYjMzQ7KTtcbiYjNDM7b3V0OlxuJiM0MztcdGJ0Zl9fZnJlZShidGYpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X21peGVkX2N5Y2xlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnRmICpidGY7XG4mIzQzO1x0aW50IGlkLCBlcnI7XG4mIzQzO1xuJiM0MztcdGJ0ZiA9IGluaXRfYnRmKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCYjMzQ7aW5pdF9idGZcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA3LCBcJiMzNDtrcHRyXCYjMzQ7KTtcbiYjNDM7XHRpZiAoaWQgXHUwMDNjPSAwKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcJiMzNDttaXhlZF9vd25lclwmIzM0OywgMjApO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKGlkLCA3LCBcJiMzNDtidGZfX2FkZF9zdHJ1Y3QgbWl4ZWRfb3duZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDtyb290XCYjMzQ7LCBMSVNUX0hFQUQsIDAsIDApO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnRmX19hZGRfZmllbGQgbWl4ZWRfb3duZXI6OnJvb3RcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDtsb2NrXCYjMzQ7LCBTUElOX0xPQ0ssIDEyOCwgMCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtidGZfX2FkZF9maWVsZCBtaXhlZF9vd25lcjo6bG9ja1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZCA9IGJ0Zl9fYWRkX2RlY2xfdGFnKGJ0ZiwgXCYjMzQ7Y29udGFpbnM6bWl4ZWRfbm9kZTpub2RlXCYjMzQ7LCA3LCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShpZCwgOCwgXCYjMzQ7YnRmX19hZGRfZGVjbF90YWcgbWl4ZWRfb3duZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcJiMzNDttaXhlZF9ub2RlXCYjMzQ7LCAzMik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoaWQsIDksIFwmIzM0O2J0Zl9fYWRkX3N0cnVjdCBtaXhlZF9ub2RlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCYjMzQ7bm9kZVwmIzM0OywgTElTVF9OT0RFLCAwLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX25vZGU6Om5vZGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcJiMzNDtvd25lclwmIzM0OywgNiwgMTkyLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX25vZGU6Om93bmVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbiYjNDM7XHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFwmIzM0O2NoZWNrIGJ0ZlwmIzM0Oyk7XG4mIzQzO291dDpcbiYjNDM7XHRidGZfX2ZyZWUoYnRmKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9hY3ljbGljX2RlcHRoKGludCBkZXB0aCwgaW50IGV4cGVjdGVkX2VycilcbiYjNDM7e1xuJiM0MztcdGludCBwdHJfaWRbTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxXTtcbiYjNDM7XHRpbnQgZmlyc3Rfc3RydWN0X2lkO1xuJiM0MztcdHN0cnVjdCBidGYgKmJ0ZjtcbiYjNDM7XHRpbnQgaWQsIGVyciwgaTtcbiYjNDM7XG4mIzQzO1x0YnRmID0gaW5pdF9idGYoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcJiMzNDtpbml0X2J0ZlwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0Zmlyc3Rfc3RydWN0X2lkID0gNSAmIzQzOyAyICogZGVwdGg7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgZGVwdGg7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRwdHJfaWRbaV0gPSBhZGRfbG9jYWxfa3B0cihidGYsIGZpcnN0X3N0cnVjdF9pZCAmIzQzOyBpICYjNDM7IDEsIFwmIzM0O2twdHJcJiMzNDspO1xuJiM0MztcdFx0aWYgKHB0cl9pZFtpXSBcdTAwM2M9IDApXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkZXB0aDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGNoYXIgbmFtZVsxNl07XG4mIzQzO1xuJiM0MztcdFx0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcJiMzNDtvd25lcl8lZFwmIzM0OywgaSk7XG4mIzQzO1x0XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIDgpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfRVEoaWQsIGZpcnN0X3N0cnVjdF9pZCAmIzQzOyBpLCBcJiMzNDtidGZfX2FkZF9zdHJ1Y3Qgb3duZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCYjMzQ7bmV4dFwmIzM0OywgcHRyX2lkW2ldLCAwLCAwKTtcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnRmX19hZGRfZmllbGQgb3duZXI6Om5leHRcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcJiMzNDtwbGFpbl9sZWFmXCYjMzQ7LCA0KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShpZCwgZmlyc3Rfc3RydWN0X2lkICYjNDM7IGRlcHRoLCBcJiMzNDtidGZfX2FkZF9zdHJ1Y3QgcGxhaW5fbGVhZlwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XG4mIzQzO1x0QVNTRVJUX0VRKGVyciwgZXhwZWN0ZWRfZXJyLCBcJiMzNDtjaGVjayBidGZcJiMzNDspO1xuJiM0MztvdXQ6XG4mIzQzO1x0YnRmX19mcmVlKGJ0Zik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9sb2NhbF9rcHRyX293bmVyc2hpcCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7c2VsZl9jeWNsZVwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3NlbGZfY3ljbGUoXCYjMzQ7a3B0clwmIzM0OywgLUVMT09QKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt1bnRydXN0ZWRfc2VsZl9jeWNsZVwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3NlbGZfY3ljbGUoXCYjMzQ7a3B0cl91bnRydXN0ZWRcJiMzNDssIDApO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3BlcmNwdV9zZWxmX2N5Y2xlXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfc2VsZl9jeWNsZShcJiMzNDtwZXJjcHVfa3B0clwmIzM0OywgLUVMT09QKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtBQkFfY3ljbGVcJiMzNDspKVxuJiM0MztcdFx0dGVzdF9hYmFfY3ljbGUoKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDttaXhlZF9ncmFwaF9yb290X2N5Y2xlXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfbWl4ZWRfY3ljbGUoKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDttYXhfYWN5Y2xpY1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCwgMCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7dG9vX2RlZXBfYWN5Y2xpY1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxLCAtRUxPT1ApO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjc8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoJiMzNDssCiAgICAmIzM0O2J0Zl9vd25lcnNoaXBfZGVwdGgmIzM0OywKICAgICYjMzQ7YnRmX293bmVkX3R5cGVfaWR4JiMzNDssCiAgICAmIzM0O2J0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzJiMzNDssCiAgICAmIzM0O2J0Zl9wYXJzZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBCVEYgdmFsaWRhdGlvbiBsb2dpYyBpbiB0aGUgQlBGIHN1YnN5c3RlbSBieSByZXBsYWNpbmcgdGhlIGdyYXBoIHJvb3QgYWN5Y2xpY2l0eSBjaGVjayB3aXRoIGEgbmV3IG93bmVyc2hpcCBkZXB0aCBhbmQgY3ljbGUgZGV0ZWN0aW9uIGFsZ29yaXRobSAoYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCBhbmQgYnRmX293bmVyc2hpcF9kZXB0aCkgY292ZXJpbmcgYm90aCBncmFwaCByb290cyBhbmQgbG9jYWwga3B0cnMuIFRoZXNlIGNoYW5nZXMgYXJlIHJlYWNoYWJsZSB2aWEgdGhlIEJQRl9CVEZfTE9BRCBjb21tYW5kIGluIHRoZSBicGYoKSBzeXN0ZW0gY2FsbCBhbmQgd2FycmFudCBmdXp6aW5nIHRvIHZlcmlmeSBncmFwaCB0cmF2ZXJzYWwgY29ycmVjdG5lc3MgYW5kIGJvdW5kIGVuZm9yY2VtZW50LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgN2I1YjhmNjc2NTc5MmIzNjg2MDBhZTVhNjRiZmI3N2JkMTFhOTJlOQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTdW4gU2VwIDYgMTI6Mjc6MzIgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2J0Zi5jIGIva2VybmVsL2JwZi9idGYuYwppbmRleCA5YzJjYWIwOGJiNzk0Li4zYzUwOGViYjI0Mzg0IDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL2J0Zi5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYvYnRmLmMKQEAgLTQyNjksMTMgJiM0Mzs0MjY5LDEwIEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpCiB7CiAJaW50IGk7CiAKLQkvKiBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgdGhhdCBzaWduaWZ5IG93bmVyc2hpcCBvZiBzb21lIG90aGVyIHR5cGU6Ci0JICogIGtwdHJfcmVmLCBicGZfbGlzdF9oZWFkLCBicGZfcmJfcm9vdC4KLQkgKiBrcHRyX3JlZiBvbmx5IHN1cHBvcnRzIHN0b3Jpbmcga2VybmVsIHR5cGVzLCB3aGljaCBjYW4mIzM5O3Qgc3RvcmUKLQkgKiByZWZlcmVuY2VzIHRvIHByb2dyYW0gYWxsb2NhdGVkIGxvY2FsIHR5cGVzLgotCSAqCi0JICogSGVuY2Ugd2Ugb25seSBuZWVkIHRvIGVuc3VyZSB0aGF0IGJwZl97bGlzdF9oZWFkLHJiX3Jvb3R9IG93bmVyc2hpcAotCSAqIGRvZXMgbm90IGZvcm0gY3ljbGVzLgomIzQzOwkvKgomIzQzOwkgKiBDaGVjayBmaWVsZHMgd2hpY2ggcmVxdWlyZSB0aGUgY29tcGxldGUgQlRGIGFuZCBpbml0aWFsaXplIHJ1bnRpbWUKJiM0MzsJICogbWV0YWRhdGEuIE93bmVyc2hpcCByZWxhdGlvbnNoaXBzIGFyZSB2YWxpZGF0ZWQgYWZ0ZXIgZXZlcnkgcmVjb3JkIGhhcwomIzQzOwkgKiBiZWVuIGZpeGVkIHVwLgogCSAqLwogCWlmIChJU19FUlJfT1JfTlVMTChyZWMpIHx8ICEocmVjLSZndDtmaWVsZF9tYXNrICZhbXA7IChCUEZfR1JBUEhfUk9PVCB8IEJQRl9VUFRSKSkpCiAJCXJldHVybiAwOwpAQCAtNDMwNiw1MSAmIzQzOzQzMDMsODggQEAgaW50IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYykKIAkJaWYgKCFtZXRhKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXJlYy0mZ3Q7ZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfcmVjID0gbWV0YS0mZ3Q7cmVjb3JkOwomIzQzOwl9CiYjNDM7CXJldHVybiAwOwomIzQzO30KIAotCQkvKiBXZSBuZWVkIHRvIHNldCB2YWx1ZV9yZWMgZm9yIGFsbCByb290IHR5cGVzLCBidXQgbm8gbmVlZAotCQkgKiB0byBjaGVjayBvd25lcnNoaXAgY3ljbGUgZm9yIGEgdHlwZSB1bmxlc3MgaXQmIzM5O3MgYWxzbyBhCi0JCSAqIG5vZGUgdHlwZS4KLQkJICovCi0JCWlmICghKHJlYy0mZ3Q7ZmllbGRfbWFzayAmYW1wOyBCUEZfR1JBUEhfTk9ERSkpCiYjNDM7c3RhdGljIGludCBidGZfb3duZWRfdHlwZV9pZHgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLAomIzQzOwkJCSAgICAgIGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqbWV0YTsKJiM0MzsJdTMyIGJ0Zl9pZDsKJiM0MzsKJiM0MzsJaWYgKGZpZWxkLSZndDt0eXBlICZhbXA7IEJQRl9HUkFQSF9ST09UKSB7CiYjNDM7CQlidGZfaWQgPSBmaWVsZC0mZ3Q7Z3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7CiYjNDM7CX0gZWxzZSBpZiAoZmllbGQtJmd0O3R5cGUgPT0gQlBGX0tQVFJfUkVGIHx8IGZpZWxkLSZndDt0eXBlID09IEJQRl9LUFRSX1BFUkNQVSkgewomIzQzOwkJaWYgKGJ0Zl9pc19rZXJuZWwoZmllbGQtJmd0O2twdHIuYnRmKSkKJiM0MzsJCQlyZXR1cm4gLUVOT0VOVDsKJiM0MzsJCWJ0Zl9pZCA9IGZpZWxkLSZndDtrcHRyLmJ0Zl9pZDsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXJldHVybiAtRU5PRU5UOwomIzQzOwl9CiYjNDM7CiYjNDM7CW1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7CiYjNDM7CWlmICghbWV0YSkKJiM0MzsJCXJldHVybiBmaWVsZC0mZ3Q7dHlwZSAmYW1wOyBCUEZfR1JBUEhfUk9PVCA/IC1FRkFVTFQgOiAtRU5PRU5UOwomIzQzOwlyZXR1cm4gbWV0YSAtIHRhYi0mZ3Q7dHlwZXM7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogRWFjaCBvd25lcnNoaXAgZWRnZSBhZGRzIGtlcm5lbCBmcmFtZXMgdGhyb3VnaCBicGZfb2JqX2ZyZWVfZmllbGRzKCkgYW5kCiYjNDM7ICogX19icGZfb2JqX2Ryb3BfaW1wbCgpLiBLZWVwIHRoZSBib3VuZCBkZWxpYmVyYXRlbHkgc21hbGwgYmVjYXVzZSBvYmplY3QKJiM0MzsgKiBkZXN0cnVjdGlvbiBjYW4gaXRzZWxmIHJ1biBiZWxvdyBhIEJQRiBjYWxsIGNoYWluLiBBIGZpbmFsIHBvaW50ZWUgd2l0aG91dAomIzQzOyAqIHNwZWNpYWwgZmllbGRzIGlzIG5vdCBwcmVzZW50IGluIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgYW5kIGFkZHMgb25seSBhCiYjNDM7ICogbm9uLXJlY3Vyc2luZyBkcm9wLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgQlRGX01BWF9PV05FUlNISVBfREVQVEggOAomIzQzOwomIzQzO3N0YXRpYyBpbnQgYnRmX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsCiYjNDM7CQkJICAgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsIHU4ICpkZXB0aCwKJiM0MzsJCQkgICAgICAgaW50IGlkeCwgaW50IGRlcHRoX2xlZnQpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjID0gdGFiLSZndDt0eXBlc1tpZHhdLnJlY29yZDsKJiM0MzsJaW50IGksIHJldCwgbWF4X2RlcHRoID0gMDsKJiM0MzsKJiM0MzsJaWYgKCFkZXB0aF9sZWZ0KQomIzQzOwkJcmV0dXJuIC1FTE9PUDsKJiM0MzsJaWYgKGRlcHRoW2lkeF0pCiYjNDM7CQlnb3RvIGRvbmU7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyByZWMtJmd0O2NudDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXJldCA9IGJ0Zl9vd25lZF90eXBlX2lkeChidGYsIHRhYiwgJmFtcDtyZWMtJmd0O2ZpZWxkc1tpXSk7CiYjNDM7CQlpZiAocmV0ID09IC1FTk9FTlQpCiAJCQljb250aW51ZTsKJiM0MzsJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CQlyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgcmV0LCBkZXB0aF9sZWZ0IC0gMSk7CiYjNDM7CQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwkJbWF4X2RlcHRoID0gbWF4KG1heF9kZXB0aCwgcmV0KTsKJiM0MzsJfQomIzQzOwlkZXB0aFtpZHhdID0gbWF4X2RlcHRoICYjNDM7IDE7CiYjNDM7ZG9uZToKJiM0MzsJcmV0dXJuIGRlcHRoW2lkeF0gJmd0OyBkZXB0aF9sZWZ0ID8gLUVMT09QIDogZGVwdGhbaWR4XTsKJiM0Mzt9CiAKLQkJLyogV2UgbmVlZCB0byBlbnN1cmUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW1vbmcgYWxsIHR5cGVzLiBUaGUKLQkJICogcHJvcGVyIHdheSB0byBkbyBpdCB3b3VsZCBiZSB0byB0b3BvbG9naWNhbGx5IHNvcnQgYWxsIEJURgotCQkgKiBJRHMgYmFzZWQgb24gdGhlIG93bmVyc2hpcCBlZGdlcywgc2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlCi0JCSAqIGJwZl97bGlzdF9oZWFkLHJiX25vZGV9IGluIGEgdHlwZS4gSW5zdGVhZCwgd2UgdXNlIHRoZQotCQkgKiBmb2xsb3dpbmcgcmVzYW9uaW5nOgotCQkgKgotCQkgKiAtIEEgdHlwZSBjYW4gb25seSBiZSBvd25lZCBieSBhbm90aGVyIHR5cGUgaW4gdXNlciBCVEYgaWYgaXQKLQkJICogICBoYXMgYSBicGZfe2xpc3QscmJ9X25vZGUuIExldCYjMzk7cyBjYWxsIHRoZXNlIG5vZGUgdHlwZXMuCi0JCSAqIC0gQSB0eXBlIGNhbiBvbmx5IF9vd25fIGFub3RoZXIgdHlwZSBpbiB1c2VyIEJURiBpZiBpdCBoYXMgYQotCQkgKiAgIGJwZl97bGlzdF9oZWFkLHJiX3Jvb3R9LiBMZXQmIzM5O3MgY2FsbCB0aGVzZSByb290IHR5cGVzLgotCQkgKgotCQkgKiBXZSBlbnN1cmUgdGhhdCBpZiBhIHR5cGUgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIGl0cwotCQkgKiBlbGVtZW50IHR5cGVzIGNhbm5vdCBiZSByb290IHR5cGVzLgotCQkgKgotCQkgKiBUbyBlbnN1cmUgYWN5Y2xpY2l0eToKLQkJICoKLQkJICogV2hlbiBBIGlzIGFuIHJvb3QgdHlwZSBidXQgbm90IGEgbm9kZSwgaXRzIG93bmVyc2hpcAotCQkgKiBjaGFpbiBjYW4gYmU6Ci0JCSAqCUEgLSZndDsgQiAtJmd0OyBDCi0JCSAqIFdoZXJlOgotCQkgKiAtIEEgaXMgYW4gcm9vdCwgZS5nLiBoYXMgYnBmX3JiX3Jvb3QuCi0JCSAqIC0gQiBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgZS5nLiBoYXMgYnBmX3JiX25vZGUgYW5kCi0JCSAqICAgYnBmX2xpc3RfaGVhZC4KLQkJICogLSBDIGlzIG9ubHkgYW4gcm9vdCwgZS5nLiBoYXMgYnBmX2xpc3Rfbm9kZQotCQkgKgotCQkgKiBXaGVuIEEgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIHNvbWUgb3RoZXIgdHlwZSBhbHJlYWR5Ci0JCSAqIG93bnMgaXQgaW4gdGhlIEJURiBkb21haW4sIGhlbmNlIGl0IGNhbiBub3Qgb3duCi0JCSAqIGFub3RoZXIgcm9vdCB0eXBlIHRocm91Z2ggYW55IG9mIHRoZSBvd25lcnNoaXAgZWRnZXMuCi0JCSAqCUEgLSZndDsgQgotCQkgKiBXaGVyZToKLQkJICogLSBBIGlzIGJvdGggYW4gcm9vdCBhbmQgbm9kZS4KLQkJICogLSBCIGlzIG9ubHkgYW4gbm9kZS4KLQkJICovCi0JCWlmIChtZXRhLSZndDtyZWNvcmQtJmd0O2ZpZWxkX21hc2sgJmFtcDsgQlBGX0dSQVBIX1JPT1QpCi0JCQlyZXR1cm4gLUVMT09QOwomIzQzO3N0YXRpYyBpbnQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsCiYjNDM7CQkJCSAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYikKJiM0Mzt7CiYjNDM7CXU4ICpkZXB0aDsKJiM0MzsJaW50IGksIHJldCA9IDA7CiYjNDM7CiYjNDM7CWRlcHRoID0ga3ZjYWxsb2ModGFiLSZndDtjbnQsIHNpemVvZigqZGVwdGgpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTsKJiM0MzsJaWYgKCFkZXB0aCkKJiM0MzsJCXJldHVybiAtRU5PTUVNOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgdGFiLSZndDtjbnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgaSwKJiM0MzsJCQkJCSAgQlRGX01BWF9PV05FUlNISVBfREVQVEgpOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlyZXQgPSAwOwogCX0KLQlyZXR1cm4gMDsKJiM0MzsJa3ZmcmVlKGRlcHRoKTsKJiM0MzsJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19idGZfc3RydWN0X3Nob3coY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsCkBAIC02MDQ1LDYgJiM0Mzs2MDc5LDEwIEBAIHN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2UoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLAogCQkJaWYgKGVyciAmbHQ7IDApCiAJCQkJZ290byBlcnJvdXRfbWV0YTsKIAkJfQomIzQzOwomIzQzOwkJZXJyID0gYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChidGYsIHN0cnVjdF9tZXRhX3RhYik7CiYjNDM7CQlpZiAoZXJyICZsdDsgMCkKJiM0MzsJCQlnb3RvIGVycm91dF9tZXRhOwogCX0KIAogCWVyciA9IGJwZl9sb2dfYXR0cl9maW5hbGl6ZShhdHRyX2xvZywgJmFtcDtlbnYtJmd0O2xvZyk7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuYwppbmRleCBjM2QxMzNjNmEwMGQ0Li41MmZhYmJlZTNkZDVhIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmMKQEAgLTcxNCw3ICYjNDM7NzE0LDcgQEAgc3RhdGljIHZvaWQgdGVzdF9idGYodm9pZCkKIAkJCWJyZWFrOwogCiAJCWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwotCQlBU1NFUlRfRVEoZXJyLCAtRUxPT1AsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzOwkJQVNTRVJUX0VRKGVyciwgMCwgJiMzNDtjaGVjayBidGYmIzM0Oyk7CiAJCWJ0Zl9fZnJlZShidGYpOwogCQlicmVhazsKIAl9CkBAIC03NzMsNyAmIzQzOzc3Myw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfYnRmKHZvaWQpCiAJCQlicmVhazsKIAogCQllcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTsKLQkJQVNTRVJUX0VRKGVyciwgLUVMT09QLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9FUShlcnIsIDAsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwogCQlidGZfX2ZyZWUoYnRmKTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uODM2NzQxNTVlM2I3NAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmMKQEAgLTAsMCAmIzQzOzEsMjAyIEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9idGYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnRmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3Rlc3RfcHJvZ3MuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIFNQSU5fTE9DSyAyCiYjNDM7I2RlZmluZSBMSVNUX0hFQUQgMwomIzQzOyNkZWZpbmUgTElTVF9OT0RFIDQKJiM0MzsvKiBLZWVwIGluIHN5bmMgd2l0aCBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSC4gKi8KJiM0MzsjZGVmaW5lIE1BWF9PV05FUlNISVBfREVQVEggOAomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYnRmICppbml0X2J0Zih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJ0ZiAqYnRmOwomIzQzOwlpbnQgaWQ7CiYjNDM7CiYjNDM7CWJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7YnRmX19uZXdfZW1wdHkmIzM0OykpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJaWQgPSBidGZfX2FkZF9pbnQoYnRmLCAmIzM0O2ludCYjMzQ7LCA0LCBCVEZfSU5UX1NJR05FRCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCAxLCAmIzM0O2J0Zl9fYWRkX2ludCYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyX291dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O2JwZl9zcGluX2xvY2smIzM0OywgNCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCBTUElOX0xPQ0ssICYjMzQ7YnRmX19hZGRfc3RydWN0IGJwZl9zcGluX2xvY2smIzM0OykpCiYjNDM7CQlnb3RvIGVycl9vdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDticGZfbGlzdF9oZWFkJiMzNDssIDE2KTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfSEVBRCwgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgYnBmX2xpc3RfaGVhZCYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyX291dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O2JwZl9saXN0X25vZGUmIzM0OywgMjQpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgTElTVF9OT0RFLCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBicGZfbGlzdF9ub2RlJiMzNDspKQomIzQzOwkJZ290byBlcnJfb3V0OwomIzQzOwlyZXR1cm4gYnRmOwomIzQzOwomIzQzO2Vycl9vdXQ6CiYjNDM7CWJ0Zl9fZnJlZShidGYpOwomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBhZGRfbG9jYWxfa3B0cihzdHJ1Y3QgYnRmICpidGYsIGludCBwb2ludGVlX2lkLCBjb25zdCBjaGFyICp0YWcpCiYjNDM7ewomIzQzOwlpbnQgaWQ7CiYjNDM7CiYjNDM7CWlkID0gYnRmX19hZGRfdHlwZV90YWcoYnRmLCB0YWcsIHBvaW50ZWVfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9HVChpZCwgMCwgJiMzNDtidGZfX2FkZF90eXBlX3RhZyYjMzQ7KSkKJiM0MzsJCXJldHVybiBpZDsKJiM0MzsJaWQgPSBidGZfX2FkZF9wdHIoYnRmLCBpZCk7CiYjNDM7CUFTU0VSVF9HVChpZCwgMCwgJiMzNDtidGZfX2FkZF9wdHImIzM0Oyk7CiYjNDM7CXJldHVybiBpZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9zZWxmX2N5Y2xlKGNvbnN0IGNoYXIgKnRhZywgaW50IGV4cGVjdGVkX2VycikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZjsKJiM0MzsJaW50IGlkLCBlcnI7CiYjNDM7CiYjNDM7CWJ0ZiA9IGluaXRfYnRmKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7aW5pdF9idGYmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA3LCB0YWcpOwomIzQzOwlpZiAoaWQgJmx0Oz0gMCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7c2VsZl9jeWNsZSYjMzQ7LCA4KTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIDcsICYjMzQ7YnRmX19hZGRfc3RydWN0IHNlbGZfY3ljbGUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O25leHQmIzM0OywgNiwgMCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBzZWxmX2N5Y2xlOjpuZXh0JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwomIzQzOwlBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzO291dDoKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfYWJhX2N5Y2xlKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnRmICpidGY7CiYjNDM7CWludCBpZCwgZXJyOwomIzQzOwomIzQzOwlidGYgPSBpbml0X2J0ZigpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCAmIzM0O2luaXRfYnRmJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgMTAsICYjMzQ7a3B0ciYjMzQ7KTsKJiM0MzsJaWYgKGlkICZsdDs9IDApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDksICYjMzQ7a3B0ciYjMzQ7KTsKJiM0MzsJaWYgKGlkICZsdDs9IDApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O2N5Y2xlX2EmIzM0OywgOCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCA5LCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBjeWNsZV9hJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtiJiMzNDssIDYsIDAsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgY3ljbGVfYTo6YiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7Y3ljbGVfYiYjMzQ7LCA4KTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIDEwLCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBjeWNsZV9iJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDthJiMzNDssIDgsIDAsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgY3ljbGVfYjo6YSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTsKJiM0MzsJQVNTRVJUX0VRKGVyciwgLUVMT09QLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKJiM0MztvdXQ6CiYjNDM7CWJ0Zl9fZnJlZShidGYpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X21peGVkX2N5Y2xlKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnRmICpidGY7CiYjNDM7CWludCBpZCwgZXJyOwomIzQzOwomIzQzOwlidGYgPSBpbml0X2J0ZigpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCAmIzM0O2luaXRfYnRmJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgNywgJiMzNDtrcHRyJiMzNDspOwomIzQzOwlpZiAoaWQgJmx0Oz0gMCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7bWl4ZWRfb3duZXImIzM0OywgMjApOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgNywgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgbWl4ZWRfb3duZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O3Jvb3QmIzM0OywgTElTVF9IRUFELCAwLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX293bmVyOjpyb290JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtsb2NrJiMzNDssIFNQSU5fTE9DSywgMTI4LCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX293bmVyOjpsb2NrJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfZGVjbF90YWcoYnRmLCAmIzM0O2NvbnRhaW5zOm1peGVkX25vZGU6bm9kZSYjMzQ7LCA3LCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIDgsICYjMzQ7YnRmX19hZGRfZGVjbF90YWcgbWl4ZWRfb3duZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O21peGVkX25vZGUmIzM0OywgMzIpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgOSwgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgbWl4ZWRfbm9kZSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7bm9kZSYjMzQ7LCBMSVNUX05PREUsIDAsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgbWl4ZWRfbm9kZTo6bm9kZSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7b3duZXImIzM0OywgNiwgMTkyLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIG1peGVkX25vZGU6Om93bmVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwomIzQzOwlBU1NFUlRfRVEoZXJyLCAtRUxPT1AsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzO291dDoKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfYWN5Y2xpY19kZXB0aChpbnQgZGVwdGgsIGludCBleHBlY3RlZF9lcnIpCiYjNDM7ewomIzQzOwlpbnQgcHRyX2lkW01BWF9PV05FUlNISVBfREVQVEggJiM0MzsgMV07CiYjNDM7CWludCBmaXJzdF9zdHJ1Y3RfaWQ7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZjsKJiM0MzsJaW50IGlkLCBlcnIsIGk7CiYjNDM7CiYjNDM7CWJ0ZiA9IGluaXRfYnRmKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7aW5pdF9idGYmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWZpcnN0X3N0cnVjdF9pZCA9IDUgJiM0MzsgMiAqIGRlcHRoOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgZGVwdGg7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlwdHJfaWRbaV0gPSBhZGRfbG9jYWxfa3B0cihidGYsIGZpcnN0X3N0cnVjdF9pZCAmIzQzOyBpICYjNDM7IDEsICYjMzQ7a3B0ciYjMzQ7KTsKJiM0MzsJCWlmIChwdHJfaWRbaV0gJmx0Oz0gMCkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgZGVwdGg7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQljaGFyIG5hbWVbMTZdOwomIzQzOwomIzQzOwkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAmIzM0O293bmVyXyVkJiMzNDssIGkpOwomIzQzOwkJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBuYW1lLCA4KTsKJiM0MzsJCWlmICghQVNTRVJUX0VRKGlkLCBmaXJzdF9zdHJ1Y3RfaWQgJiM0MzsgaSwgJiMzNDtidGZfX2FkZF9zdHJ1Y3Qgb3duZXImIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7bmV4dCYjMzQ7LCBwdHJfaWRbaV0sIDAsIDApOwomIzQzOwkJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIG93bmVyOjpuZXh0JiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDtwbGFpbl9sZWFmJiMzNDssIDQpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgZmlyc3Rfc3RydWN0X2lkICYjNDM7IGRlcHRoLCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBwbGFpbl9sZWFmJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwomIzQzOwlBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzO291dDoKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9sb2NhbF9rcHRyX293bmVyc2hpcCh2b2lkKQomIzQzO3sKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzZWxmX2N5Y2xlJiMzNDspKQomIzQzOwkJdGVzdF9zZWxmX2N5Y2xlKCYjMzQ7a3B0ciYjMzQ7LCAtRUxPT1ApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3VudHJ1c3RlZF9zZWxmX2N5Y2xlJiMzNDspKQomIzQzOwkJdGVzdF9zZWxmX2N5Y2xlKCYjMzQ7a3B0cl91bnRydXN0ZWQmIzM0OywgMCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7cGVyY3B1X3NlbGZfY3ljbGUmIzM0OykpCiYjNDM7CQl0ZXN0X3NlbGZfY3ljbGUoJiMzNDtwZXJjcHVfa3B0ciYjMzQ7LCAtRUxPT1ApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O0FCQV9jeWNsZSYjMzQ7KSkKJiM0MzsJCXRlc3RfYWJhX2N5Y2xlKCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWl4ZWRfZ3JhcGhfcm9vdF9jeWNsZSYjMzQ7KSkKJiM0MzsJCXRlc3RfbWl4ZWRfY3ljbGUoKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDttYXhfYWN5Y2xpYyYjMzQ7KSkKJiM0MzsJCXRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRILCAwKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDt0b29fZGVlcF9hY3ljbGljJiMzNDspKQomIzQzOwkJdGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEggJiM0MzsgMSwgLUVMT09QKTsKJiM0Mzt9CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc4MjMKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxODEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgSW5pdGlhbCBBc3Nlc3NtZW50IG9mIHRoZSBCUEYgUGF0Y2gqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIHBhdGNoLiBNeSBpbW1lZGlhdGUgZ29hbCBpcyB0byBmaWd1cmUgb3V0IGlmIHRoaXMgd2FycmFudHMgYSBmdXp6aW5nIGNhbXBhaWduLCBhbmQgaWYgc28sIGhvdyB0byBiZXN0IGFwcHJvYWNoIGl0LiBXaGF0IGNvbmZpZ3VyYXRpb25zIGFyZSBnb2luZyB0byBiZSBtb3N0IGVmZmVjdGl2ZSwgYW5kIHdoaWNoIHNwZWNpZmljIHN5bWJvbHMgYXJlIHRoZSBtb3N0IGxpa2VseSB0YXJnZXRzIGZvciBleHBsb2l0YXRpb24/CgpGaXJzdCwgdGhlIGRpZmYgaXRzZWxmLiBPa2F5LCBpdCB0b3VjaGVzIGBrZXJuZWwvYnBmL2J0Zi5jYCBhbmQgYSBmZXcgdGVzdCBmaWxlcyB1bmRlciBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLi4uYCDigJMgdGhhdCYjMzk7cyBhbHJlYWR5IGludGVyZXN0aW5nLiBMZXQmIzM5O3MgYnJlYWsgZG93biB0aGUgY2hhbmdlczogSW4gYGtlcm5lbC9icGYvYnRmLmNgLCB3ZSBzZWUgbW9kaWZpY2F0aW9ucyB0byBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgLiBUaGVuLCBzb21lIG5ldyBoZWxwZXIgZnVuY3Rpb25zIGhhdmUgYmVlbiBpbnRyb2R1Y2VkOiBgYnRmX293bmVkX3R5cGVfaWR4YCwgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgLCBhbmQgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgLiBDcnVjaWFsbHksIHRoZXJlJiMzOTtzIGEgbmV3IGNhbGwgdG8gYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoYnRmLCBzdHJ1Y3RfbWV0YV90YWIpYCB3aXRoaW4gYGJ0Zl9wYXJzZWAuIFRoYXQmIzM5O3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IGBzdHJ1Y3RfbWV0YV90YWJgIGFjdHVhbGx5ICppcyogd2l0aGluIHRoYXQgY29udGV4dDsgSSYjMzk7bGwgbmVlZCB0byBsb29rIGF0IHRoZSBzdXJyb3VuZGluZyBjb2RlIHRvIGRldGVybWluZSBpdHMgcm9sZSBhbmQgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcy4KCk5vdywgSSYjMzk7bSBnb2luZyB0byBzdGFydCBkaWdnaW5nIGludG8gdGhlIGNvZGUgaXRzZWxmLiBUaW1lIHRvIGZpcmUgdXAgbXkgYW5hbHlzaXMgdG9vbHMgYW5kIGdldCBhIGJldHRlciBwaWN0dXJlIG9mIHRoZSBzaXR1YXRpb24uIEkgbmVlZCB0byBjaGVjayBob3cgdGhlc2UgaGVscGVyIGZ1bmN0aW9ucyBpbnRlcmFjdCB3aXRoIHRoZSBleGlzdGluZyBjb2RlIGFuZCB1bmRlcnN0YW5kIHRoZSBwb3RlbnRpYWwgaW1wbGljYXRpb25zIG9mIHRoZXNlIGNoYW5nZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvYnRmLmM9NDM0MT1zdGF0aWMgaW50IGJ0Zl9vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuLS1cbmtlcm5lbC9icGYvYnRmLmMtNDM2OC1cbmtlcm5lbC9icGYvYnRmLmM6NDM2OTpzdGF0aWMgaW50IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxua2VybmVsL2JwZi9idGYuYy00MzcwLVx0XHRcdFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9NTk5OT1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTYwODItXG5rZXJuZWwvYnBmL2J0Zi5jOjYwODM6XHRcdGVyciA9IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoYnRmLCBzdHJ1Y3RfbWV0YV90YWIpO1xua2VybmVsL2JwZi9idGYuYy02MDg0LVx0XHRpZiAoZXJyIFx1MDAzYyAwKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg2MTUKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAyNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgeW91IHJlcXVlc3RlZDoKCioqRGl2aW5nIERlZXAgaW50byBCVEYgYW5kIGl0cyBDYWxsZXJzKioKCk9rYXksIHNvIEkgbmVlZCB0byBnZXQgYSByZWFsbHkgc29saWQgZ3Jhc3Agb24gdGhlIGJlaGF2aW9yIG9mIHRoZXNlIHNwZWNpZmljIGZ1bmN0aW9ucy4gSSBrbm93IHRoZSBnZW5lcmFsIGlkZWEsIGJ1dCB0byB1bmRlcnN0YW5kIHRoZSAqd2h5KiBhbmQgdGhlIHN1YnRsZXRpZXMsIEkgbmVlZCB0byBzZWUgdGhlbSBpbiBhY3Rpb24uIFRoZSBiZXN0IHdheSB0byBkbyB0aGF0LCBlc3BlY2lhbGx5IGluIHRoZSBrZXJuZWwsIGlzIHRvIGdvIHN0cmFpZ2h0IHRvIHRoZSBzb3VyY2UuIFNwZWNpZmljYWxseSwgSSBzaG91bGQgY3JhY2sgb3BlbiBga2VybmVsL2JwZi9idGYuY2AuIFRoYXQmIzM5O3Mgd2hlcmUgdGhlIG1hZ2ljIGlzIGhhcHBlbmluZywgcmlnaHQ/IEkmIzM5O20gdGhpbmtpbmcgdGhlIGJlc3Qgc3RyYXRlZ3kgaXMgdG8gbG9vayBhdCB0aGUgc3Vycm91bmRpbmcgY29kZSBhcyB3ZWxsLCBzbyBJIGNhbiBzZWUgd2hhdCB0aGVzZSBmdW5jdGlvbnMgYXJlIGludGVyYWN0aW5nIHdpdGgsIHdoYXQgY2FsbHMgdGhlbSwgYW5kIHdoYXQgdGhleSBjYWxsLiBDb250ZXh0IGlzIGtpbmcsIGFuZCBpbiBhIGNvbXBsZXggc3lzdGVtIGxpa2UgdGhlIEJQRiBpbmZyYXN0cnVjdHVyZSwgY29udGV4dCBpcyBldmVyeXRoaW5nLiBUaW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eSBhbmQgc3RhcnQgdHJhY2luZyB0aG9zZSBjYWxscyEgTGV0JiMzOTtzIHNlZSB3aGF0IHdlIGNhbiBsZWFybiBhYm91dCB0aGUgcmVsYXRpb25zaGlwIG9mIGZ1bmN0aW9ucywgYW5kIHRoZSBvdmVyYWxsIHJvbGUgdGhlc2UgZnVuY3Rpb25zIHBsYXkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2J0Zi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDMwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA5MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDs0MzAwOlx0XHRcdFx0Y29udGludWU7XG40MzAxOlx0XHRcdGJ0Zl9pZCA9IHJlYy1cdTAwM2VmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XG40MzAyOlx0XHRcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XG40MzAzOlx0XHRcdGlmICghbWV0YSlcbjQzMDQ6XHRcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbjQzMDU6XHRcdFx0cmVjLVx1MDAzZWZpZWxkc1tpXS5ncmFwaF9yb290LnZhbHVlX3JlYyA9IG1ldGEtXHUwMDNlcmVjb3JkO1xuNDMwNjpcdFx0fVxuNDMwNzpcdFx0cmV0dXJuIDA7XG40MzA4Olx0fVxuNDMwOTpcdFxuNDMxMDpcdHN0YXRpYyBpbnQgYnRmX293bmVkX3R5cGVfaWR4KGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYixcbjQzMTE6XHRcdFx0XHQgICAgICBjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZClcbjQzMTI6XHR7XG40MzEzOlx0XHRzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhICptZXRhO1xuNDMxNDpcdFx0dTMyIGJ0Zl9pZDtcbjQzMTU6XHRcbjQzMTY6XHRcdGlmIChmaWVsZC1cdTAwM2V0eXBlIFx1MDAyNiBCUEZfR1JBUEhfUk9PVCkge1xuNDMxNzpcdFx0XHRidGZfaWQgPSBmaWVsZC1cdTAwM2VncmFwaF9yb290LnZhbHVlX2J0Zl9pZDtcbjQzMTg6XHRcdH0gZWxzZSBpZiAoZmllbGQtXHUwMDNldHlwZSA9PSBCUEZfS1BUUl9SRUYgfHwgZmllbGQtXHUwMDNldHlwZSA9PSBCUEZfS1BUUl9QRVJDUFUpIHtcbjQzMTk6XHRcdFx0aWYgKGJ0Zl9pc19rZXJuZWwoZmllbGQtXHUwMDNla3B0ci5idGYpKVxuNDMyMDpcdFx0XHRcdHJldHVybiAtRU5PRU5UO1xuNDMyMTpcdFx0XHRidGZfaWQgPSBmaWVsZC1cdTAwM2VrcHRyLmJ0Zl9pZDtcbjQzMjI6XHRcdH0gZWxzZSB7XG40MzIzOlx0XHRcdHJldHVybiAtRU5PRU5UO1xuNDMyNDpcdFx0fVxuNDMyNTpcdFxuNDMyNjpcdFx0bWV0YSA9IGJ0Zl9maW5kX3N0cnVjdF9tZXRhKGJ0ZiwgYnRmX2lkKTtcbjQzMjc6XHRcdGlmICghbWV0YSlcbjQzMjg6XHRcdFx0cmV0dXJuIGZpZWxkLVx1MDAzZXR5cGUgXHUwMDI2IEJQRl9HUkFQSF9ST09UID8gLUVGQVVMVCA6IC1FTk9FTlQ7XG40MzI5Olx0XHRyZXR1cm4gbWV0YSAtIHRhYi1cdTAwM2V0eXBlcztcbjQzMzA6XHR9XG40MzMxOlx0XG40MzMyOlx0LypcbjQzMzM6XHQgKiBFYWNoIG93bmVyc2hpcCBlZGdlIGFkZHMga2VybmVsIGZyYW1lcyB0aHJvdWdoIGJwZl9vYmpfZnJlZV9maWVsZHMoKSBhbmRcbjQzMzQ6XHQgKiBfX2JwZl9vYmpfZHJvcF9pbXBsKCkuIEtlZXAgdGhlIGJvdW5kIGRlbGliZXJhdGVseSBzbWFsbCBiZWNhdXNlIG9iamVjdFxuNDMzNTpcdCAqIGRlc3RydWN0aW9uIGNhbiBpdHNlbGYgcnVuIGJlbG93IGEgQlBGIGNhbGwgY2hhaW4uIEEgZmluYWwgcG9pbnRlZSB3aXRob3V0XG40MzM2Olx0ICogc3BlY2lhbCBmaWVsZHMgaXMgbm90IHByZXNlbnQgaW4gdGhlIHN0cnVjdCBtZXRhZGF0YSB0YWJsZSBhbmQgYWRkcyBvbmx5IGFcbjQzMzc6XHQgKiBub24tcmVjdXJzaW5nIGRyb3AuXG40MzM4Olx0ICovXG40MzM5Olx0I2RlZmluZSBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCA4XG40MzQwOlx0XG40MzQxOlx0c3RhdGljIGludCBidGZfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbjQzNDI6XHRcdFx0XHQgICAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYiwgdTggKmRlcHRoLFxuNDM0MzpcdFx0XHRcdCAgICAgICBpbnQgaWR4LCBpbnQgZGVwdGhfbGVmdClcbjQzNDQ6XHR7XG40MzQ1Olx0XHRjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjID0gdGFiLVx1MDAzZXR5cGVzW2lkeF0ucmVjb3JkO1xuNDM0NjpcdFx0aW50IGksIHJldCwgbWF4X2RlcHRoID0gMDtcbjQzNDc6XHRcbjQzNDg6XHRcdGlmICghZGVwdGhfbGVmdClcbjQzNDk6XHRcdFx0cmV0dXJuIC1FTE9PUDtcbjQzNTA6XHRcdGlmIChkZXB0aFtpZHhdKVxuNDM1MTpcdFx0XHRnb3RvIGRvbmU7XG40MzUyOlx0XG40MzUzOlx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyByZWMtXHUwMDNlY250OyBpJiM0MzsmIzQzOykge1xuNDM1NDpcdFx0XHRyZXQgPSBidGZfb3duZWRfdHlwZV9pZHgoYnRmLCB0YWIsIFx1MDAyNnJlYy1cdTAwM2VmaWVsZHNbaV0pO1xuNDM1NTpcdFx0XHRpZiAocmV0ID09IC1FTk9FTlQpXG40MzU2Olx0XHRcdFx0Y29udGludWU7XG40MzU3Olx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG40MzU4Olx0XHRcdFx0cmV0dXJuIHJldDtcbjQzNTk6XHRcdFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIHJldCwgZGVwdGhfbGVmdCAtIDEpO1xuNDM2MDpcdFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuNDM2MTpcdFx0XHRcdHJldHVybiByZXQ7XG40MzYyOlx0XHRcdG1heF9kZXB0aCA9IG1heChtYXhfZGVwdGgsIHJldCk7XG40MzYzOlx0XHR9XG40MzY0Olx0XHRkZXB0aFtpZHhdID0gbWF4X2RlcHRoICYjNDM7IDE7XG40MzY1Olx0ZG9uZTpcbjQzNjY6XHRcdHJldHVybiBkZXB0aFtpZHhdIFx1MDAzZSBkZXB0aF9sZWZ0ID8gLUVMT09QIDogZGVwdGhbaWR4XTtcbjQzNjc6XHR9XG40MzY4Olx0XG40MzY5Olx0c3RhdGljIGludCBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbjQzNzA6XHRcdFx0XHRcdCAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYilcbjQzNzE6XHR7XG40MzcyOlx0XHR1OCAqZGVwdGg7XG40MzczOlx0XHRpbnQgaSwgcmV0ID0gMDtcbjQzNzQ6XHRcbjQzNzU6XHRcdGRlcHRoID0ga3ZjYWxsb2ModGFiLVx1MDAzZWNudCwgc2l6ZW9mKCpkZXB0aCksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1dBUk4pO1xuNDM3NjpcdFx0aWYgKCFkZXB0aClcbjQzNzc6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG40Mzc4Olx0XG40Mzc5Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB0YWItXHUwMDNlY250OyBpJiM0MzsmIzQzOykge1xuNDM4MDpcdFx0XHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgaSxcbjQzODE6XHRcdFx0XHRcdFx0ICBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCk7XG40MzgyOlx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG40MzgzOlx0XHRcdFx0YnJlYWs7XG40Mzg0Olx0XHRcdHJldCA9IDA7XG40Mzg1Olx0XHR9XG40Mzg2Olx0XHRrdmZyZWUoZGVwdGgpO1xuNDM4NzpcdFx0cmV0dXJuIHJldDtcbjQzODg6XHR9XG40Mzg5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTAzMDAKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAyOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHQgcHJvY2Vzc2VzOgoKKipEZWx2aW5nIGludG8gQlRGIFBhcnNpbmcgYW5kIEZpZWxkIE1hbmlwdWxhdGlvbioqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYGJ0Zl9wYXJzZWAgYW5kIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2AgYXJlIGFjdHVhbGx5ICp1c2VkKiB3aXRoaW4gdGhlIGxhcmdlciBjb250ZXh0LiBNeSBmaXJzdCBtb3ZlIGlzIGNsZWFyOiBJIHdhbnQgdG8gdHJhY2UgdGhlIGNhbGwgcGF0aHMuIEkgbmVlZCB0byBzZWUgd2hlcmUgdGhlc2UgZnVuY3Rpb25zIGFyZSBpbnZva2VkLiBVbmRlcnN0YW5kaW5nIHRoZSBjYWxsaW5nIGNvbnRleHRzIHdpbGwgZ2l2ZSBtZSBpbW1lZGlhdGUgaW5zaWdodCBpbnRvIHRoZSByb2xlIG9mIHRoZXNlIGZ1bmN0aW9ucyB3aXRoaW4gdGhlIEJURiAoQlBGIFR5cGUgRm9ybWF0KSBpbmZyYXN0cnVjdHVyZS4gQXJlIHRoZXkgY2FsbGVkIGR1cmluZyBCVEYgb2JqZWN0IGxvYWRpbmc/IER1cmluZyBwcm9ncmFtIHZlcmlmaWNhdGlvbj8gTWF5YmUgZHVyaW5nIHNvbWUga2luZCBvZiB0eXBlIGludHJvc3BlY3Rpb24gb3Igb3B0aW1pemF0aW9uPyBLbm93aW5nIHRoZSBjYWxsIHNpdGVzIGlzIGtleSB0byBmb3JtdWxhdGluZyBhIHByb3BlciBtZW50YWwgbW9kZWwuIEkmIzM5O2xsIHN0YXJ0IHdpdGggYSBzdHJhaWdodGZvcndhcmQgc2VhcmNoIGZvciB0aG9zZSBmdW5jdGlvbiBuYW1lcyBhbmQgZm9sbG93IHRoZSB0cmFpbC4gVGhpcyBzaG91bGQgYmUgaW50ZXJlc3RpbmcuLi4gdGltZSB0byBkaWcgaW4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvYnBmLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2J0Zi5jPTQxMzU9c3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9wYXJzZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsXG4tLVxua2VybmVsL2JwZi9idGYuYy00MjY3LVxua2VybmVsL2JwZi9idGYuYzo0MjY4OmludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG5rZXJuZWwvYnBmL2J0Zi5jLTQyNjkte1xuLS1cbmtlcm5lbC9icGYvYnRmLmM9NTk5OT1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNzctXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHN0cnVjdF9tZXRhX3RhYi1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG5rZXJuZWwvYnBmL2J0Zi5jOjYwNzg6XHRcdFx0ZXJyID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBzdHJ1Y3RfbWV0YV90YWItXHUwMDNldHlwZXNbaV0ucmVjb3JkKTtcbmtlcm5lbC9icGYvYnRmLmMtNjA3OS1cdFx0XHRpZiAoZXJyIFx1MDAzYyAwKVxuLS1cbmtlcm5lbC9icGYvc3lzY2FsbC5jPTEyNTU9c3RhdGljIGludCBtYXBfY2hlY2tfYnRmKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfdG9rZW4gKnRva2VuLFxuLS1cbmtlcm5lbC9icGYvc3lzY2FsbC5jLTEzNjMtXG5rZXJuZWwvYnBmL3N5c2NhbGwuYzoxMzY0Olx0cmV0ID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBtYXAtXHUwMDNlcmVjb3JkKTtcbmtlcm5lbC9icGYvc3lzY2FsbC5jLTEzNjUtXHRpZiAocmV0IFx1MDAzYyAwKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwOTUwCgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipBbmFseXppbmcgYGJ0Zl9wYXJzZWAgQ2FsbHNpdGVzKioKCk9rYXksIHRpbWUgdG8gZGl2ZSBpbi4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsICYjMzQ7V2hlcmUgZXhhY3RseSBpcyB0aGlzIGBidGZfcGFyc2VgIGZ1bmN0aW9uIGJlaW5nIGludm9rZWQ/JiMzNDsgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGNvbnRleHQuIEtub3dpbmcgdGhlIGNhbGxpbmcgZnVuY3Rpb25zIGlzIGNydWNpYWwgZm9yIGdyYXNwaW5nIGl0cyBwdXJwb3NlIHdpdGhpbiB0aGUgYnJvYWRlciBzeXN0ZW0uIEkmIzM5O2xsIG5lZWQgdG8gdHJhY2UgdGhlIGNhbGxzaXRlcyB0byBmaWd1cmUgb3V0IHdoYXQgZGF0YSBpdCYjMzk7cyBwcm9jZXNzaW5nLCB3aGF0IHJlc291cmNlcyBpdCYjMzk7cyB1dGlsaXppbmcsIGFuZCB3aGF0IHRoZSBvdmVyYWxsIHdvcmtmbG93IGxvb2tzIGxpa2UgYXJvdW5kIGl0LiBBcmUgd2UgZGVhbGluZyB3aXRoIGtlcm5lbCBzcGFjZSwgdXNlciBzcGFjZSwgb3IgYm90aD8gQXJlIHRoZXJlIGFueSBwb3RlbnRpYWwgY29uY3VycmVuY3kgaXNzdWVzIHRvIGNvbnNpZGVyLCBnaXZlbiBob3cgbWFueSBjYWxsIHNpdGVzPyBUaGlzIGNvdWxkIGdpdmUgbWUgYSBtdWNoIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBvdmVyYWxsIHB1cnBvc2Ugb2YgdGhlIHByb2dyYW0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2J0Zl9wYXJzZVxcKCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvYnRmLmM9NTk2MT1zdGF0aWMgaW50IGJ0Zl9jaGVja19tb2RpZmllcl9jaGFpbl9sZW5ndGgoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudixcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTU5OTgtXG5rZXJuZWwvYnBmL2J0Zi5jOjU5OTk6c3RhdGljIHN0cnVjdCBidGYgKmJ0Zl9wYXJzZShjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXG5rZXJuZWwvYnBmL2J0Zi5jLTYwMDAtXHRcdFx0ICAgICBzdHJ1Y3QgYnBmX2xvZ19hdHRyICphdHRyX2xvZylcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTg0MDQ9aW50IGJ0Zl9uZXdfZmQoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLCBzdHJ1Y3QgYnBmX2xvZ19hdHRyICphdHRyX2xvZylcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTg0MDgtXG5rZXJuZWwvYnBmL2J0Zi5jOjg0MDk6XHRidGYgPSBidGZfcGFyc2UoYXR0ciwgdWF0dHIsIGF0dHJfbG9nKTtcbmtlcm5lbC9icGYvYnRmLmMtODQxMC1cdGlmIChJU19FUlIoYnRmKSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE0MjkKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiA0NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhbmFseXNpcyBvZiB0aGUgc2l0dWF0aW9uOgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBgYnRmX25ld19mZGAgRnVuY3Rpb24gQ2FsbCoqCgpPa2F5LCBzbyBJJiMzOTttIHRyYWNpbmcgZG93biB0aGlzIGBidGZfbmV3X2ZkYCBmdW5jdGlvbi4gVGhlIGNhbGwgc3RhY2sgaW5kaWNhdGVzIGl0JiMzOTtzIHRyaWdnZXJlZCBmcm9tIHRoZSBgYnBmKEJQRl9CVEZfTE9BRClgIHN5c3RlbSBjYWxsLCBzcGVjaWZpY2FsbHkgdGhyb3VnaCBgc3lzY2FsbC5jYC4gU2luY2UgdGhhdCYjMzk7cyB0aGUgZW50cnkgcG9pbnQsIGl0JiMzOTtzIHRoZSBvYnZpb3VzIHBsYWNlIHRvIHN0YXJ0LiBJJiMzOTtsbCBuZWVkIHRvIGRpdmUgaW50byBga2VybmVsL2JwZi9zeXNjYWxsLmNgIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgYGJ0Zl9uZXdfZmRgIGZ1bmN0aW9uIGlzIGJlaW5nIGludm9rZWQgYW5kIHdoYXQgaW5mb3JtYXRpb24gaXMgYmVpbmcgcGFzc2VkLiBUaGF0IHNob3VsZCBnaXZlIG1lIHRoZSBjb250ZXh0IEkgbmVlZCB0byBmaWd1cmUgb3V0IGV4YWN0bHkgd2hhdCYjMzk7cyBoYXBwZW5pbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2J0Zl9uZXdfZmQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvYnBmLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2J0Zi5jPTgzOTI9Y29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBidGZfZm9wcyA9IHtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTgzOTgtXG5rZXJuZWwvYnBmL2J0Zi5jOjgzOTk6c3RhdGljIGludCBfX2J0Zl9uZXdfZmQoc3RydWN0IGJ0ZiAqYnRmKVxua2VybmVsL2JwZi9idGYuYy04NDAwLXtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTg0MDMtXG5rZXJuZWwvYnBmL2J0Zi5jOjg0MDQ6aW50IGJ0Zl9uZXdfZmQoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLCBzdHJ1Y3QgYnBmX2xvZ19hdHRyICphdHRyX2xvZylcbmtlcm5lbC9icGYvYnRmLmMtODQwNS17XG4tLVxua2VybmVsL2JwZi9idGYuYy04NDI0LVxua2VybmVsL2JwZi9idGYuYzo4NDI1Olx0cmV0ID0gX19idGZfbmV3X2ZkKGJ0Zik7XG5rZXJuZWwvYnBmL2J0Zi5jLTg0MjYtXHRpZiAocmV0IFx1MDAzYyAwKVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9ODUwND1pbnQgYnRmX2dldF9mZF9ieV9pZCh1MzIgaWQpXG4tLVxua2VybmVsL2JwZi9idGYuYy04NTE3LVxua2VybmVsL2JwZi9idGYuYzo4NTE4Olx0ZmQgPSBfX2J0Zl9uZXdfZmQoYnRmKTtcbmtlcm5lbC9icGYvYnRmLmMtODUxOS1cdGlmIChmZCBcdTAwM2MgMClcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTg3NTY9QlBGX0NBTExfNChicGZfYnRmX2ZpbmRfYnlfbmFtZV9raW5kLCBjaGFyICosIG5hbWUsIGludCwgbmFtZV9zeiwgdTMyLCBraW5kLCBpbnQsIGZsYWdzKVxuLS1cbmtlcm5lbC9icGYvYnRmLmMtODc2OS1cdGlmIChyZXQgXHUwMDNlIDAgXHUwMDI2XHUwMDI2IGJ0Zl9pc19tb2R1bGUoYnRmKSkge1xua2VybmVsL2JwZi9idGYuYzo4NzcwOlx0XHRidGZfb2JqX2ZkID0gX19idGZfbmV3X2ZkKGJ0Zik7XG5rZXJuZWwvYnBmL2J0Zi5jLTg3NzEtXHRcdGlmIChidGZfb2JqX2ZkIFx1MDAzYyAwKSB7XG4tLVxua2VybmVsL2JwZi9zeXNjYWxsLmM9NTU2ND1zdGF0aWMgaW50IGJwZl9idGZfbG9hZChjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsIHN0cnVjdCBicGZfbG9nX2F0dHIgKmF0dHJfbG9nKVxuLS1cbmtlcm5lbC9icGYvc3lzY2FsbC5jLTU1OTAtXG5rZXJuZWwvYnBmL3N5c2NhbGwuYzo1NTkxOlx0cmV0dXJuIGJ0Zl9uZXdfZmQoYXR0ciwgdWF0dHIsIGF0dHJfbG9nKTtcbmtlcm5lbC9icGYvc3lzY2FsbC5jLTU1OTItfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxMjoyNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjMxMQoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDQ4OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEJURiBQYXRjaCBhbmQgSXRzIEltcGxpY2F0aW9ucyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCB0aGlzIHBhdGNoIGlzIGFkZHJlc3NpbmcgYSBmbGF3IGluIGhvdyB3ZSBoYW5kbGUgYW5kIHZlcmlmeSBCVEYgZGF0YSwgc3BlY2lmaWNhbGx5IGFyb3VuZCB0aGUgb3duZXJzaGlwIGFuZCBjeWNsaWNhbCByZWxhdGlvbnNoaXBzIG9mIHN0cnVjdHMgd2l0aGluIHRoZSBCUEYgc3lzdGVtLiBCZWZvcmUgdGhpcywgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYCBoYWQgYSBwcmV0dHkgc2ltcGxpc3RpYyBjaGVjayBmb3IgZ3JhcGggcm9vdCBhY3ljbGljaXR5LiBJdCB1c2VkIHRoaXMgcmF0aGVyIGJhc2ljIGhldXJpc3RpYzogJiMzNDtJZiBhIHR5cGUgaXMgYm90aCBhIHJvb3QgYW5kIGEgbm9kZSwgaXQmIzM5O3MgYWxyZWFkeSBvd25lZCBhbmQgY2FuJiMzOTt0IG93biBhbm90aGVyIHJvb3QgdHlwZS4mIzM0OyBQcm9ibGVtIGlzLCB0aGlzIHdhc24mIzM5O3Qgcm9idXN0IGVub3VnaC4gSXQgZmFpbGVkIHRvIGNvbnNpZGVyIGBrcHRyYCBvd25lcnNoaXAgZGVwdGggb3IgY3ljbGVz4oCUdGhlIGxvY2FsIHBvaW50ZXIgb3duZXJzaGlwIHNjZW5hcmlvcywgYW5kIEkgc2VlIHRoZSBwcm9ibGVtLiBXZSBuZWVkIHNvbWV0aGluZyBtb3JlIHNvcGhpc3RpY2F0ZWQuCgpUaGUgcGF0Y2ggZXNzZW50aWFsbHkgcmVmYWN0b3JzIHRoaXMgbG9naWMsIGFuZCBpdCBsb29rcyBsaWtlIGEgZ29vZCBjaGFuZ2UuIEl0IHNlcGFyYXRlcyB0aGUgaW5pdGlhbCBncmFwaCByb290IHNldHRpbmcgaW4gYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYCwgbm93IGp1c3Qgc2V0dGluZyB0aGUgYHZhbHVlX3JlY2AsIGZyb20gYSBuZXcsIGRlZGljYXRlZCBvd25lcnNoaXAgZGVwdGggY2hlY2suIFRoaXMgbmV3IGFsZ29yaXRobSwgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgLCBpcyB0aGUga2V5LiBJdCYjMzk7cyBkZXNpZ25lZCB0byBjYWxjdWxhdGUgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgIGZvciBhbGwgc3RydWN0IG1ldGFzIHVwIHRvIGEgZGVmaW5lZCBsaW1pdCAoYEJURl9NQVhfT1dORVJTSElQX0RFUFRIYCwgY3VycmVudGx5IDgpLiBUaGlzIGlzIHdoZXJlIHRoZSBoZWF2eSBsaWZ0aW5nIGhhcHBlbnM6IGRldGVjdGluZyBjeWNsZXMgYW5kIGV4Y2Vzc2l2ZSBvd25lcnNoaXAgZGVwdGgsIGNvbnNpZGVyaW5nIGJvdGggdGhlIGdyYXBoIHJvb3RzIChgQlBGX0dSQVBIX1JPT1RgKSBhbmQgdGhlIGxvY2FsIGBrcHRyYCByZWxhdGlvbnNoaXBzIChgQlBGX0tQVFJfUkVGYCBvciBgQlBGX0tQVFJfUEVSQ1BVYCkuIFRoaXMgaXMgYSBtdWNoIG1vcmUgY29tcHJlaGVuc2l2ZSBhcHByb2FjaC4KCkFscmlnaHQsIHNvIHRoZSBpbXBsaWNhdGlvbnMgaGVyZSBhcmUgY2xlYXI6IHRoaXMgaW1wYWN0cyBCVEYgdmVyaWZpY2F0aW9uIGFuZCBsb2FkaW5nIHZpYSB0aGUgYGJwZihCUEZfQlRGX0xPQUQpYCBzeXNjYWxsLiBUaGlzIGlzIHJpZ2h0IGluIHRoZSBjb3JlIG9mIHRoaW5ncywgYGtlcm5lbC9icGYvYnRmLmNgLiBBbmQgaXQmIzM5O3MgcmVhY2hhYmxlIHZpYSBgYnBmKClgIHdpdGggYEJQRl9CVEZfTE9BRGAsIHdoaWNoIGlzIGFjY2Vzc2libGUgZnJvbSBib3RoIHVucHJpdmlsZWdlZCBhbmQgcHJpdmlsZWdlZCBjb250ZXh0cywgbWVhbmluZyBpdCYjMzk7cyBhIGdvb2QgdGFyZ2V0IGZvciBmdXp6aW5nLiBXZSBoYXZlIG5ldyByZWN1cnNpb24gbG9naWMsIGdyYXBoIHRyYXZlcnNhbCwgY3ljbGUgZGV0ZWN0aW9uLCBhbmQgZGVwdGggbGltaXRzLiBUaGVzZSBhcmUgYWxsIHBvc2l0aXZlIGluZGljYXRvcnMgdGhhdCBtYWtlIGl0IGEgdmFsdWFibGUgdGFyZ2V0IGZvciBmdXp6aW5nLiBUaGUgbG9jYXRpb24gaW4gdGhlIEJQRiBjb3JlIGlzIGFub3RoZXIgcG9zaXRpdmUuCgpOb3csIEkgc2hvdWxkIHF1aWNrbHkgY2hlY2sgdGhlIGtlcm5lbCBjb25maWcgb3B0aW9ucyB0byBjb25maXJtIHRoZSBkZXBlbmRlbmNpZXMgZm9yIGBrZXJuZWwvYnBmL2J0Zi5jYCBhbmQgYEJQRl9CVEZfTE9BRGAgYW5kIEJURiBzdXBwb3J0LiBKdXN0IHRvIG1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQmIzM5O3MgcmVxdWlyZWQgdG8gbWFrZSB0aGlzIGNvZGUgYWN0aXZlLiBJJiMzOTtsbCBjaGVjayBgaW5pdC9LY29uZmlnYCBvciBga2VybmVsL2JwZi9NYWtlZmlsZWAgdG8gY29uZmlybSB0aGUgZGVwZW5kZW5jaWVzIGFuZCBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGFsbCB3ZSBuZWVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxMjoyNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtidGZcXC5vJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9NYWtlZmlsZT0xMz1vYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICYjNDM7PSBicGZfbG9jYWxfc3RvcmFnZS5vIGJwZl90YXNrX3N0b3JhZ2Uub1xua2VybmVsL2JwZi9NYWtlZmlsZToxNDpvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICYjNDM7PSBmaXh1cHMubyBjZmcubyBzdGF0ZXMubyBiYWNrdHJhY2subyBjaGVja19idGYub1xua2VybmVsL2JwZi9NYWtlZmlsZS0xNS1vYmotJHtDT05GSUdfQlBGX0xTTX1cdCAgJiM0Mzs9IGJwZl9pbm9kZV9zdG9yYWdlLm9cbi0tXG5rZXJuZWwvYnBmL01ha2VmaWxlPTE3PW9iai0kKENPTkZJR19CUEZfSklUKSAmIzQzOz0gdHJhbXBvbGluZS5vXG5rZXJuZWwvYnBmL01ha2VmaWxlOjE4Om9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IGJ0Zi5vIG1lbWFsbG9jLm8gcnFzcGlubG9jay5vIHN0cmVhbS5vXG5rZXJuZWwvYnBmL01ha2VmaWxlLTE5LWlmZXEgKCQoQ09ORklHX01NVSkkKENPTkZJR182NEJJVCkseXkpXG4tLVxua2VybmVsL2JwZi9NYWtlZmlsZT00Mz1pZmVxICgkKENPTkZJR19TWVNGUykseSlcbmtlcm5lbC9icGYvTWFrZWZpbGU6NDQ6b2JqLSQoQ09ORklHX0RFQlVHX0lORk9fQlRGKSAmIzQzOz0gc3lzZnNfYnRmLm9cbmtlcm5lbC9icGYvTWFrZWZpbGUtNDUtZW5kaWZcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTM2NzkKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiAzNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipDaGVja2luZyB0aGUgQlBGIENvbmZpZ3VyYXRpb24gTGFuZHNjYXBlKioKCk9rYXksIHNvIEkgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyBgQlBGX1NZU0NBTExgIGFuZCBgQlBGYCBhcmUgY29uZmlndXJlZC4gR2l2ZW4gbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUga2VybmVsLCBJJiMzOTtsbCBzdGFydCBieSBjaGVja2luZyB0aGUgS2NvbmZpZyBmaWxlcy4gVGhlIG1vc3QgbGlrZWx5IHBsYWNlcyB3b3VsZCBiZSBgaW5pdC9LY29uZmlnYCwgYXMgaXQgb2Z0ZW4gaG91c2VzIGdsb2JhbCBmZWF0dXJlIHRvZ2dsZXMsIG9yIHNwZWNpZmljYWxseSwgYGtlcm5lbC9icGYvS2NvbmZpZ2AsIHNpbmNlIHRoYXQgZGlyZWN0b3J5IGlzIGRlZGljYXRlZCB0byBCUEYtcmVsYXRlZCBjb25maWd1cmF0aW9ucy4gSSBuZWVkIHRvIHNlZSBob3cgdGhlc2Ugb3B0aW9ucyBhcmUgZGVmaW5lZCwgdGhlaXIgZGVwZW5kZW5jaWVzLCBhbmQgYW55IGRlZmF1bHQgc2V0dGluZ3MuIFRoaXMgd2lsbCBnaXZlIG1lIGEgY2xlYXIgcGljdHVyZSBvZiB3aGF0IGNvbnRyb2xzIHRoZSBhY3RpdmF0aW9uIG9mIHRoZXNlIGZlYXR1cmVzLiBLbm93aW5nIHRoaXMgaW5mb3JtYXRpb24gd2lsbCBncmVhdGx5IGhlbHAgd2hlbiBpbnZlc3RpZ2F0aW5nIGlzc3VlcyB3aXRoIEJQRi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgQlBGX1NZU0NBTEwmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpbml0LyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzOTAxCgkJCQkJCQlvdXRwdXQ6IDIxCgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhpbmtpbmcgaXQ6CgoqKkxvY2F0aW5nIHRoZSBCUEZfU1lTQ0FMTCBDb25maWd1cmF0aW9uKioKCk9rYXksIHNvIEkgbmVlZCB0byB0cmFjayBkb3duIHRoZSBkZWZpbml0aW9uIG9mIGBjb25maWcgQlBGX1NZU0NBTExgIGluIHRoZSBLY29uZmlnIGZpbGVzLiBUaGlzIGlzIGxpa2VseSBhIGtleSBjb25maWd1cmF0aW9uIG9wdGlvbiBmb3IgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIEJQRiBzeXNjYWxsIGZ1bmN0aW9uYWxpdHksIGFuZCB1bmRlcnN0YW5kaW5nIGl0cyBkZXBlbmRlbmNpZXMgYW5kIGxvY2F0aW9uIHdpbGwgYmUgZXNzZW50aWFsIGZvciB3aGF0ZXZlciBJJiMzOTttIHdvcmtpbmcgb24uIFRpbWUgdG8gZGl2ZSBpbnRvIHRoZSBrZXJuZWwgc291cmNlIHRyZWUuIExldCYjMzk7cyBzZWUgaWYgYSBxdWljayBgZ3JlcGAgd2lsbCBnZXQgbWUgc3RhcnRlZCwgYnV0IEkmIzM5O20gZXhwZWN0aW5nIHRoaXMgb3B0aW9uIHRvIGJlIHByZXR0eSB3aWRlc3ByZWFkIHNvIEkgbWF5IG5lZWQgdG8gdXNlIGEgbW9yZSBwcmVjaXNlIG1ldGhvZCB0byBsb2NhdGUgaXQgd2l0aGluIHRoZSBLY29uZmlnIGhpZXJhcmNoeS4gTGV0JiMzOTtzIHN0YXJ0IHdpdGggYSBiYXNpYyBzZWFyY2ggdGhvdWdoLiBIb3BlZnVsbHksIGl0JiMzOTtzIG5vdCBidXJpZWQgdG9vIGRlZXAgd2l0aGluIGFuIGluY2x1ZGUsIGFuZCBJIGNhbiBxdWlja2x5IGFzY2VydGFpbiBpdHMgcGxhY2Ugd2l0aGluIHRoZSBicm9hZGVyIHN5c3RlbS4gSSYjMzk7bGwgYmUga2VlcGluZyBhbiBleWUgb3V0IGZvciBhbnkgc3Vycm91bmRpbmcgY29udGV4dCwgbGlrZSBgZGVwZW5kcyBvbmAgc3RhdGVtZW50cyBvciBkZWZhdWx0IHZhbHVlcywgYXMgdGhhdCB3aWxsIHByb3ZpZGUgdmFsdWFibGUgaW5zaWdodCBpbnRvIGhvdyB0aGlzIG9wdGlvbiBpbnRlcmFjdHMgd2l0aCBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsLiBPbmNlIEkgaGF2ZSB0aGUgZGVmaW5pdGl2ZSBLY29uZmlnIGZpbGUsIEkmIzM5O2xsIGFuYWx5emUgdGhlIHN1cnJvdW5kaW5nIGJsb2Nrcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIEJQRl9TWVNDQUxMJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvS2NvbmZpZz0yOT1tZW51IFwmIzM0O0JQRiBzdWJzeXN0ZW1cJiMzNDtcbmtlcm5lbC9icGYvS2NvbmZpZy0zMC1cbmtlcm5lbC9icGYvS2NvbmZpZzozMTpjb25maWcgQlBGX1NZU0NBTExcbmtlcm5lbC9icGYvS2NvbmZpZy0zMi1cdGJvb2wgXCYjMzQ7RW5hYmxlIGJwZigpIHN5c3RlbSBjYWxsXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0MjYwCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gcmVhZGluZyB0aGUgcHJvdmlkZWQgdGV4dDoKCioqQlBGIENvbmZpZ3VyYXRpb24gVGhvdWdodHMqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGUgYGtlcm5lbC9icGYvS2NvbmZpZ2AgZmlsZS4gSSYjMzk7bSBmb2N1c2luZyBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgMzEuIEJhc2VkIG9uIG15IGV4cGVyaWVuY2UsIEkmIzM5O20gZXhwZWN0aW5nIHRvIHNlZSB0aGUgY29yZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBCUEYsIGxpa2VseSB0aGUgZ2VuZXJhbCBlbmFibGUvZGlzYWJsZSBzd2l0Y2gsIG9yIG1heWJlIHNvbWUgZnVuZGFtZW50YWwgZmVhdHVyZXMgdGhhdCBhcmUgY29uc2lkZXJlZCBjcml0aWNhbC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBjb250cm9scyB0aGUgYmFzaWMgYnVpbGRpbmcgYmxvY2tzIGhlcmUuIExldCYjMzk7cyBzZWUgaWYgdGhpcyBsaW5lIGlzIGNvbnRyb2xsaW5nIHRoZSBjb3JlIG9yIHNvbWV0aGluZyBzcGVjaWZpYyB0byB0aGUgYXJjaGl0ZWN0dXJlIEkgYW0gc3R1ZHlpbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAyNTpcdCMgZGVmYXVsdCBmb3Iga2VybmVscyB0aGF0IHdlcmUgY29tcGlsZWQgd2l0aCBCUEYgSklUIHN1cHBvcnQuXG4gIDI2Olx0Y29uZmlnIEFSQ0hfV0FOVF9ERUZBVUxUX0JQRl9KSVRcbiAgMjc6XHRcdGJvb2xcbiAgMjg6XHRcbiAgMjk6XHRtZW51IFwmIzM0O0JQRiBzdWJzeXN0ZW1cJiMzNDtcbiAgMzA6XHRcbiAgMzE6XHRjb25maWcgQlBGX1NZU0NBTExcbiAgMzI6XHRcdGJvb2wgXCYjMzQ7RW5hYmxlIGJwZigpIHN5c3RlbSBjYWxsXCYjMzQ7XG4gIDMzOlx0XHRzZWxlY3QgQlBGXG4gIDM0Olx0XHRzZWxlY3QgSVJRX1dPUktcbiAgMzU6XHRcdHNlbGVjdCBORUVEX1RBU0tTX1JDVVxuICAzNjpcdFx0c2VsZWN0IFRBU0tTX1RSQUNFX1JDVVxuICAzNzpcdFx0c2VsZWN0IEJJTkFSWV9QUklOVEZcbiAgMzg6XHRcdHNlbGVjdCBORVRfU09DS19NU0cgaWYgTkVUXG4gIDM5Olx0XHRzZWxlY3QgTkVUX1hHUkVTUyBpZiBORVRcbiAgNDA6XHRcdHNlbGVjdCBQQUdFX1BPT0wgaWYgTkVUXG4gIDQxOlx0XHRkZWZhdWx0IG5cbiAgNDI6XHRcdGhlbHBcbiAgNDM6XHRcdCAgRW5hYmxlIHRoZSBicGYoKSBzeXN0ZW0gY2FsbCB0aGF0IGFsbG93cyB0byBtYW5pcHVsYXRlIEJQRiBwcm9ncmFtc1xuICA0NDpcdFx0ICBhbmQgbWFwcyB2aWEgZmlsZSBkZXNjcmlwdG9ycy5cbiAgNDU6XHRcbiAgNDY6XHRjb25maWcgQlBGX0pJVFxuICA0NzpcdFx0Ym9vbCBcJiMzNDtFbmFibGUgQlBGIEp1c3QgSW4gVGltZSBjb21waWxlclwmIzM0O1xuICA0ODpcdFx0ZGVwZW5kcyBvbiBCUEZcbiAgNDk6XHRcdGRlcGVuZHMgb24gSEFWRV9DQlBGX0pJVCB8fCBIQVZFX0VCUEZfSklUXG4gIDUwOlx0XHRzZWxlY3QgRVhFQ01FTVxuICA1MTpcdFx0aGVscFxuICA1MjpcdFx0ICBCUEYgcHJvZ3JhbXMgYXJlIG5vcm1hbGx5IGhhbmRsZWQgYnkgYSBCUEYgaW50ZXJwcmV0ZXIuIFRoaXMgb3B0aW9uXG4gIDUzOlx0XHQgIGFsbG93cyB0aGUga2VybmVsIHRvIGdlbmVyYXRlIG5hdGl2ZSBjb2RlIHdoZW4gYSBwcm9ncmFtIGlzIGxvYWRlZFxuICA1NDpcdFx0ICBpbnRvIHRoZSBrZXJuZWwuIFRoaXMgd2lsbCBzaWduaWZpY2FudGx5IHNwZWVkLXVwIHByb2Nlc3Npbmcgb2YgQlBGXG4gIDU1Olx0XHQgIHByb2dyYW1zLlxuICA1NjpcdFxuICA1NzpcdFx0ICBOb3RlLCBhbiBhZG1pbiBzaG91bGQgZW5hYmxlIHRoaXMgZmVhdHVyZSBjaGFuZ2luZzpcbiAgNTg6XHRcdCAgL3Byb2Mvc3lzL25ldC9jb3JlL2JwZl9qaXRfZW5hYmxlXG4gIDU5Olx0XHQgIC9wcm9jL3N5cy9uZXQvY29yZS9icGZfaml0X2hhcmRlbiAgIChvcHRpb25hbClcbiAgNjA6XHRcdCAgL3Byb2Mvc3lzL25ldC9jb3JlL2JwZl9qaXRfa2FsbHN5bXMgKG9wdGlvbmFsKVxuICA2MTpcdFxuICA2MjpcdGNvbmZpZyBCUEZfSklUX0FMV0FZU19PTlxuICA2MzpcdFx0Ym9vbCBcJiMzNDtQZXJtYW5lbnRseSBlbmFibGUgQlBGIEpJVCBhbmQgcmVtb3ZlIEJQRiBpbnRlcnByZXRlclwmIzM0O1xuICA2NDpcdFx0ZGVwZW5kcyBvbiBCUEZfU1lTQ0FMTCBcdTAwMjZcdTAwMjYgSEFWRV9FQlBGX0pJVCBcdTAwMjZcdTAwMjYgQlBGX0pJVFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxMjoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTAyNQoJCQkJCQkJb3V0cHV0OiAxODAKCQkJCQkJCXRob3VnaHRzOiA3NTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQlRGIEFjeWNsaWNpdHkgQ2hlY2sgYW5kIE93bmVyc2hpcCBEZXB0aCBWYWxpZGF0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBteSBpbml0aWFsIHRob3VnaHQgaXM6IGBCUEZfU1lTQ0FMTGAgc2VlbXMgbGlrZSB0aGUga2V5IGNvbmZpZyBmbGFnIGhlcmUuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlbiYjMzk7dCBhbnkgb3RoZXIgaGlkZGVuIGRlcGVuZGVuY2llcyBmb3IgQlRGIGZ1bmN0aW9uYWxpdHkuIElzIGBDT05GSUdfREVCVUdfSU5GT19CVEZgIGFsc28gbmVlZGVkLCBvciBpcyBgYnRmLm9gIGJ1aWx0IGRpcmVjdGx5IHdoZW4gYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgZW5hYmxlZD8gTGV0JiMzOTtzIGNoZWNrIHRoZSBga2VybmVsL2JwZi9NYWtlZmlsZWAuLi4gWWVwLCB0aGVyZSBpdCBpczogYG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IGJ0Zi5vIG1lbWFsbG9jLm8gcnFzcGlubG9jay5vIHN0cmVhbS5vYC4gU28gYENPTkZJR19CUEZfU1lTQ0FMTGAgKmRvZXMqIGNvbXBpbGUgYGJ0Zi5vYC4gR29vZC4KCk5vdywgbGV0JiMzOTtzIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyBmdW5jdGlvbnMgdGhpcyBwYXRjaCBpcyBtb2RpZnlpbmcgb3IgYWRkaW5nIOKAkyB0aGUgRm9jdXNTeW1ib2xzLCBzbyB0byBzcGVhay4gTG9va2luZyBhdCBga2VybmVsL2JwZi9idGYuY2AsIEkgc2VlIHRoZXNlIGNoYW5nZWQgZnVuY3Rpb25zOgoKMS4gIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYAoyLiAgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgCjMuICBgYnRmX293bmVkX3R5cGVfaWR4YAo0LiAgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYAo1LiAgYGJ0Zl9wYXJzZWAgKGNhbGxlciBpbnNpZGUgYGJ0Zi5jYCkKNi4gIGBidGZfbmV3X2ZkYCAoQlRGIGxvYWQgZW50cnlwb2ludCkKCkFyZSBhbnkgb2YgdGhlc2UgdWJpcXVpdG91cz8gVGhleSBhcmUgY2xlYXJseSBmb2N1c2VkIG9uIEJURiwgYW5kIG5vdCB1c2VkIGV2ZXJ5d2hlcmUgaW4gdGhlIGtlcm5lbC4gTGV0JiMzOTtzIG1ha2Ugc3VyZS4KCiogICBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAgLSBzdGF0aWMsIG5ldwoqICAgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgIC0gc3RhdGljLCBuZXcKKiAgIGBidGZfb3duZWRfdHlwZV9pZHhgIC0gc3RhdGljLCBuZXcKKiAgIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2AgLSBnbG9iYWwgZnVuY3Rpb24sIG1vZGlmaWVkCiogICBgYnRmX3BhcnNlYCAtIHN0YXRpYyBmdW5jdGlvbiwgbW9kaWZpZWQgY2FsbGVyCiogICBgYnRmX25ld19mZGAgLSBnbG9iYWwgZnVuY3Rpb24KClNpbmNlIHRoZXkgYXJlIGluIGEgQyBmaWxlIGluIGtlcm5lbC9icGYvYnRmLmMsIGV2ZW4gc3RhdGljIGZ1bmN0aW9ucyBpbiB2bWxpbnV4IGhhdmUgc3ltYm9scyBpbiBrYWxsc3ltcyAodW5sZXNzIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyKS4gTGlzdGluZyBzdGF0aWMgZnVuY3Rpb25zIGFuZCBub24tc3RhdGljIG9uZXMgbGlrZSBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIGFuZCBgYnRmX25ld19mZGAgZW5zdXJlcyB0aGUgZnV6emVyIGhpdHMgdGhlbS4KCk9rYXksIGxldCYjMzk7cyBqdXN0IGRvdWJsZS1jaGVjayBldmVyeXRoaW5nIHRvIGJlIGNlcnRhaW4uIFdlJiMzOTtyZSBnb29kIHRvIGdvLgoKKiAgIFdvcnRoRnV6emluZzogVHJ1ZQoqICAgRW5hYmxlQ29uZmlnczogXFsmIzM0O0JQRlxfU1lTQ0FMTCYjMzQ7XF0KKiAgIEZvY3VzU3ltYm9sczogXFsKICAgICogICAmIzM0O2J0ZlxfY2hlY2tcX293bmVyc2hpcFxfZGVwdGgmIzM0OywKICAgICogICAmIzM0O2J0Zlxfb3duZXJzaGlwXF9kZXB0aCYjMzQ7LAogICAgKiAgICYjMzQ7YnRmXF9vd25lZFxfdHlwZVxfaWR4JiMzNDssCiAgICAqICAgJiMzNDtidGZcX2NoZWNrXF9hbmRcX2ZpeHVwXF9maWVsZHMmIzM0OywKICAgICogICAmIzM0O2J0ZlxfcGFyc2UmIzM0OywKICAgICogICAmIzM0O2J0ZlxfbmV3XF9mZCYjMzQ7CiAgICBcXQoKRmluYWxseSwgdGhlIHJlYXNvbmluZzogVGhpcyBwYXRjaCBpcyByZWZhY3RvcmluZyB0aGUgYWN5Y2xpY2l0eSBjaGVjayBmb3IgQlRGIHN0cnVjdHVyZXMgYW5kIGFkZGluZyBhIG5ldyByZWN1cnNpdmUgZGVwdGggdmFsaWRhdGlvbiBhbGdvcml0aG0gKGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCwgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgLCBgYnRmX293bmVkX3R5cGVfaWR4YCkgdG8gZW5mb3JjZSBvd25lcnNoaXAgZ3JhcGggZGVwdGggbGltaXRzIGFuZCBkZXRlY3QgY3ljbGVzIGFjcm9zcyBncmFwaCByb290cyBhbmQgbG9jYWwga3B0cnMgZHVyaW5nIEJURiBsb2FkaW5nLiBUaGlzICptb2RpZmllcyogcmVhY2hhYmxlIGxvZ2ljIGluIHRoZSBjb3JlIEJQRiBzdWJzeXN0ZW0gZXhwb3NlZCB2aWEgdGhlIGBCUEZfQlRGX0xPQURgIGNvbW1hbmQgb2YgdGhlIGBicGYoKWAgc3lzY2FsbC4KCkFsbCBjbGVhciwgYWxsIHZlcmlmaWVkLiBJJiMzOTttIHJlYWR5IHRvIGNhbGwgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCYjMzQ7LAogICAgJiMzNDtidGZfb3duZXJzaGlwX2RlcHRoJiMzNDssCiAgICAmIzM0O2J0Zl9vd25lZF90eXBlX2lkeCYjMzQ7LAogICAgJiMzNDtidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyYjMzQ7LAogICAgJiMzNDtidGZfcGFyc2UmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgQlRGIHZhbGlkYXRpb24gbG9naWMgaW4gdGhlIEJQRiBzdWJzeXN0ZW0gYnkgcmVwbGFjaW5nIHRoZSBncmFwaCByb290IGFjeWNsaWNpdHkgY2hlY2sgd2l0aCBhIG5ldyBvd25lcnNoaXAgZGVwdGggYW5kIGN5Y2xlIGRldGVjdGlvbiBhbGdvcml0aG0gKGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGggYW5kIGJ0Zl9vd25lcnNoaXBfZGVwdGgpIGNvdmVyaW5nIGJvdGggZ3JhcGggcm9vdHMgYW5kIGxvY2FsIGtwdHJzLiBUaGVzZSBjaGFuZ2VzIGFyZSByZWFjaGFibGUgdmlhIHRoZSBCUEZfQlRGX0xPQUQgY29tbWFuZCBpbiB0aGUgYnBmKCkgc3lzdGVtIGNhbGwgYW5kIHdhcnJhbnQgZnV6emluZyB0byB2ZXJpZnkgZ3JhcGggdHJhdmVyc2FsIGNvcnJlY3RuZXNzIGFuZCBib3VuZCBlbmZvcmNlbWVudC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoJiMzNDssCiAgICAmIzM0O2J0Zl9vd25lcnNoaXBfZGVwdGgmIzM0OywKICAgICYjMzQ7YnRmX293bmVkX3R5cGVfaWR4JiMzNDssCiAgICAmIzM0O2J0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzJiMzNDssCiAgICAmIzM0O2J0Zl9wYXJzZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBCVEYgdmFsaWRhdGlvbiBsb2dpYyBpbiB0aGUgQlBGIHN1YnN5c3RlbSBieSByZXBsYWNpbmcgdGhlIGdyYXBoIHJvb3QgYWN5Y2xpY2l0eSBjaGVjayB3aXRoIGEgbmV3IG93bmVyc2hpcCBkZXB0aCBhbmQgY3ljbGUgZGV0ZWN0aW9uIGFsZ29yaXRobSAoYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCBhbmQgYnRmX293bmVyc2hpcF9kZXB0aCkgY292ZXJpbmcgYm90aCBncmFwaCByb290cyBhbmQgbG9jYWwga3B0cnMuIFRoZXNlIGNoYW5nZXMgYXJlIHJlYWNoYWJsZSB2aWEgdGhlIEJQRl9CVEZfTE9BRCBjb21tYW5kIGluIHRoZSBicGYoKSBzeXN0ZW0gY2FsbCBhbmQgd2FycmFudCBmdXp6aW5nIHRvIHZlcmlmeSBncmFwaCB0cmF2ZXJzYWwgY29ycmVjdG5lc3MgYW5kIGJvdW5kIGVuZm9yY2VtZW50LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxMjoyOTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI5PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggdXBkYXRlcyB0aGUgQlRGIHZlcmlmaWVyIHRvIHZhbGlkYXRlIG93bmVyc2hpcCBhY3ljbGljaXR5IGFuZCBlbmZvcmNlIGEgbWF4aW11bSBvd25lcnNoaXAgZGVwdGggKEJURl9NQVhfT1dORVJTSElQX0RFUFRIKSBhY3Jvc3MgQlBGIGdyYXBoIHJvb3RzIGFuZCBsb2NhbCBrcHRycy5cblxuTWVtb3J5IHNhZmV0eSBhbmFseXNpczpcbjEuIFRoZSB0ZW1wb3JhcnkgZGVwdGggYXJyYXkgdXNlZCBkdXJpbmcgb3duZXJzaGlwIHRyYXZlcnNhbCBpcyBhbGxvY2F0ZWQgdmlhIGt2Y2FsbG9jKCksIGVuc3VyaW5nIGl0IGlzIGZ1bGx5IHplcm8taW5pdGlhbGl6ZWQuXG4yLiBBbGwgbG9jYWwgdmFyaWFibGVzIGluIGJ0Zl9vd25lcnNoaXBfZGVwdGgoKSwgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCgpLCBhbmQgYnRmX293bmVkX3R5cGVfaWR4KCkgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXG4zLiBObyBkYXRhIHN0cnVjdHVyZXMgb3IgYnVmZmVycyBhcmUgY29waWVkIHRvIHVzZXIgc3BhY2UsIGFuZCBubyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkIG9yIHVzZWQgaW4gY29uZGl0aW9uYWwgYnJhbmNoaW5nLlxuNC4gQW55IHBvdGVudGlhbCBpc3N1ZXMgd2l0aCBwb2ludGVyIGFyaXRobWV0aWMgb3IgYXJyYXkgaW5kZXhpbmcgaW50byB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIHdvdWxkIGJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTi5cblxuVGhlcmVmb3JlLCB0aGlzIGNoYW5nZSBkb2VzIG5vdCBpbnRyb2R1Y2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCBuZWVkZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA3YjViOGY2NzY1NzkyYjM2ODYwMGFlNWE2NGJmYjc3YmQxMWE5MmU5CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFN1biBTZXAgNiAxMjoyNzozMiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvYnRmLmMgYi9rZXJuZWwvYnBmL2J0Zi5jCmluZGV4IDljMmNhYjA4YmI3OTQuLjNjNTA4ZWJiMjQzODQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvYnRmLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9idGYuYwpAQCAtNDI2OSwxMyAmIzQzOzQyNjksMTAgQEAgaW50IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYykKIHsKIAlpbnQgaTsKIAotCS8qIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyB0aGF0IHNpZ25pZnkgb3duZXJzaGlwIG9mIHNvbWUgb3RoZXIgdHlwZToKLQkgKiAga3B0cl9yZWYsIGJwZl9saXN0X2hlYWQsIGJwZl9yYl9yb290LgotCSAqIGtwdHJfcmVmIG9ubHkgc3VwcG9ydHMgc3RvcmluZyBrZXJuZWwgdHlwZXMsIHdoaWNoIGNhbiYjMzk7dCBzdG9yZQotCSAqIHJlZmVyZW5jZXMgdG8gcHJvZ3JhbSBhbGxvY2F0ZWQgbG9jYWwgdHlwZXMuCi0JICoKLQkgKiBIZW5jZSB3ZSBvbmx5IG5lZWQgdG8gZW5zdXJlIHRoYXQgYnBmX3tsaXN0X2hlYWQscmJfcm9vdH0gb3duZXJzaGlwCi0JICogZG9lcyBub3QgZm9ybSBjeWNsZXMuCiYjNDM7CS8qCiYjNDM7CSAqIENoZWNrIGZpZWxkcyB3aGljaCByZXF1aXJlIHRoZSBjb21wbGV0ZSBCVEYgYW5kIGluaXRpYWxpemUgcnVudGltZQomIzQzOwkgKiBtZXRhZGF0YS4gT3duZXJzaGlwIHJlbGF0aW9uc2hpcHMgYXJlIHZhbGlkYXRlZCBhZnRlciBldmVyeSByZWNvcmQgaGFzCiYjNDM7CSAqIGJlZW4gZml4ZWQgdXAuCiAJICovCiAJaWYgKElTX0VSUl9PUl9OVUxMKHJlYykgfHwgIShyZWMtJmd0O2ZpZWxkX21hc2sgJmFtcDsgKEJQRl9HUkFQSF9ST09UIHwgQlBGX1VQVFIpKSkKIAkJcmV0dXJuIDA7CkBAIC00MzA2LDUxICYjNDM7NDMwMyw4OCBAQCBpbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKQogCQlpZiAoIW1ldGEpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJcmVjLSZndDtmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9yZWMgPSBtZXRhLSZndDtyZWNvcmQ7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQogCi0JCS8qIFdlIG5lZWQgdG8gc2V0IHZhbHVlX3JlYyBmb3IgYWxsIHJvb3QgdHlwZXMsIGJ1dCBubyBuZWVkCi0JCSAqIHRvIGNoZWNrIG93bmVyc2hpcCBjeWNsZSBmb3IgYSB0eXBlIHVubGVzcyBpdCYjMzk7cyBhbHNvIGEKLQkJICogbm9kZSB0eXBlLgotCQkgKi8KLQkJaWYgKCEocmVjLSZndDtmaWVsZF9tYXNrICZhbXA7IEJQRl9HUkFQSF9OT0RFKSkKJiM0MztzdGF0aWMgaW50IGJ0Zl9vd25lZF90eXBlX2lkeChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsCiYjNDM7CQkJICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9maWVsZCAqZmllbGQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhICptZXRhOwomIzQzOwl1MzIgYnRmX2lkOwomIzQzOwomIzQzOwlpZiAoZmllbGQtJmd0O3R5cGUgJmFtcDsgQlBGX0dSQVBIX1JPT1QpIHsKJiM0MzsJCWJ0Zl9pZCA9IGZpZWxkLSZndDtncmFwaF9yb290LnZhbHVlX2J0Zl9pZDsKJiM0MzsJfSBlbHNlIGlmIChmaWVsZC0mZ3Q7dHlwZSA9PSBCUEZfS1BUUl9SRUYgfHwgZmllbGQtJmd0O3R5cGUgPT0gQlBGX0tQVFJfUEVSQ1BVKSB7CiYjNDM7CQlpZiAoYnRmX2lzX2tlcm5lbChmaWVsZC0mZ3Q7a3B0ci5idGYpKQomIzQzOwkJCXJldHVybiAtRU5PRU5UOwomIzQzOwkJYnRmX2lkID0gZmllbGQtJmd0O2twdHIuYnRmX2lkOwomIzQzOwl9IGVsc2UgewomIzQzOwkJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbWV0YSA9IGJ0Zl9maW5kX3N0cnVjdF9tZXRhKGJ0ZiwgYnRmX2lkKTsKJiM0MzsJaWYgKCFtZXRhKQomIzQzOwkJcmV0dXJuIGZpZWxkLSZndDt0eXBlICZhbXA7IEJQRl9HUkFQSF9ST09UID8gLUVGQVVMVCA6IC1FTk9FTlQ7CiYjNDM7CXJldHVybiBtZXRhIC0gdGFiLSZndDt0eXBlczsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBFYWNoIG93bmVyc2hpcCBlZGdlIGFkZHMga2VybmVsIGZyYW1lcyB0aHJvdWdoIGJwZl9vYmpfZnJlZV9maWVsZHMoKSBhbmQKJiM0MzsgKiBfX2JwZl9vYmpfZHJvcF9pbXBsKCkuIEtlZXAgdGhlIGJvdW5kIGRlbGliZXJhdGVseSBzbWFsbCBiZWNhdXNlIG9iamVjdAomIzQzOyAqIGRlc3RydWN0aW9uIGNhbiBpdHNlbGYgcnVuIGJlbG93IGEgQlBGIGNhbGwgY2hhaW4uIEEgZmluYWwgcG9pbnRlZSB3aXRob3V0CiYjNDM7ICogc3BlY2lhbCBmaWVsZHMgaXMgbm90IHByZXNlbnQgaW4gdGhlIHN0cnVjdCBtZXRhZGF0YSB0YWJsZSBhbmQgYWRkcyBvbmx5IGEKJiM0MzsgKiBub24tcmVjdXJzaW5nIGRyb3AuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCA4CiYjNDM7CiYjNDM7c3RhdGljIGludCBidGZfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwKJiM0MzsJCQkgICAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYiwgdTggKmRlcHRoLAomIzQzOwkJCSAgICAgICBpbnQgaWR4LCBpbnQgZGVwdGhfbGVmdCkKJiM0Mzt7CiYjNDM7CWNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMgPSB0YWItJmd0O3R5cGVzW2lkeF0ucmVjb3JkOwomIzQzOwlpbnQgaSwgcmV0LCBtYXhfZGVwdGggPSAwOwomIzQzOwomIzQzOwlpZiAoIWRlcHRoX2xlZnQpCiYjNDM7CQlyZXR1cm4gLUVMT09QOwomIzQzOwlpZiAoZGVwdGhbaWR4XSkKJiM0MzsJCWdvdG8gZG9uZTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IHJlYy0mZ3Q7Y250OyBpJiM0MzsmIzQzOykgewomIzQzOwkJcmV0ID0gYnRmX293bmVkX3R5cGVfaWR4KGJ0ZiwgdGFiLCAmYW1wO3JlYy0mZ3Q7ZmllbGRzW2ldKTsKJiM0MzsJCWlmIChyZXQgPT0gLUVOT0VOVCkKIAkJCWNvbnRpbnVlOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJCXJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCByZXQsIGRlcHRoX2xlZnQgLSAxKTsKJiM0MzsJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CQltYXhfZGVwdGggPSBtYXgobWF4X2RlcHRoLCByZXQpOwomIzQzOwl9CiYjNDM7CWRlcHRoW2lkeF0gPSBtYXhfZGVwdGggJiM0MzsgMTsKJiM0Mztkb25lOgomIzQzOwlyZXR1cm4gZGVwdGhbaWR4XSAmZ3Q7IGRlcHRoX2xlZnQgPyAtRUxPT1AgOiBkZXB0aFtpZHhdOwomIzQzO30KIAotCQkvKiBXZSBuZWVkIHRvIGVuc3VyZSBvd25lcnNoaXAgYWN5Y2xpY2l0eSBhbW9uZyBhbGwgdHlwZXMuIFRoZQotCQkgKiBwcm9wZXIgd2F5IHRvIGRvIGl0IHdvdWxkIGJlIHRvIHRvcG9sb2dpY2FsbHkgc29ydCBhbGwgQlRGCi0JCSAqIElEcyBiYXNlZCBvbiB0aGUgb3duZXJzaGlwIGVkZ2VzLCBzaW5jZSB0aGVyZSBjYW4gYmUgbXVsdGlwbGUKLQkJICogYnBmX3tsaXN0X2hlYWQscmJfbm9kZX0gaW4gYSB0eXBlLiBJbnN0ZWFkLCB3ZSB1c2UgdGhlCi0JCSAqIGZvbGxvd2luZyByZXNhb25pbmc6Ci0JCSAqCi0JCSAqIC0gQSB0eXBlIGNhbiBvbmx5IGJlIG93bmVkIGJ5IGFub3RoZXIgdHlwZSBpbiB1c2VyIEJURiBpZiBpdAotCQkgKiAgIGhhcyBhIGJwZl97bGlzdCxyYn1fbm9kZS4gTGV0JiMzOTtzIGNhbGwgdGhlc2Ugbm9kZSB0eXBlcy4KLQkJICogLSBBIHR5cGUgY2FuIG9ubHkgX293bl8gYW5vdGhlciB0eXBlIGluIHVzZXIgQlRGIGlmIGl0IGhhcyBhCi0JCSAqICAgYnBmX3tsaXN0X2hlYWQscmJfcm9vdH0uIExldCYjMzk7cyBjYWxsIHRoZXNlIHJvb3QgdHlwZXMuCi0JCSAqCi0JCSAqIFdlIGVuc3VyZSB0aGF0IGlmIGEgdHlwZSBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgaXRzCi0JCSAqIGVsZW1lbnQgdHlwZXMgY2Fubm90IGJlIHJvb3QgdHlwZXMuCi0JCSAqCi0JCSAqIFRvIGVuc3VyZSBhY3ljbGljaXR5OgotCQkgKgotCQkgKiBXaGVuIEEgaXMgYW4gcm9vdCB0eXBlIGJ1dCBub3QgYSBub2RlLCBpdHMgb3duZXJzaGlwCi0JCSAqIGNoYWluIGNhbiBiZToKLQkJICoJQSAtJmd0OyBCIC0mZ3Q7IEMKLQkJICogV2hlcmU6Ci0JCSAqIC0gQSBpcyBhbiByb290LCBlLmcuIGhhcyBicGZfcmJfcm9vdC4KLQkJICogLSBCIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBlLmcuIGhhcyBicGZfcmJfbm9kZSBhbmQKLQkJICogICBicGZfbGlzdF9oZWFkLgotCQkgKiAtIEMgaXMgb25seSBhbiByb290LCBlLmcuIGhhcyBicGZfbGlzdF9ub2RlCi0JCSAqCi0JCSAqIFdoZW4gQSBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgc29tZSBvdGhlciB0eXBlIGFscmVhZHkKLQkJICogb3ducyBpdCBpbiB0aGUgQlRGIGRvbWFpbiwgaGVuY2UgaXQgY2FuIG5vdCBvd24KLQkJICogYW5vdGhlciByb290IHR5cGUgdGhyb3VnaCBhbnkgb2YgdGhlIG93bmVyc2hpcCBlZGdlcy4KLQkJICoJQSAtJmd0OyBCCi0JCSAqIFdoZXJlOgotCQkgKiAtIEEgaXMgYm90aCBhbiByb290IGFuZCBub2RlLgotCQkgKiAtIEIgaXMgb25seSBhbiBub2RlLgotCQkgKi8KLQkJaWYgKG1ldGEtJmd0O3JlY29yZC0mZ3Q7ZmllbGRfbWFzayAmYW1wOyBCUEZfR1JBUEhfUk9PVCkKLQkJCXJldHVybiAtRUxPT1A7CiYjNDM7c3RhdGljIGludCBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwKJiM0MzsJCQkJICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKQomIzQzO3sKJiM0MzsJdTggKmRlcHRoOwomIzQzOwlpbnQgaSwgcmV0ID0gMDsKJiM0MzsKJiM0MzsJZGVwdGggPSBrdmNhbGxvYyh0YWItJmd0O2NudCwgc2l6ZW9mKCpkZXB0aCksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1dBUk4pOwomIzQzOwlpZiAoIWRlcHRoKQomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyB0YWItJmd0O2NudDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCBpLAomIzQzOwkJCQkJICBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCk7CiYjNDM7CQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCQlicmVhazsKJiM0MzsJCXJldCA9IDA7CiAJfQotCXJldHVybiAwOwomIzQzOwlrdmZyZWUoZGVwdGgpOwomIzQzOwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2J0Zl9zdHJ1Y3Rfc2hvdyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCwKQEAgLTYwNDUsNiAmIzQzOzYwNzksMTAgQEAgc3RhdGljIHN0cnVjdCBidGYgKmJ0Zl9wYXJzZShjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsCiAJCQlpZiAoZXJyICZsdDsgMCkKIAkJCQlnb3RvIGVycm91dF9tZXRhOwogCQl9CiYjNDM7CiYjNDM7CQllcnIgPSBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGJ0Ziwgc3RydWN0X21ldGFfdGFiKTsKJiM0MzsJCWlmIChlcnIgJmx0OyAwKQomIzQzOwkJCWdvdG8gZXJyb3V0X21ldGE7CiAJfQogCiAJZXJyID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCAmYW1wO2Vudi0mZ3Q7bG9nKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jCmluZGV4IGMzZDEzM2M2YTAwZDQuLjUyZmFiYmVlM2RkNWEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuYwpAQCAtNzE0LDcgJiM0Mzs3MTQsNyBAQCBzdGF0aWMgdm9pZCB0ZXN0X2J0Zih2b2lkKQogCQkJYnJlYWs7CiAKIAkJZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7Ci0JCUFTU0VSVF9FUShlcnIsIC1FTE9PUCwgJiMzNDtjaGVjayBidGYmIzM0Oyk7CiYjNDM7CQlBU1NFUlRfRVEoZXJyLCAwLCAmIzM0O2NoZWNrIGJ0ZiYjMzQ7KTsKIAkJYnRmX19mcmVlKGJ0Zik7CiAJCWJyZWFrOwogCX0KQEAgLTc3Myw3ICYjNDM7NzczLDcgQEAgc3RhdGljIHZvaWQgdGVzdF9idGYodm9pZCkKIAkJCWJyZWFrOwogCiAJCWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwotCQlBU1NFUlRfRVEoZXJyLCAtRUxPT1AsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzOwkJQVNTRVJUX0VRKGVyciwgMCwgJiMzNDtjaGVjayBidGYmIzM0Oyk7CiAJCWJ0Zl9fZnJlZShidGYpOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi44MzY3NDE1NWUzYjc0Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuYwpAQCAtMCwwICYjNDM7MSwyMDIgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2J0Zi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9idGYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dGVzdF9wcm9ncy5oJmd0OwomIzQzOwomIzQzOyNkZWZpbmUgU1BJTl9MT0NLIDIKJiM0MzsjZGVmaW5lIExJU1RfSEVBRCAzCiYjNDM7I2RlZmluZSBMSVNUX05PREUgNAomIzQzOy8qIEtlZXAgaW4gc3luYyB3aXRoIEJURl9NQVhfT1dORVJTSElQX0RFUFRILiAqLwomIzQzOyNkZWZpbmUgTUFYX09XTkVSU0hJUF9ERVBUSCA4CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBidGYgKmluaXRfYnRmKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnRmICpidGY7CiYjNDM7CWludCBpZDsKJiM0MzsKJiM0MzsJYnRmID0gYnRmX19uZXdfZW1wdHkoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgJiMzNDtidGZfX25ld19lbXB0eSYjMzQ7KSkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwlpZCA9IGJ0Zl9fYWRkX2ludChidGYsICYjMzQ7aW50JiMzNDssIDQsIEJURl9JTlRfU0lHTkVEKTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIDEsICYjMzQ7YnRmX19hZGRfaW50JiMzNDspKQomIzQzOwkJZ290byBlcnJfb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7YnBmX3NwaW5fbG9jayYjMzQ7LCA0KTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIFNQSU5fTE9DSywgJiMzNDtidGZfX2FkZF9zdHJ1Y3QgYnBmX3NwaW5fbG9jayYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyX291dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O2JwZl9saXN0X2hlYWQmIzM0OywgMTYpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgTElTVF9IRUFELCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBicGZfbGlzdF9oZWFkJiMzNDspKQomIzQzOwkJZ290byBlcnJfb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7YnBmX2xpc3Rfbm9kZSYjMzQ7LCAyNCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCBMSVNUX05PREUsICYjMzQ7YnRmX19hZGRfc3RydWN0IGJwZl9saXN0X25vZGUmIzM0OykpCiYjNDM7CQlnb3RvIGVycl9vdXQ7CiYjNDM7CXJldHVybiBidGY7CiYjNDM7CiYjNDM7ZXJyX291dDoKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGFkZF9sb2NhbF9rcHRyKHN0cnVjdCBidGYgKmJ0ZiwgaW50IHBvaW50ZWVfaWQsIGNvbnN0IGNoYXIgKnRhZykKJiM0Mzt7CiYjNDM7CWludCBpZDsKJiM0MzsKJiM0MzsJaWQgPSBidGZfX2FkZF90eXBlX3RhZyhidGYsIHRhZywgcG9pbnRlZV9pZCk7CiYjNDM7CWlmICghQVNTRVJUX0dUKGlkLCAwLCAmIzM0O2J0Zl9fYWRkX3R5cGVfdGFnJiMzNDspKQomIzQzOwkJcmV0dXJuIGlkOwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3B0cihidGYsIGlkKTsKJiM0MzsJQVNTRVJUX0dUKGlkLCAwLCAmIzM0O2J0Zl9fYWRkX3B0ciYjMzQ7KTsKJiM0MzsJcmV0dXJuIGlkOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3NlbGZfY3ljbGUoY29uc3QgY2hhciAqdGFnLCBpbnQgZXhwZWN0ZWRfZXJyKQomIzQzO3sKJiM0MzsJc3RydWN0IGJ0ZiAqYnRmOwomIzQzOwlpbnQgaWQsIGVycjsKJiM0MzsKJiM0MzsJYnRmID0gaW5pdF9idGYoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgJiMzNDtpbml0X2J0ZiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJaWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDcsIHRhZyk7CiYjNDM7CWlmIChpZCAmbHQ7PSAwKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDtzZWxmX2N5Y2xlJiMzNDssIDgpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgNywgJiMzNDtidGZfX2FkZF9zdHJ1Y3Qgc2VsZl9jeWNsZSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7bmV4dCYjMzQ7LCA2LCAwLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2J0Zl9fYWRkX2ZpZWxkIHNlbGZfY3ljbGU6Om5leHQmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7CiYjNDM7CUFTU0VSVF9FUShlcnIsIGV4cGVjdGVkX2VyciwgJiMzNDtjaGVjayBidGYmIzM0Oyk7CiYjNDM7b3V0OgomIzQzOwlidGZfX2ZyZWUoYnRmKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9hYmFfY3ljbGUodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZjsKJiM0MzsJaW50IGlkLCBlcnI7CiYjNDM7CiYjNDM7CWJ0ZiA9IGluaXRfYnRmKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7aW5pdF9idGYmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCAxMCwgJiMzNDtrcHRyJiMzNDspOwomIzQzOwlpZiAoaWQgJmx0Oz0gMCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgOSwgJiMzNDtrcHRyJiMzNDspOwomIzQzOwlpZiAoaWQgJmx0Oz0gMCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7Y3ljbGVfYSYjMzQ7LCA4KTsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoaWQsIDksICYjMzQ7YnRmX19hZGRfc3RydWN0IGN5Y2xlX2EmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O2ImIzM0OywgNiwgMCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBjeWNsZV9hOjpiJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDtjeWNsZV9iJiMzNDssIDgpOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgMTAsICYjMzQ7YnRmX19hZGRfc3RydWN0IGN5Y2xlX2ImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O2EmIzM0OywgOCwgMCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBjeWNsZV9iOjphJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpOwomIzQzOwlBU1NFUlRfRVEoZXJyLCAtRUxPT1AsICYjMzQ7Y2hlY2sgYnRmJiMzNDspOwomIzQzO291dDoKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfbWl4ZWRfY3ljbGUodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZjsKJiM0MzsJaW50IGlkLCBlcnI7CiYjNDM7CiYjNDM7CWJ0ZiA9IGluaXRfYnRmKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7aW5pdF9idGYmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA3LCAmIzM0O2twdHImIzM0Oyk7CiYjNDM7CWlmIChpZCAmbHQ7PSAwKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgJiMzNDttaXhlZF9vd25lciYjMzQ7LCAyMCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCA3LCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBtaXhlZF9vd25lciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwllcnIgPSBidGZfX2FkZF9maWVsZChidGYsICYjMzQ7cm9vdCYjMzQ7LCBMSVNUX0hFQUQsIDAsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgbWl4ZWRfb3duZXI6OnJvb3QmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCAmIzM0O2xvY2smIzM0OywgU1BJTl9MT0NLLCAxMjgsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgbWl4ZWRfb3duZXI6OmxvY2smIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWQgPSBidGZfX2FkZF9kZWNsX3RhZyhidGYsICYjMzQ7Y29udGFpbnM6bWl4ZWRfbm9kZTpub2RlJiMzNDssIDcsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9FUShpZCwgOCwgJiMzNDtidGZfX2FkZF9kZWNsX3RhZyBtaXhlZF9vd25lciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsICYjMzQ7bWl4ZWRfbm9kZSYjMzQ7LCAzMik7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCA5LCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBtaXhlZF9ub2RlJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtub2RlJiMzNDssIExJU1RfTk9ERSwgMCwgMCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtidGZfX2FkZF9maWVsZCBtaXhlZF9ub2RlOjpub2RlJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtvd25lciYjMzQ7LCA2LCAxOTIsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgbWl4ZWRfbm9kZTo6b3duZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7CiYjNDM7CUFTU0VSVF9FUShlcnIsIC1FTE9PUCwgJiMzNDtjaGVjayBidGYmIzM0Oyk7CiYjNDM7b3V0OgomIzQzOwlidGZfX2ZyZWUoYnRmKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9hY3ljbGljX2RlcHRoKGludCBkZXB0aCwgaW50IGV4cGVjdGVkX2VycikKJiM0Mzt7CiYjNDM7CWludCBwdHJfaWRbTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxXTsKJiM0MzsJaW50IGZpcnN0X3N0cnVjdF9pZDsKJiM0MzsJc3RydWN0IGJ0ZiAqYnRmOwomIzQzOwlpbnQgaWQsIGVyciwgaTsKJiM0MzsKJiM0MzsJYnRmID0gaW5pdF9idGYoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgJiMzNDtpbml0X2J0ZiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJZmlyc3Rfc3RydWN0X2lkID0gNSAmIzQzOyAyICogZGVwdGg7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBkZXB0aDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXB0cl9pZFtpXSA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgZmlyc3Rfc3RydWN0X2lkICYjNDM7IGkgJiM0MzsgMSwgJiMzNDtrcHRyJiMzNDspOwomIzQzOwkJaWYgKHB0cl9pZFtpXSAmbHQ7PSAwKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBkZXB0aDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWNoYXIgbmFtZVsxNl07CiYjNDM7CiYjNDM7CQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICYjMzQ7b3duZXJfJWQmIzM0OywgaSk7CiYjNDM7CQlpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIDgpOwomIzQzOwkJaWYgKCFBU1NFUlRfRVEoaWQsIGZpcnN0X3N0cnVjdF9pZCAmIzQzOyBpLCAmIzM0O2J0Zl9fYWRkX3N0cnVjdCBvd25lciYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCWVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgJiMzNDtuZXh0JiMzNDssIHB0cl9pZFtpXSwgMCwgMCk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnRmX19hZGRfZmllbGQgb3duZXI6Om5leHQmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsJaWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCAmIzM0O3BsYWluX2xlYWYmIzM0OywgNCk7CiYjNDM7CWlmICghQVNTRVJUX0VRKGlkLCBmaXJzdF9zdHJ1Y3RfaWQgJiM0MzsgZGVwdGgsICYjMzQ7YnRmX19hZGRfc3RydWN0IHBsYWluX2xlYWYmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7CiYjNDM7CUFTU0VSVF9FUShlcnIsIGV4cGVjdGVkX2VyciwgJiMzNDtjaGVjayBidGYmIzM0Oyk7CiYjNDM7b3V0OgomIzQzOwlidGZfX2ZyZWUoYnRmKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X2xvY2FsX2twdHJfb3duZXJzaGlwKHZvaWQpCiYjNDM7ewomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3NlbGZfY3ljbGUmIzM0OykpCiYjNDM7CQl0ZXN0X3NlbGZfY3ljbGUoJiMzNDtrcHRyJiMzNDssIC1FTE9PUCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7dW50cnVzdGVkX3NlbGZfY3ljbGUmIzM0OykpCiYjNDM7CQl0ZXN0X3NlbGZfY3ljbGUoJiMzNDtrcHRyX3VudHJ1c3RlZCYjMzQ7LCAwKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtwZXJjcHVfc2VsZl9jeWNsZSYjMzQ7KSkKJiM0MzsJCXRlc3Rfc2VsZl9jeWNsZSgmIzM0O3BlcmNwdV9rcHRyJiMzNDssIC1FTE9PUCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7QUJBX2N5Y2xlJiMzNDspKQomIzQzOwkJdGVzdF9hYmFfY3ljbGUoKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDttaXhlZF9ncmFwaF9yb290X2N5Y2xlJiMzNDspKQomIzQzOwkJdGVzdF9taXhlZF9jeWNsZSgpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O21heF9hY3ljbGljJiMzNDspKQomIzQzOwkJdGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEgsIDApOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3Rvb19kZWVwX2FjeWNsaWMmIzM0OykpCiYjNDM7CQl0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCAmIzQzOyAxLCAtRUxPT1ApOwomIzQzO30KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDcwMzUKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiA0ODQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBQYXRjaCBmb3IgVW5pbml0aWFsaXplZCBNZW1vcnkgUmlza3MqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIHBhdGNoIGFuZCBzZWUgaWYgd2UgaGF2ZSBhbnkgS01TQU4gY29uY2VybnMgaGVyZS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGdvIG1ldGhvZGljYWxseSB0aHJvdWdoIHRoZSBjaGFuZ2VzLCBmb2N1c2luZyBvbiB3aGVyZSBkYXRhIGlzIGJlaW5nIGhhbmRsZWQgYW5kIGVzcGVjaWFsbHkgd2hlcmUgbWVtb3J5IGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uIGhhcHBlbnMuCgpGaXJzdCwgdGhlIGBrZXJuZWwvYnBmL2J0Zi5jYCBjaGFuZ2VzOiBJdCBsb29rcyBsaWtlIHRoZXkmIzM5O3JlIHJld29ya2luZyB0aGUgb3duZXJzaGlwIHZhbGlkYXRpb24gbG9naWMgd2l0aGluIHRoZSBCVEYgKEJQRiBUeXBlIEZvcm1hdCkgc3lzdGVtLiBTcGVjaWZpY2FsbHksIHRoZXkmIzM5O3ZlIHNoaWZ0ZWQgdGhlIGN5Y2xlIGRldGVjdGlvbiBhbmQgb3duZXJzaGlwIHZhbGlkYXRpb24gYXJvdW5kIHdpdGhpbiBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoKWAuIEludGVyZXN0aW5nIHRoYXQgdGhleSBhcmUgcmVtb3Zpbmcgb2xkZXIgY3ljbGUgZGV0ZWN0aW9uIGFuZCBtb3Zpbmcgb3duZXJzaGlwIHZhbGlkYXRpb24gbGF0ZXIuCgpUaGUgYWRkaXRpb24gb2YgYGJ0Zl9vd25lZF90eXBlX2lkeCgpYCBpbW1lZGlhdGVseSBncmFicyBteSBhdHRlbnRpb24uIEl0JiMzOTtzIHB1cnBvc2UgaXMgdG8gZmluZCB0aGUgc3RydWN0IG1ldGEgaW5kZXggZm9yIGFuIG93bmVkIHR5cGUuIEkgaGF2ZSBhbiBpdGNoIHRoYXQgdGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBhIHBvdGVudGlhbCBwb2ludCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gYmUgZXhwb3NlZCBpZiBub3QgaGFuZGxlZCBjYXJlZnVsbHksIGVzcGVjaWFsbHkgaWYgdGhlcmUgYXJlIGFueSBzdWJ0bGUgY2hhbmdlcyBpbiBob3cgdGhpcyBvd25lcnNoaXAgaW5mb3JtYXRpb24gaXMgdHJhY2tlZCwgb3IgaG93IGl0IGludGVyYWN0cyB3aXRoIGtlcm5lbCBwb2ludGVycywgdGhpcyBpcyB3aGVyZSB0byBsb29rLiBUaGUgdXNlIG9mIGAtRU5PRU5UYCBmb3Iga2VybmVsIGtwdHJzIGlzIGFsc28gd29ydGggbm90aW5nOyB3ZSBuZWVkIHRvIHNlZSBob3cgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgcmVzdCBvZiB0aGUgY29kZS4KCmBidGZfb3duZXJzaGlwX2RlcHRoKClgIHNlZW1zIHByZXR0eSBzdHJhaWdodGZvcndhcmQ7IHJlY3Vyc2l2ZSBkZXB0aCBjYWxjdWxhdGlvbiB3aXRoIG1lbW9pemF0aW9uLCBhbmQgY2hlY2tzIGFnYWluc3QgYEJURl9NQVhfT1dORVJTSElQX0RFUFRIYC4gU2VlbXMgbm9ybWFsIGVub3VnaCwgYWx0aG91Z2ggcmVjdXJzaXZlIGZ1bmN0aW9ucyBhcmUgYWx3YXlzIHdvcnRoIGEgY2xvc2UgbG9vayBpbiB0aGVzZSBjb250ZXh0cy4KCk5vdywgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKWAgaXMgd2hlcmUgdGhpbmdzIGdldCBhIGJpdCBtb3JlIGNyaXRpY2FsLiBXZSBoYXZlIG1lbW9yeSBhbGxvY2F0aW9uIHdpdGggYGt2Y2FsbG9jYCwgd2hpY2ggaXMgZ29vZC4gQnV0LCB3ZSBoYXZlIGEgY2hlY2sgZm9yIGAhZGVwdGhgIGFuZCBhIHJldHVybiBvZiBgLUVOT01FTWAuIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhpcyBgLUVOT01FTWAgaXMgaGFuZGxlZCBjb3JyZWN0bHkgdXAgdGhlIGNhbGwgc3RhY2sgdG8gYXZvaWQgYW55IHBvdGVudGlhbCB1c2UtYWZ0ZXItZnJlZSBvciBvdGhlciBtZW1vcnktcmVsYXRlZCBpc3N1ZXMsIG9yIHBlcmhhcHMgYSBkZW5pYWwgb2Ygc2VydmljZSBpZiBzb21ldGhpbmcgaXNuJiMzOTt0IGhhbmRsZWQuIFdlIGFsc28gbmVlZCB0byBzZWUgaWYgdGhlIGBrdmZyZWUoZGVwdGgpYCBoYXBwZW5zIGluIGFsbCBjb2RlIHBhdGhzIGFzIHRoaXMgaXMgY3JpdGljYWwgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLiBUaGUgZmFjdCB0aGF0IGl0IGNhbGxzIGBidGZfb3duZXJzaGlwX2RlcHRoKClgIGZvciBlYWNoIHN0cnVjdCBtZXRhIGluZGV4IGlzIGFsc28gaW1wb3J0YW50IHRvIGNvbnNpZGVyLgoKRmluYWxseSwgdGhlIGBidGZfcGFyc2UoKWAgY2FsbCB0byBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCgpYCBpcyB0aGUgZW50cnkgcG9pbnQsIHNvIHdlIG5lZWQgdG8gc2VlIGhvdyBlcnJvcnMgaGVyZSBwcm9wYWdhdGUuIFRoaXMgaXMgd2hlcmUgdGhlIG92ZXJhbGwgc2VjdXJpdHkgaW1wbGljYXRpb25zIHN0YXJ0IHRvIHJldmVhbCB0aGVtc2VsdmVzLgoKSSB3aWxsIGFsc28gY2hlY2sgdGhlIHNlbGYgdGVzdHMgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNgIGFuZCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuY2AuCgpJJiMzOTtsbCBuZWVkIHRvIGdvIGJhY2sgYW5kIHRob3JvdWdobHkgaW5zcGVjdCB0aGUgY29kZSBzdXJyb3VuZGluZyB0aGVzZSBmdW5jdGlvbnMsIHNwZWNpZmljYWxseSB0aGUgY29udGV4dCBvZiBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoKWAgYW5kIGBidGZfcGFyc2VgLCB0byB1bmRlcnN0YW5kIHRoZSBjb250cm9sIGZsb3csIGVycm9yIGhhbmRsaW5nLCBhbmQgbWVtb3J5IG1hbmFnZW1lbnQuIFdlIG5lZWQgdG8gYmUgYWJzb2x1dGVseSBzdXJlIHRoYXQgZXZlcnkgY29kZSBwYXRoIGlzIHNhZmUgYW5kIHRoYXQgdGhlcmUgYXJlIG5vIGdhcHMgdGhhdCBjb3VsZCBsZWFkIHRvIEtNU0FOIHRyaWdnZXJpbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2J0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9idGYuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2J0Zi5jPTQxMzU9c3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9wYXJzZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsXG4tLVxua2VybmVsL2JwZi9idGYuYy00MjY3LVxua2VybmVsL2JwZi9idGYuYzo0MjY4OmludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG5rZXJuZWwvYnBmL2J0Zi5jLTQyNjkte1xuLS1cbmtlcm5lbC9icGYvYnRmLmM9NTk5OT1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNzctXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHN0cnVjdF9tZXRhX3RhYi1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG5rZXJuZWwvYnBmL2J0Zi5jOjYwNzg6XHRcdFx0ZXJyID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBzdHJ1Y3RfbWV0YV90YWItXHUwMDNldHlwZXNbaV0ucmVjb3JkKTtcbmtlcm5lbC9icGYvYnRmLmMtNjA3OS1cdFx0XHRpZiAoZXJyIFx1MDAzYyAwKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxMjoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NTAzCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMzkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIGl0OgoKKipEaXZpbmcgaW50byBCVEYgRmllbGQgSGFuZGxpbmcqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBpbnRvIHRoZSBuaXR0eS1ncml0dHkuIEkmIzM5O20gZ29pbmcgdG8gZGlnIGludG8gdGhlIGBrZXJuZWwvYnBmL2J0Zi5jYCBmaWxlIGFuZCBzcGVjaWZpY2FsbHkgZm9jdXMgb24gdGhlIGNvZGUgc3Vycm91bmRpbmcgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYCBhbmQgYGJ0Zl9wYXJzZWAuIFdlIGtub3cgQlRGJiMzOTtzIGNydWNpYWwgZm9yIGVmZmljaWVudGx5IHJlcHJlc2VudGluZyBhbmQgbWFuYWdpbmcgdHlwZSBpbmZvcm1hdGlvbiBmb3IgZUJQRiBwcm9ncmFtcywgc28gSSB3YW50IHRvIHVuZGVyc3RhbmQgZXhhY3RseSBob3cgdGhlIGtlcm5lbCB2YWxpZGF0ZXMgYW5kIG1hbmlwdWxhdGVzIEJURiBmaWVsZCBkZWZpbml0aW9ucyBkdXJpbmcgcGFyc2luZy4gSXQmIzM5O3MgaW1wZXJhdGl2ZSBJIGdyYXNwIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgcG90ZW50aWFsIGluY29uc2lzdGVuY2llcyBvciBlcnJvcnMgaW4gdGhlIEJURiBkYXRhIGFuZCwgY3J1Y2lhbGx5LCBob3cgaXQgYXR0ZW1wdHMgdG8gY29ycmVjdCB0aGVtLiBJJiMzOTttIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluIGhvdyB0aGV5JiMzOTt2ZSBoYW5kbGVkIHN0cnVjdHVyZSBhbmQgdW5pb24gb2Zmc2V0cywgYW55IHBhZGRpbmcgaXNzdWVzLCBhbmQgYWxzbyBob3cgdHlwZSByZWxhdGlvbnNoaXBzIGFyZSByZXNvbHZlZC4gTGV0JiMzOTtzIHNlZSBob3cgdGhleSYjMzk7dmUgYWRkcmVzc2VkIHBvdGVudGlhbCBjb3JydXB0aW9uIG9yIGVycm9ycyBpbiB0aGUgZmllbGQgZGF0YSBpdHNlbGYsIGFuZCBlbnN1cmUgb3VyIGFzc3VtcHRpb25zIG1hdGNoIHRoZSBpbXBsZW1lbnRhdGlvbi4gVGhpcyBpcyBnb2luZyB0byBiZSBhYm91dCBtYWludGFpbmluZyB0aGUgaW50ZWdyaXR5IG9mIHRoYXQgY3J1Y2lhbCB0eXBlIGluZm9ybWF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxMjoyOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvYnRmLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0MjY1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDkwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzQyNjU6XHRcdHJldHVybiBFUlJfUFRSKHJldCk7XG40MjY2Olx0fVxuNDI2NzpcdFxuNDI2ODpcdGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXG40MjY5Olx0e1xuNDI3MDpcdFx0aW50IGk7XG40MjcxOlx0XG40MjcyOlx0XHQvKlxuNDI3MzpcdFx0ICogQ2hlY2sgZmllbGRzIHdoaWNoIHJlcXVpcmUgdGhlIGNvbXBsZXRlIEJURiBhbmQgaW5pdGlhbGl6ZSBydW50aW1lXG40Mjc0Olx0XHQgKiBtZXRhZGF0YS4gT3duZXJzaGlwIHJlbGF0aW9uc2hpcHMgYXJlIHZhbGlkYXRlZCBhZnRlciBldmVyeSByZWNvcmQgaGFzXG40Mjc1Olx0XHQgKiBiZWVuIGZpeGVkIHVwLlxuNDI3NjpcdFx0ICovXG40Mjc3Olx0XHRpZiAoSVNfRVJSX09SX05VTEwocmVjKSB8fCAhKHJlYy1cdTAwM2VmaWVsZF9tYXNrIFx1MDAyNiAoQlBGX0dSQVBIX1JPT1QgfCBCUEZfVVBUUikpKVxuNDI3ODpcdFx0XHRyZXR1cm4gMDtcbjQyNzk6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHJlYy1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG40MjgwOlx0XHRcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKm1ldGE7XG40MjgxOlx0XHRcdGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdDtcbjQyODI6XHRcdFx0dTMyIGJ0Zl9pZDtcbjQyODM6XHRcbjQyODQ6XHRcdFx0aWYgKHJlYy1cdTAwM2VmaWVsZHNbaV0udHlwZSA9PSBCUEZfVVBUUikge1xuNDI4NTpcdFx0XHRcdC8qIFRoZSB1cHRyIG9ubHkgc3VwcG9ydHMgcGlubmluZyBvbmUgcGFnZSBhbmQgY2Fubm90XG40Mjg2Olx0XHRcdFx0ICogcG9pbnQgdG8gYSBrZXJuZWwgc3RydWN0XG40Mjg3Olx0XHRcdFx0ICovXG40Mjg4Olx0XHRcdFx0aWYgKGJ0Zl9pc19rZXJuZWwocmVjLVx1MDAzZWZpZWxkc1tpXS5rcHRyLmJ0ZikpXG40Mjg5Olx0XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjQyOTA6XHRcdFx0XHR0ID0gYnRmX3R5cGVfYnlfaWQocmVjLVx1MDAzZWZpZWxkc1tpXS5rcHRyLmJ0ZixcbjQyOTE6XHRcdFx0XHRcdFx0ICAgcmVjLVx1MDAzZWZpZWxkc1tpXS5rcHRyLmJ0Zl9pZCk7XG40MjkyOlx0XHRcdFx0aWYgKCF0LVx1MDAzZXNpemUpXG40MjkzOlx0XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjQyOTQ6XHRcdFx0XHRpZiAodC1cdTAwM2VzaXplIFx1MDAzZSBQQUdFX1NJWkUpXG40Mjk1Olx0XHRcdFx0XHRyZXR1cm4gLUUyQklHO1xuNDI5NjpcdFx0XHRcdGNvbnRpbnVlO1xuNDI5NzpcdFx0XHR9XG40Mjk4Olx0XG40Mjk5Olx0XHRcdGlmICghKHJlYy1cdTAwM2VmaWVsZHNbaV0udHlwZSBcdTAwMjYgQlBGX0dSQVBIX1JPT1QpKVxuNDMwMDpcdFx0XHRcdGNvbnRpbnVlO1xuNDMwMTpcdFx0XHRidGZfaWQgPSByZWMtXHUwMDNlZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xuNDMwMjpcdFx0XHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xuNDMwMzpcdFx0XHRpZiAoIW1ldGEpXG40MzA0Olx0XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG40MzA1Olx0XHRcdHJlYy1cdTAwM2VmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9yZWMgPSBtZXRhLVx1MDAzZXJlY29yZDtcbjQzMDY6XHRcdH1cbjQzMDc6XHRcdHJldHVybiAwO1xuNDMwODpcdH1cbjQzMDk6XHRcbjQzMTA6XHRzdGF0aWMgaW50IGJ0Zl9vd25lZF90eXBlX2lkeChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsXG40MzExOlx0XHRcdFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9maWVsZCAqZmllbGQpXG40MzEyOlx0e1xuNDMxMzpcdFx0c3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YSAqbWV0YTtcbjQzMTQ6XHRcdHUzMiBidGZfaWQ7XG40MzE1Olx0XG40MzE2Olx0XHRpZiAoZmllbGQtXHUwMDNldHlwZSBcdTAwMjYgQlBGX0dSQVBIX1JPT1QpIHtcbjQzMTc6XHRcdFx0YnRmX2lkID0gZmllbGQtXHUwMDNlZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XG40MzE4Olx0XHR9IGVsc2UgaWYgKGZpZWxkLVx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUkVGIHx8IGZpZWxkLVx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUEVSQ1BVKSB7XG40MzE5Olx0XHRcdGlmIChidGZfaXNfa2VybmVsKGZpZWxkLVx1MDAzZWtwdHIuYnRmKSlcbjQzMjA6XHRcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbjQzMjE6XHRcdFx0YnRmX2lkID0gZmllbGQtXHUwMDNla3B0ci5idGZfaWQ7XG40MzIyOlx0XHR9IGVsc2Uge1xuNDMyMzpcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbjQzMjQ6XHRcdH1cbjQzMjU6XHRcbjQzMjY6XHRcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XG40MzI3Olx0XHRpZiAoIW1ldGEpXG40MzI4Olx0XHRcdHJldHVybiBmaWVsZC1cdTAwM2V0eXBlIFx1MDAyNiBCUEZfR1JBUEhfUk9PVCA/IC1FRkFVTFQgOiAtRU5PRU5UO1xuNDMyOTpcdFx0cmV0dXJuIG1ldGEgLSB0YWItXHUwMDNldHlwZXM7XG40MzMwOlx0fVxuNDMzMTpcdFxuNDMzMjpcdC8qXG40MzMzOlx0ICogRWFjaCBvd25lcnNoaXAgZWRnZSBhZGRzIGtlcm5lbCBmcmFtZXMgdGhyb3VnaCBicGZfb2JqX2ZyZWVfZmllbGRzKCkgYW5kXG40MzM0Olx0ICogX19icGZfb2JqX2Ryb3BfaW1wbCgpLiBLZWVwIHRoZSBib3VuZCBkZWxpYmVyYXRlbHkgc21hbGwgYmVjYXVzZSBvYmplY3RcbjQzMzU6XHQgKiBkZXN0cnVjdGlvbiBjYW4gaXRzZWxmIHJ1biBiZWxvdyBhIEJQRiBjYWxsIGNoYWluLiBBIGZpbmFsIHBvaW50ZWUgd2l0aG91dFxuNDMzNjpcdCAqIHNwZWNpYWwgZmllbGRzIGlzIG5vdCBwcmVzZW50IGluIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgYW5kIGFkZHMgb25seSBhXG40MzM3Olx0ICogbm9uLXJlY3Vyc2luZyBkcm9wLlxuNDMzODpcdCAqL1xuNDMzOTpcdCNkZWZpbmUgQlRGX01BWF9PV05FUlNISVBfREVQVEggOFxuNDM0MDpcdFxuNDM0MTpcdHN0YXRpYyBpbnQgYnRmX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG40MzQyOlx0XHRcdFx0ICAgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsIHU4ICpkZXB0aCxcbjQzNDM6XHRcdFx0XHQgICAgICAgaW50IGlkeCwgaW50IGRlcHRoX2xlZnQpXG40MzQ0Olx0e1xuNDM0NTpcdFx0Y29uc3Qgc3RydWN0IGJ0Zl9yZWNvcmQgKnJlYyA9IHRhYi1cdTAwM2V0eXBlc1tpZHhdLnJlY29yZDtcbjQzNDY6XHRcdGludCBpLCByZXQsIG1heF9kZXB0aCA9IDA7XG40MzQ3Olx0XG40MzQ4Olx0XHRpZiAoIWRlcHRoX2xlZnQpXG40MzQ5Olx0XHRcdHJldHVybiAtRUxPT1A7XG40MzUwOlx0XHRpZiAoZGVwdGhbaWR4XSlcbjQzNTE6XHRcdFx0Z290byBkb25lO1xuNDM1MjpcdFxuNDM1MzpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgcmVjLVx1MDAzZWNudDsgaSYjNDM7JiM0MzspIHtcbjQzNTQ6XHRcdFx0cmV0ID0gYnRmX293bmVkX3R5cGVfaWR4KGJ0ZiwgdGFiLCBcdTAwMjZyZWMtXHUwMDNlZmllbGRzW2ldKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTAyNjQKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAzMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIGZ1bmN0aW9ucywgdGhpbmtpbmcgdGhyb3VnaCBpdCBhcyBpZiB0aGV5IHdlcmUgbXkgb3duIG1lbnRhbCBwcm9jZXNzZXM6CgoqKlF1aWNrIFNjYW4gb2YgT3duZXJzaGlwIERlcHRoIGFuZCBQYXJzaW5nIEZ1bmN0aW9ucyoqCgpBbHJpZ2h0LCBiZWZvcmUgZGl2aW5nIGludG8gYW55dGhpbmcgdG9vIGRlZXAsIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gaG93IHRoZXNlIHJlbGF0ZWQgZnVuY3Rpb25zIGFyZSBpbnRlcmFjdGluZy4gSSYjMzk7bSB0aGlua2luZyBhYm91dCBgYnRmX293bmVyc2hpcF9kZXB0aGAsIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCwgYW5kIGBidGZfcGFyc2VgIGluIHBhcnRpY3VsYXIuIEltbWVkaWF0ZWx5LCBJJiMzOTttIGdvaW5nIHRvIHdhbnQgdG8gdW5kZXJzdGFuZCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZGVwdGggY2hlY2tpbmcgYW5kIHBhcnNpbmcuIElzIHRoZSBkZXB0aCBjaGVjayBoYXBwZW5pbmcgKmJlZm9yZSogcGFyc2luZywgb3IgaXMgaXQgaW50ZXJsZWF2ZWQgaW4gc29tZSB3YXk/IE9yIGlzIGBidGZfcGFyc2VgIHRoZSBtYWluIGRyaXZlciB3aXRoIHRoZSBkZXB0aCBjaGVja3MgYmVpbmcgc29tZSBraW5kIG9mIGFuY2lsbGFyeSBvciBoZWxwZXIgZnVuY3Rpb24/IEkgd2FudCB0byBrbm93IGlmIHRoZSBgb3duZXJzaGlwX2RlcHRoYCBmdW5jdGlvbnMgYXJlIGp1c3QgZ3VhcmRzLCBzYW5pdHkgY2hlY2tzLCBvciBpZiB0aGV5JiMzOTtyZSBhY3R1YWxseSBmdW5kYW1lbnRhbGx5IGludm9sdmVkIGluIGhvdyB0aGUgQlRGIGRhdGEgaXMgcHJvY2Vzc2VkIG9yIGNvbnN0cnVjdGVkLiBEb2VzIGEgZGVlcCBvd25lcnNoaXAgbWVhbiBzb21ldGhpbmcgZGlmZmVyZW50IGluIHRoZSBjb250ZXh0IG9mIGBidGZfcGFyc2VgPyBBbmQgZG9lcyB0aGlzIGludGVycGxheSBjaGFuZ2UgaG93IEkgYXBwcm9hY2ggYSBwb3RlbnRpYWwgYW5hbHlzaXMgb3IgZGVidWdnaW5nIHNpdHVhdGlvbj8gVGhpcyBmZWVscyBsaWtlIGFuIGltcG9ydGFudCBzdGFydGluZyBwb2ludC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2J0Zi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDM1NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDs0MzU1Olx0XHRcdGlmIChyZXQgPT0gLUVOT0VOVClcbjQzNTY6XHRcdFx0XHRjb250aW51ZTtcbjQzNTc6XHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbjQzNTg6XHRcdFx0XHRyZXR1cm4gcmV0O1xuNDM1OTpcdFx0XHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgcmV0LCBkZXB0aF9sZWZ0IC0gMSk7XG40MzYwOlx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG40MzYxOlx0XHRcdFx0cmV0dXJuIHJldDtcbjQzNjI6XHRcdFx0bWF4X2RlcHRoID0gbWF4KG1heF9kZXB0aCwgcmV0KTtcbjQzNjM6XHRcdH1cbjQzNjQ6XHRcdGRlcHRoW2lkeF0gPSBtYXhfZGVwdGggJiM0MzsgMTtcbjQzNjU6XHRkb25lOlxuNDM2NjpcdFx0cmV0dXJuIGRlcHRoW2lkeF0gXHUwMDNlIGRlcHRoX2xlZnQgPyAtRUxPT1AgOiBkZXB0aFtpZHhdO1xuNDM2NzpcdH1cbjQzNjg6XHRcbjQzNjk6XHRzdGF0aWMgaW50IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuNDM3MDpcdFx0XHRcdFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxuNDM3MTpcdHtcbjQzNzI6XHRcdHU4ICpkZXB0aDtcbjQzNzM6XHRcdGludCBpLCByZXQgPSAwO1xuNDM3NDpcdFxuNDM3NTpcdFx0ZGVwdGggPSBrdmNhbGxvYyh0YWItXHUwMDNlY250LCBzaXplb2YoKmRlcHRoKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTik7XG40Mzc2Olx0XHRpZiAoIWRlcHRoKVxuNDM3NzpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbjQzNzg6XHRcbjQzNzk6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRhYi1cdTAwM2VjbnQ7IGkmIzQzOyYjNDM7KSB7XG40MzgwOlx0XHRcdHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCBpLFxuNDM4MTpcdFx0XHRcdFx0XHQgIEJURl9NQVhfT1dORVJTSElQX0RFUFRIKTtcbjQzODI6XHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbjQzODM6XHRcdFx0XHRicmVhaztcbjQzODQ6XHRcdFx0cmV0ID0gMDtcbjQzODU6XHRcdH1cbjQzODY6XHRcdGt2ZnJlZShkZXB0aCk7XG40Mzg3Olx0XHRyZXR1cm4gcmV0O1xuNDM4ODpcdH1cbjQzODk6XHRcbjQzOTA6XHRzdGF0aWMgdm9pZCBfX2J0Zl9zdHJ1Y3Rfc2hvdyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcbjQzOTE6XHRcdFx0XHQgICAgICB1MzIgdHlwZV9pZCwgdm9pZCAqZGF0YSwgdTggYml0c19vZmZzZXQsXG40MzkyOlx0XHRcdFx0ICAgICAgc3RydWN0IGJ0Zl9zaG93ICpzaG93KVxuNDM5MzpcdHtcbjQzOTQ6XHRcdGNvbnN0IHN0cnVjdCBidGZfbWVtYmVyICptZW1iZXI7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExMTY5CgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byBgYnRmX3BhcnNlYCoqCgpPa2F5LCB0aW1lIHRvIHplcm8gaW4uIEkmIzM5O20gdGhpbmtpbmcgd2UgbmVlZCB0byB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgYGJ0Zl9wYXJzZWAsIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSA2MDc1LiBNeSBndXQgZmVlbGluZyBpcyB0aGF0IHNvbWV0aGluZyBpbnRlcmVzdGluZyBpcyBoYXBwZW5pbmcsIG9yICpub3QqIGhhcHBlbmluZywgYXJvdW5kIHRoYXQgYXJlYSB3aXRoaW4gdGhlIGZ1bmN0aW9uLiBHaXZlbiB3aGF0IEkmIzM5O3ZlIGJlZW4gc2VlaW5nIHdpdGggdGhlIHJlbGF0ZWQgaXNzdWVzLCB0aGlzIGlzIGEgbGlrZWx5IHBvaW50IGZvciBkZWVwZXIgaW5zcGVjdGlvbi4gVGltZSB0byBmaXJlIHVwIHRoZSBkZWJ1Z2dlciBhbmQgc3RhcnQgdHJhY2luZyBleGVjdXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDEyOjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9idGYuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDYwNzAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7NjA3MDpcdFx0XHRnb3RvIGVycm91dDtcbjYwNzE6XHRcdH1cbjYwNzI6XHRcdGJ0Zi1cdTAwM2VzdHJ1Y3RfbWV0YV90YWIgPSBzdHJ1Y3RfbWV0YV90YWI7XG42MDczOlx0XG42MDc0Olx0XHRpZiAoc3RydWN0X21ldGFfdGFiKSB7XG42MDc1Olx0XHRcdGludCBpO1xuNjA3NjpcdFxuNjA3NzpcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzdHJ1Y3RfbWV0YV90YWItXHUwMDNlY250OyBpJiM0MzsmIzQzOykge1xuNjA3ODpcdFx0XHRcdGVyciA9IGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKGJ0Ziwgc3RydWN0X21ldGFfdGFiLVx1MDAzZXR5cGVzW2ldLnJlY29yZCk7XG42MDc5Olx0XHRcdFx0aWYgKGVyciBcdTAwM2MgMClcbjYwODA6XHRcdFx0XHRcdGdvdG8gZXJyb3V0X21ldGE7XG42MDgxOlx0XHRcdH1cbjYwODI6XHRcbjYwODM6XHRcdFx0ZXJyID0gYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChidGYsIHN0cnVjdF9tZXRhX3RhYik7XG42MDg0Olx0XHRcdGlmIChlcnIgXHUwMDNjIDApXG42MDg1Olx0XHRcdFx0Z290byBlcnJvdXRfbWV0YTtcbjYwODY6XHRcdH1cbjYwODc6XHRcbjYwODg6XHRcdGVyciA9IGJwZl9sb2dfYXR0cl9maW5hbGl6ZShhdHRyX2xvZywgXHUwMDI2ZW52LVx1MDAzZWxvZyk7XG42MDg5Olx0XHRpZiAoZXJyKVxuNjA5MDpcdFx0XHRnb3RvIGVycm91dF9mcmVlO1xuNjA5MTpcdFxuNjA5MjpcdFx0YnRmX3ZlcmlmaWVyX2Vudl9mcmVlKGVudik7XG42MDkzOlx0XHRyZWZjb3VudF9zZXQoXHUwMDI2YnRmLVx1MDAzZXJlZmNudCwgMSk7XG42MDk0Olx0XHRyZXR1cm4gYnRmO1xuNjA5NTpcdFxuNjA5NjpcdGVycm91dF9tZXRhOlxuNjA5NzpcdFx0YnRmX2ZyZWVfc3RydWN0X21ldGFfdGFiKGJ0Zik7XG42MDk4Olx0ZXJyb3V0OlxuNjA5OTpcdFx0Lyogb3ZlcndyaXRlIGVyciB3aXRoIC1FTk9TUEMgb3IgLUVGQVVMVCAqL1xuNjEwMDpcdFx0cmV0ID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcdTAwMjZlbnYtXHUwMDNlbG9nKTtcbjYxMDE6XHRcdGlmIChyZXQpXG42MTAyOlx0XHRcdGVyciA9IHJldDtcbjYxMDM6XHRlcnJvdXRfZnJlZTpcbjYxMDQ6XHRcdGJ0Zl92ZXJpZmllcl9lbnZfZnJlZShlbnYpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxMjoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTg3MAoJCQkJCQkJb3V0cHV0OiAyMTMKCQkJCQkJCXRob3VnaHRzOiA3MjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gQXNzZXNzbWVudDogQlRGIE93bmVyc2hpcCBWZXJpZmljYXRpb24qKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgZ29hbCBoZXJlIGlzIHRvIGRldGVybWluZSBpZiB0aGlzIHBhdGNoIGludHJvZHVjZXMgYW55IG5ldyByaXNrcyB0aGF0IHJlcXVpcmUgS01TQU4mIzM5O3MgYXR0ZW50aW9uLiBMZXQgbWUgcmVjYXAgbXkgdGhpbmtpbmcuCgpGaXJzdCwgSSB1bmRlcnN0YW5kIHRoaXMgcGF0Y2ggZm9jdXNlcyBvbiBCVEYgKEJlcmtlbGV5IFBhY2tldCBGaWx0ZXIgVHlwZSBGb3JtYXQpIHZlcmlmaWNhdGlvbiwgc3BlY2lmaWNhbGx5IHJlZ2FyZGluZyB0aGUgb3duZXJzaGlwIG9mIHN0cnVjdHVyZXMgd2l0aGluIHRoZXNlIEJURiBkZWZpbml0aW9ucy4gSSBzZWUgdGhhdCBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIGlzIHNldHRpbmcgdXAgdGhlIG5lY2Vzc2FyeSBsaW5rcyBmb3IgdGhpcyBvd25lcnNoaXAgY2hlY2ssIGFuZCBpbXBvcnRhbnRseSwgdGhlIG93bmVyc2hpcCBjeWNsZSBkZXRlY3Rpb24gaXMgbm93IGhhbmRsZWQgYnkgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGhgLgoKRGVsdmluZyBpbnRvIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCwgdGhlIGtleSBoZXJlIGlzIHRoZSBhbGxvY2F0aW9uIGFuZCB1c2Ugb2YgdGhlIGBkZXB0aGAgYXJyYXkuIEl0IHVzZXMgYGt2Y2FsbG9jYCwgd2hpY2ggaXMgdGhlIGNvcnJlY3QgY2FsbCBmb3IgemVyby1pbml0aWFsaXppbmcgdGhpcyBhcnJheSwgd2hpY2ggaXMgY3J1Y2lhbCBmb3Igb3VyIHNhZmV0eSBhbmFseXNpcy4gVGhpcyBhcnJheSB0cmFja3MgdGhlIG93bmVyc2hpcCBkZXB0aCBvZiBlYWNoIHN0cnVjdHVyZS4gVGhlIGNvZGUgdGhlbiByZWN1cnNpdmVseSBjaGVja3MgdGhlIG93bmVyc2hpcCBkZXB0aCBmb3IgZWFjaCBzdHJ1Y3QgdXAgdG8gYEJURl9NQVhfT1dORVJTSElQX0RFUFRIYC4gVGhlIG1lbW9pemF0aW9uIHdpdGhpbiB0aGUgZGVwdGggY2hlY2sgaXMgYSBnb29kIG9wdGltaXphdGlvbi4gSWYgdGhlIGBkZXB0aGAgaXMgbm9uLXplcm8sIGl0IG1lYW5zIGl0IHdhcyBwcmV2aW91c2x5IGNoZWNrZWQuIEl0IHRoZW4gZnJlZXMgdGhlIG1lbW9yeSwgd2hpY2ggaXMgYWxzbyBpbXBvcnRhbnQuCgpOb3csIHRoZSBjcml0aWNhbCBxdWVzdGlvbjogYXJlIHRoZXJlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcz8gVGhlIGBkZXB0aGAgYXJyYXkgaXMgKnplcm9lZCogYnkgYGt2Y2FsbG9jYC4gQWxsIG90aGVyIHZhcmlhYmxlcyBzZWVtIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQuIE5vdGhpbmcgaXMgZGlyZWN0bHkgY29waWVkIHRvIHVzZXIgc3BhY2Ugb3IgZXhwb3NlZC4gVGhpcyBsb29rcyBnb29kLgoKTmV4dCwgSSBuZWVkIHRvIGNvbnNpZGVyIHBvdGVudGlhbCBidWZmZXIgb3ZlcnJ1bnMsIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGluIEJQRiBvYmplY3RzLCBvciBjaGFuZ2VzIHRvIGxlbmd0aHMuIEhvd2V2ZXIsIHRoaXMgcGF0Y2ggaXMgb25seSB2YWxpZGF0aW5nIGludGVybmFsIHN0cnVjdHVyZXMuIEl0IHNlZW1zIHRvIGJlIHNvbGVseSBpbnZvbHZlZCBpbiB2ZXJpZmljYXRpb24sICpub3QqIGNyZWF0aW5nLCBtb2RpZnlpbmcsIG9yIHNlbmRpbmcgYW55dGhpbmcgdG8gdXNlci1zcGFjZSB0aGF0IGlzbiYjMzk7dCBhbHJlYWR5IGhhbmRsZWQgYnkgb3RoZXIga2VybmVsIGNvZGUuIEkmIzM5O20gc2F0aXNmaWVkIHRoYXQgdGhpcyBwYXRjaCBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IG5ldyB2dWxuZXJhYmlsaXRpZXMgcmVsYXRlZCB0byB0aGVzZSBpc3N1ZXMuIEZ1cnRoZXIsIGlmIHRoZXJlIHdlcmUgYW55IG1lbW9yeSBwcm9ibGVtcyBpbiB0aGUgdGFibGUsIEtBU0FOIHNob3VsZCBoYW5kbGUgdGhlbS4KCkxldCBtZSBnbyB0aHJvdWdoIG15IHVzdWFsIGNoZWNrbGlzdDogbm8ga2VybmVsIHN0cnVjdHVyZXMgYXJlIHNlbnQgdG8gdXNlciBzcGFjZSB3aGVyZSBmaWVsZHMgbWlnaHQgYmUgdW5pbml0aWFsaXplZC4gVGhlcmUgaXMgbm8gY29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIGJhc2VkIG9uIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLiBDb21wbGV4IGRhdGEgc3RydWN0dXJlcywgbGlrZSB0aGUgZGVwdGggYXJyYXksIGFyZSBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQgd2l0aCBga3ZjYWxsb2NgLiBUaGUgYm91bmRzIGNoZWNrcyBhcmUgZ29vZCBhbmQgdGhpcyBwYXRjaCBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IG5ldyBvcHBvcnR1bml0aWVzIHRvIHJlYWQgdW5pbml0aWFsaXplZCBtZW1vcnkuCgpUaGVyZWZvcmUsIGFmdGVyIHRoaXMgZGV0YWlsZWQgYXNzZXNzbWVudCwgSSBjYW4gY29uZmlkZW50bHkgY29uY2x1ZGUgdGhhdCBgTmVlZHNLTVNBTmAgc2hvdWxkIGJlIGZhbHNlLgoKSW4gc3VtbWFyeSwgdGhpcyBwYXRjaCBlbmZvcmNlcyBCVEYgb3duZXJzaGlwIHZlcmlmaWNhdGlvbiB0byBjaGVjayBmb3IgY3ljbGVzIGFuZCBsaW1pdCBkZXB0aC4gVGhlIG1haW4gbWVtb3J5IGNvbmNlcm4gaXMgY29ycmVjdGx5IGhhbmRsZWQgYnkgYGt2Y2FsbG9jYCwgemVyb2luZyB0aGUgYGRlcHRoYCBhcnJheS4gQW55IHBvdGVudGlhbCBpc3N1ZXMgd2l0aCB0aGUgdGFibGUgb3IgbG9vcHMgYXJlIGJldHRlciBhZGRyZXNzZWQgYnkgc3RhbmRhcmQgc2FuaXRpemVycyBzdWNoIGFzIEtBU0FOLgoKSSYjMzk7bSBjb21mb3J0YWJsZSBzZXR0aW5nIHRoZSByZXN1bHRzIG5vdy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTI6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggdXBkYXRlcyB0aGUgQlRGIHZlcmlmaWVyIHRvIHZhbGlkYXRlIG93bmVyc2hpcCBhY3ljbGljaXR5IGFuZCBlbmZvcmNlIGEgbWF4aW11bSBvd25lcnNoaXAgZGVwdGggKEJURl9NQVhfT1dORVJTSElQX0RFUFRIKSBhY3Jvc3MgQlBGIGdyYXBoIHJvb3RzIGFuZCBsb2NhbCBrcHRycy5cblxuTWVtb3J5IHNhZmV0eSBhbmFseXNpczpcbjEuIFRoZSB0ZW1wb3JhcnkgZGVwdGggYXJyYXkgdXNlZCBkdXJpbmcgb3duZXJzaGlwIHRyYXZlcnNhbCBpcyBhbGxvY2F0ZWQgdmlhIGt2Y2FsbG9jKCksIGVuc3VyaW5nIGl0IGlzIGZ1bGx5IHplcm8taW5pdGlhbGl6ZWQuXG4yLiBBbGwgbG9jYWwgdmFyaWFibGVzIGluIGJ0Zl9vd25lcnNoaXBfZGVwdGgoKSwgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCgpLCBhbmQgYnRmX293bmVkX3R5cGVfaWR4KCkgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXG4zLiBObyBkYXRhIHN0cnVjdHVyZXMgb3IgYnVmZmVycyBhcmUgY29waWVkIHRvIHVzZXIgc3BhY2UsIGFuZCBubyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkIG9yIHVzZWQgaW4gY29uZGl0aW9uYWwgYnJhbmNoaW5nLlxuNC4gQW55IHBvdGVudGlhbCBpc3N1ZXMgd2l0aCBwb2ludGVyIGFyaXRobWV0aWMgb3IgYXJyYXkgaW5kZXhpbmcgaW50byB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIHdvdWxkIGJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTi5cblxuVGhlcmVmb3JlLCB0aGlzIGNoYW5nZSBkb2VzIG5vdCBpbnRyb2R1Y2UgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCBuZWVkZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCB1cGRhdGVzIHRoZSBCVEYgdmVyaWZpZXIgdG8gdmFsaWRhdGUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW5kIGVuZm9yY2UgYSBtYXhpbXVtIG93bmVyc2hpcCBkZXB0aCAoQlRGX01BWF9PV05FUlNISVBfREVQVEgpIGFjcm9zcyBCUEYgZ3JhcGggcm9vdHMgYW5kIGxvY2FsIGtwdHJzLlxuXG5NZW1vcnkgc2FmZXR5IGFuYWx5c2lzOlxuMS4gVGhlIHRlbXBvcmFyeSBkZXB0aCBhcnJheSB1c2VkIGR1cmluZyBvd25lcnNoaXAgdHJhdmVyc2FsIGlzIGFsbG9jYXRlZCB2aWEga3ZjYWxsb2MoKSwgZW5zdXJpbmcgaXQgaXMgZnVsbHkgemVyby1pbml0aWFsaXplZC5cbjIuIEFsbCBsb2NhbCB2YXJpYWJsZXMgaW4gYnRmX293bmVyc2hpcF9kZXB0aCgpLCBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKCksIGFuZCBidGZfb3duZWRfdHlwZV9pZHgoKSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS5cbjMuIE5vIGRhdGEgc3RydWN0dXJlcyBvciBidWZmZXJzIGFyZSBjb3BpZWQgdG8gdXNlciBzcGFjZSwgYW5kIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHJlYWQgb3IgdXNlZCBpbiBjb25kaXRpb25hbCBicmFuY2hpbmcuXG40LiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIHBvaW50ZXIgYXJpdGhtZXRpYyBvciBhcnJheSBpbmRleGluZyBpbnRvIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgd291bGQgYmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOLlxuXG5UaGVyZWZvcmUsIHRoaXMgY2hhbmdlIGRvZXMgbm90IGludHJvZHVjZSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IG5lZWRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjc6MzMuNjgwODE1OTU3WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTIyNTE1MTkyNDgzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aFwiLFxuICAgIFwiYnRmX293bmVyc2hpcF9kZXB0aFwiLFxuICAgIFwiYnRmX293bmVkX3R5cGVfaWR4XCIsXG4gICAgXCJidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc1wiLFxuICAgIFwiYnRmX3BhcnNlXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCB1cGRhdGVzIHRoZSBCVEYgdmVyaWZpZXIgdG8gdmFsaWRhdGUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW5kIGVuZm9yY2UgYSBtYXhpbXVtIG93bmVyc2hpcCBkZXB0aCAoQlRGX01BWF9PV05FUlNISVBfREVQVEgpIGFjcm9zcyBCUEYgZ3JhcGggcm9vdHMgYW5kIGxvY2FsIGtwdHJzLlxcblxcbk1lbW9yeSBzYWZldHkgYW5hbHlzaXM6XFxuMS4gVGhlIHRlbXBvcmFyeSBkZXB0aCBhcnJheSB1c2VkIGR1cmluZyBvd25lcnNoaXAgdHJhdmVyc2FsIGlzIGFsbG9jYXRlZCB2aWEga3ZjYWxsb2MoKSwgZW5zdXJpbmcgaXQgaXMgZnVsbHkgemVyby1pbml0aWFsaXplZC5cXG4yLiBBbGwgbG9jYWwgdmFyaWFibGVzIGluIGJ0Zl9vd25lcnNoaXBfZGVwdGgoKSwgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCgpLCBhbmQgYnRmX293bmVkX3R5cGVfaWR4KCkgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXFxuMy4gTm8gZGF0YSBzdHJ1Y3R1cmVzIG9yIGJ1ZmZlcnMgYXJlIGNvcGllZCB0byB1c2VyIHNwYWNlLCBhbmQgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgcmVhZCBvciB1c2VkIGluIGNvbmRpdGlvbmFsIGJyYW5jaGluZy5cXG40LiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIHBvaW50ZXIgYXJpdGhtZXRpYyBvciBhcnJheSBpbmRleGluZyBpbnRvIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgd291bGQgYmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOLlxcblxcblRoZXJlZm9yZSwgdGhpcyBjaGFuZ2UgZG9lcyBub3QgaW50cm9kdWNlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgbmVlZGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIEJURiB2YWxpZGF0aW9uIGxvZ2ljIGluIHRoZSBCUEYgc3Vic3lzdGVtIGJ5IHJlcGxhY2luZyB0aGUgZ3JhcGggcm9vdCBhY3ljbGljaXR5IGNoZWNrIHdpdGggYSBuZXcgb3duZXJzaGlwIGRlcHRoIGFuZCBjeWNsZSBkZXRlY3Rpb24gYWxnb3JpdGhtIChidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoIGFuZCBidGZfb3duZXJzaGlwX2RlcHRoKSBjb3ZlcmluZyBib3RoIGdyYXBoIHJvb3RzIGFuZCBsb2NhbCBrcHRycy4gVGhlc2UgY2hhbmdlcyBhcmUgcmVhY2hhYmxlIHZpYSB0aGUgQlBGX0JURl9MT0FEIGNvbW1hbmQgaW4gdGhlIGJwZigpIHN5c3RlbSBjYWxsIGFuZCB3YXJyYW50IGZ1enppbmcgdG8gdmVyaWZ5IGdyYXBoIHRyYXZlcnNhbCBjb3JyZWN0bmVzcyBhbmQgYm91bmQgZW5mb3JjZW1lbnQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDEyOjI3OjMzLjY4MDgyMDEzN1oiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTc5MDg3MzQzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgN2I1YjhmNjc2NTc5MmIzNjg2MDBhZTVhNjRiZmI3N2JkMTFhOTJlOVxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgU3VuIFNlcCA2IDEyOjI3OjMyIDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvYnRmLmMgYi9rZXJuZWwvYnBmL2J0Zi5jXFxuaW5kZXggOWMyY2FiMDhiYjc5NC4uM2M1MDhlYmIyNDM4NCAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvYnBmL2J0Zi5jXFxuKysrIGIva2VybmVsL2JwZi9idGYuY1xcbkBAIC00MjY5LDEzICs0MjY5LDEwIEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXFxuIHtcXG4gXFx0aW50IGk7XFxuIFxcbi1cXHQvKiBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgdGhhdCBzaWduaWZ5IG93bmVyc2hpcCBvZiBzb21lIG90aGVyIHR5cGU6XFxuLVxcdCAqICBrcHRyX3JlZiwgYnBmX2xpc3RfaGVhZCwgYnBmX3JiX3Jvb3QuXFxuLVxcdCAqIGtwdHJfcmVmIG9ubHkgc3VwcG9ydHMgc3RvcmluZyBrZXJuZWwgdHlwZXMsIHdoaWNoIGNhbid0IHN0b3JlXFxuLVxcdCAqIHJlZmVyZW5jZXMgdG8gcHJvZ3JhbSBhbGxvY2F0ZWQgbG9jYWwgdHlwZXMuXFxuLVxcdCAqXFxuLVxcdCAqIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBlbnN1cmUgdGhhdCBicGZfe2xpc3RfaGVhZCxyYl9yb290fSBvd25lcnNoaXBcXG4tXFx0ICogZG9lcyBub3QgZm9ybSBjeWNsZXMuXFxuK1xcdC8qXFxuK1xcdCAqIENoZWNrIGZpZWxkcyB3aGljaCByZXF1aXJlIHRoZSBjb21wbGV0ZSBCVEYgYW5kIGluaXRpYWxpemUgcnVudGltZVxcbitcXHQgKiBtZXRhZGF0YS4gT3duZXJzaGlwIHJlbGF0aW9uc2hpcHMgYXJlIHZhbGlkYXRlZCBhZnRlciBldmVyeSByZWNvcmQgaGFzXFxuK1xcdCAqIGJlZW4gZml4ZWQgdXAuXFxuIFxcdCAqL1xcbiBcXHRpZiAoSVNfRVJSX09SX05VTEwocmVjKSB8fCAhKHJlYy1cXHUwMDNlZmllbGRfbWFzayBcXHUwMDI2IChCUEZfR1JBUEhfUk9PVCB8IEJQRl9VUFRSKSkpXFxuIFxcdFxcdHJldHVybiAwO1xcbkBAIC00MzA2LDUxICs0MzAzLDg4IEBAIGludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXFxuIFxcdFxcdGlmICghbWV0YSlcXG4gXFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIFxcdFxcdHJlYy1cXHUwMDNlZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfcmVjID0gbWV0YS1cXHUwMDNlcmVjb3JkO1xcbitcXHR9XFxuK1xcdHJldHVybiAwO1xcbit9XFxuIFxcbi1cXHRcXHQvKiBXZSBuZWVkIHRvIHNldCB2YWx1ZV9yZWMgZm9yIGFsbCByb290IHR5cGVzLCBidXQgbm8gbmVlZFxcbi1cXHRcXHQgKiB0byBjaGVjayBvd25lcnNoaXAgY3ljbGUgZm9yIGEgdHlwZSB1bmxlc3MgaXQncyBhbHNvIGFcXG4tXFx0XFx0ICogbm9kZSB0eXBlLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKCEocmVjLVxcdTAwM2VmaWVsZF9tYXNrIFxcdTAwMjYgQlBGX0dSQVBIX05PREUpKVxcbitzdGF0aWMgaW50IGJ0Zl9vd25lZF90eXBlX2lkeChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsXFxuK1xcdFxcdFxcdCAgICAgIGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkKVxcbit7XFxuK1xcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKm1ldGE7XFxuK1xcdHUzMiBidGZfaWQ7XFxuK1xcbitcXHRpZiAoZmllbGQtXFx1MDAzZXR5cGUgXFx1MDAyNiBCUEZfR1JBUEhfUk9PVCkge1xcbitcXHRcXHRidGZfaWQgPSBmaWVsZC1cXHUwMDNlZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XFxuK1xcdH0gZWxzZSBpZiAoZmllbGQtXFx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUkVGIHx8IGZpZWxkLVxcdTAwM2V0eXBlID09IEJQRl9LUFRSX1BFUkNQVSkge1xcbitcXHRcXHRpZiAoYnRmX2lzX2tlcm5lbChmaWVsZC1cXHUwMDNla3B0ci5idGYpKVxcbitcXHRcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4rXFx0XFx0YnRmX2lkID0gZmllbGQtXFx1MDAzZWtwdHIuYnRmX2lkO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4rXFx0fVxcbitcXG4rXFx0bWV0YSA9IGJ0Zl9maW5kX3N0cnVjdF9tZXRhKGJ0ZiwgYnRmX2lkKTtcXG4rXFx0aWYgKCFtZXRhKVxcbitcXHRcXHRyZXR1cm4gZmllbGQtXFx1MDAzZXR5cGUgXFx1MDAyNiBCUEZfR1JBUEhfUk9PVCA/IC1FRkFVTFQgOiAtRU5PRU5UO1xcbitcXHRyZXR1cm4gbWV0YSAtIHRhYi1cXHUwMDNldHlwZXM7XFxuK31cXG4rXFxuKy8qXFxuKyAqIEVhY2ggb3duZXJzaGlwIGVkZ2UgYWRkcyBrZXJuZWwgZnJhbWVzIHRocm91Z2ggYnBmX29ial9mcmVlX2ZpZWxkcygpIGFuZFxcbisgKiBfX2JwZl9vYmpfZHJvcF9pbXBsKCkuIEtlZXAgdGhlIGJvdW5kIGRlbGliZXJhdGVseSBzbWFsbCBiZWNhdXNlIG9iamVjdFxcbisgKiBkZXN0cnVjdGlvbiBjYW4gaXRzZWxmIHJ1biBiZWxvdyBhIEJQRiBjYWxsIGNoYWluLiBBIGZpbmFsIHBvaW50ZWUgd2l0aG91dFxcbisgKiBzcGVjaWFsIGZpZWxkcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIGFuZCBhZGRzIG9ubHkgYVxcbisgKiBub24tcmVjdXJzaW5nIGRyb3AuXFxuKyAqL1xcbisjZGVmaW5lIEJURl9NQVhfT1dORVJTSElQX0RFUFRIIDhcXG4rXFxuK3N0YXRpYyBpbnQgYnRmX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXFxuK1xcdFxcdFxcdCAgICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLCB1OCAqZGVwdGgsXFxuK1xcdFxcdFxcdCAgICAgICBpbnQgaWR4LCBpbnQgZGVwdGhfbGVmdClcXG4re1xcbitcXHRjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjID0gdGFiLVxcdTAwM2V0eXBlc1tpZHhdLnJlY29yZDtcXG4rXFx0aW50IGksIHJldCwgbWF4X2RlcHRoID0gMDtcXG4rXFxuK1xcdGlmICghZGVwdGhfbGVmdClcXG4rXFx0XFx0cmV0dXJuIC1FTE9PUDtcXG4rXFx0aWYgKGRlcHRoW2lkeF0pXFxuK1xcdFxcdGdvdG8gZG9uZTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyByZWMtXFx1MDAzZWNudDsgaSsrKSB7XFxuK1xcdFxcdHJldCA9IGJ0Zl9vd25lZF90eXBlX2lkeChidGYsIHRhYiwgXFx1MDAyNnJlYy1cXHUwMDNlZmllbGRzW2ldKTtcXG4rXFx0XFx0aWYgKHJldCA9PSAtRU5PRU5UKVxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCByZXQsIGRlcHRoX2xlZnQgLSAxKTtcXG4rXFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdG1heF9kZXB0aCA9IG1heChtYXhfZGVwdGgsIHJldCk7XFxuK1xcdH1cXG4rXFx0ZGVwdGhbaWR4XSA9IG1heF9kZXB0aCArIDE7XFxuK2RvbmU6XFxuK1xcdHJldHVybiBkZXB0aFtpZHhdIFxcdTAwM2UgZGVwdGhfbGVmdCA/IC1FTE9PUCA6IGRlcHRoW2lkeF07XFxuK31cXG4gXFxuLVxcdFxcdC8qIFdlIG5lZWQgdG8gZW5zdXJlIG93bmVyc2hpcCBhY3ljbGljaXR5IGFtb25nIGFsbCB0eXBlcy4gVGhlXFxuLVxcdFxcdCAqIHByb3BlciB3YXkgdG8gZG8gaXQgd291bGQgYmUgdG8gdG9wb2xvZ2ljYWxseSBzb3J0IGFsbCBCVEZcXG4tXFx0XFx0ICogSURzIGJhc2VkIG9uIHRoZSBvd25lcnNoaXAgZWRnZXMsIHNpbmNlIHRoZXJlIGNhbiBiZSBtdWx0aXBsZVxcbi1cXHRcXHQgKiBicGZfe2xpc3RfaGVhZCxyYl9ub2RlfSBpbiBhIHR5cGUuIEluc3RlYWQsIHdlIHVzZSB0aGVcXG4tXFx0XFx0ICogZm9sbG93aW5nIHJlc2FvbmluZzpcXG4tXFx0XFx0ICpcXG4tXFx0XFx0ICogLSBBIHR5cGUgY2FuIG9ubHkgYmUgb3duZWQgYnkgYW5vdGhlciB0eXBlIGluIHVzZXIgQlRGIGlmIGl0XFxuLVxcdFxcdCAqICAgaGFzIGEgYnBmX3tsaXN0LHJifV9ub2RlLiBMZXQncyBjYWxsIHRoZXNlIG5vZGUgdHlwZXMuXFxuLVxcdFxcdCAqIC0gQSB0eXBlIGNhbiBvbmx5IF9vd25fIGFub3RoZXIgdHlwZSBpbiB1c2VyIEJURiBpZiBpdCBoYXMgYVxcbi1cXHRcXHQgKiAgIGJwZl97bGlzdF9oZWFkLHJiX3Jvb3R9LiBMZXQncyBjYWxsIHRoZXNlIHJvb3QgdHlwZXMuXFxuLVxcdFxcdCAqXFxuLVxcdFxcdCAqIFdlIGVuc3VyZSB0aGF0IGlmIGEgdHlwZSBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgaXRzXFxuLVxcdFxcdCAqIGVsZW1lbnQgdHlwZXMgY2Fubm90IGJlIHJvb3QgdHlwZXMuXFxuLVxcdFxcdCAqXFxuLVxcdFxcdCAqIFRvIGVuc3VyZSBhY3ljbGljaXR5Olxcbi1cXHRcXHQgKlxcbi1cXHRcXHQgKiBXaGVuIEEgaXMgYW4gcm9vdCB0eXBlIGJ1dCBub3QgYSBub2RlLCBpdHMgb3duZXJzaGlwXFxuLVxcdFxcdCAqIGNoYWluIGNhbiBiZTpcXG4tXFx0XFx0ICpcXHRBIC1cXHUwMDNlIEIgLVxcdTAwM2UgQ1xcbi1cXHRcXHQgKiBXaGVyZTpcXG4tXFx0XFx0ICogLSBBIGlzIGFuIHJvb3QsIGUuZy4gaGFzIGJwZl9yYl9yb290Llxcbi1cXHRcXHQgKiAtIEIgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIGUuZy4gaGFzIGJwZl9yYl9ub2RlIGFuZFxcbi1cXHRcXHQgKiAgIGJwZl9saXN0X2hlYWQuXFxuLVxcdFxcdCAqIC0gQyBpcyBvbmx5IGFuIHJvb3QsIGUuZy4gaGFzIGJwZl9saXN0X25vZGVcXG4tXFx0XFx0ICpcXG4tXFx0XFx0ICogV2hlbiBBIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBzb21lIG90aGVyIHR5cGUgYWxyZWFkeVxcbi1cXHRcXHQgKiBvd25zIGl0IGluIHRoZSBCVEYgZG9tYWluLCBoZW5jZSBpdCBjYW4gbm90IG93blxcbi1cXHRcXHQgKiBhbm90aGVyIHJvb3QgdHlwZSB0aHJvdWdoIGFueSBvZiB0aGUgb3duZXJzaGlwIGVkZ2VzLlxcbi1cXHRcXHQgKlxcdEEgLVxcdTAwM2UgQlxcbi1cXHRcXHQgKiBXaGVyZTpcXG4tXFx0XFx0ICogLSBBIGlzIGJvdGggYW4gcm9vdCBhbmQgbm9kZS5cXG4tXFx0XFx0ICogLSBCIGlzIG9ubHkgYW4gbm9kZS5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdGlmIChtZXRhLVxcdTAwM2VyZWNvcmQtXFx1MDAzZWZpZWxkX21hc2sgXFx1MDAyNiBCUEZfR1JBUEhfUk9PVClcXG4tXFx0XFx0XFx0cmV0dXJuIC1FTE9PUDtcXG4rc3RhdGljIGludCBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG4rXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxcbit7XFxuK1xcdHU4ICpkZXB0aDtcXG4rXFx0aW50IGksIHJldCA9IDA7XFxuK1xcbitcXHRkZXB0aCA9IGt2Y2FsbG9jKHRhYi1cXHUwMDNlY250LCBzaXplb2YoKmRlcHRoKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTik7XFxuK1xcdGlmICghZGVwdGgpXFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHRhYi1cXHUwMDNlY250OyBpKyspIHtcXG4rXFx0XFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIGksXFxuK1xcdFxcdFxcdFxcdFxcdCAgQlRGX01BWF9PV05FUlNISVBfREVQVEgpO1xcbitcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdHJldCA9IDA7XFxuIFxcdH1cXG4tXFx0cmV0dXJuIDA7XFxuK1xcdGt2ZnJlZShkZXB0aCk7XFxuK1xcdHJldHVybiByZXQ7XFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIF9fYnRmX3N0cnVjdF9zaG93KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxcbkBAIC02MDQ1LDYgKzYwNzksMTAgQEAgc3RhdGljIHN0cnVjdCBidGYgKmJ0Zl9wYXJzZShjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXFxuIFxcdFxcdFxcdGlmIChlcnIgXFx1MDAzYyAwKVxcbiBcXHRcXHRcXHRcXHRnb3RvIGVycm91dF9tZXRhO1xcbiBcXHRcXHR9XFxuK1xcbitcXHRcXHRlcnIgPSBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGJ0Ziwgc3RydWN0X21ldGFfdGFiKTtcXG4rXFx0XFx0aWYgKGVyciBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdGdvdG8gZXJyb3V0X21ldGE7XFxuIFxcdH1cXG4gXFxuIFxcdGVyciA9IGJwZl9sb2dfYXR0cl9maW5hbGl6ZShhdHRyX2xvZywgXFx1MDAyNmVudi1cXHUwMDNlbG9nKTtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcXG5pbmRleCBjM2QxMzNjNmEwMGQ0Li41MmZhYmJlZTNkZDVhIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jXFxuQEAgLTcxNCw3ICs3MTQsNyBAQCBzdGF0aWMgdm9pZCB0ZXN0X2J0Zih2b2lkKVxcbiBcXHRcXHRcXHRicmVhaztcXG4gXFxuIFxcdFxcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xcbi1cXHRcXHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFxcXCJjaGVjayBidGZcXFwiKTtcXG4rXFx0XFx0QVNTRVJUX0VRKGVyciwgMCwgXFxcImNoZWNrIGJ0ZlxcXCIpO1xcbiBcXHRcXHRidGZfX2ZyZWUoYnRmKTtcXG4gXFx0XFx0YnJlYWs7XFxuIFxcdH1cXG5AQCAtNzczLDcgKzc3Myw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfYnRmKHZvaWQpXFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXG4gXFx0XFx0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XFxuLVxcdFxcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXFxcImNoZWNrIGJ0ZlxcXCIpO1xcbitcXHRcXHRBU1NFUlRfRVEoZXJyLCAwLCBcXFwiY2hlY2sgYnRmXFxcIik7XFxuIFxcdFxcdGJ0Zl9fZnJlZShidGYpO1xcbiBcXHRcXHRicmVhaztcXG4gXFx0fVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uODM2NzQxNTVlM2I3NFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jXFxuQEAgLTAsMCArMSwyMDIgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLiAqL1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9idGYuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2J0Zi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdGVzdF9wcm9ncy5oXFx1MDAzZVxcbitcXG4rI2RlZmluZSBTUElOX0xPQ0sgMlxcbisjZGVmaW5lIExJU1RfSEVBRCAzXFxuKyNkZWZpbmUgTElTVF9OT0RFIDRcXG4rLyogS2VlcCBpbiBzeW5jIHdpdGggQlRGX01BWF9PV05FUlNISVBfREVQVEguICovXFxuKyNkZWZpbmUgTUFYX09XTkVSU0hJUF9ERVBUSCA4XFxuK1xcbitzdGF0aWMgc3RydWN0IGJ0ZiAqaW5pdF9idGYodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgYnRmICpidGY7XFxuK1xcdGludCBpZDtcXG4rXFxuK1xcdGJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFxcXCJidGZfX25ld19lbXB0eVxcXCIpKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0aWQgPSBidGZfX2FkZF9pbnQoYnRmLCBcXFwiaW50XFxcIiwgNCwgQlRGX0lOVF9TSUdORUQpO1xcbitcXHRpZiAoIUFTU0VSVF9FUShpZCwgMSwgXFxcImJ0Zl9fYWRkX2ludFxcXCIpKVxcbitcXHRcXHRnb3RvIGVycl9vdXQ7XFxuK1xcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXFxcImJwZl9zcGluX2xvY2tcXFwiLCA0KTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoaWQsIFNQSU5fTE9DSywgXFxcImJ0Zl9fYWRkX3N0cnVjdCBicGZfc3Bpbl9sb2NrXFxcIikpXFxuK1xcdFxcdGdvdG8gZXJyX291dDtcXG4rXFx0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcXFwiYnBmX2xpc3RfaGVhZFxcXCIsIDE2KTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfSEVBRCwgXFxcImJ0Zl9fYWRkX3N0cnVjdCBicGZfbGlzdF9oZWFkXFxcIikpXFxuK1xcdFxcdGdvdG8gZXJyX291dDtcXG4rXFx0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcXFwiYnBmX2xpc3Rfbm9kZVxcXCIsIDI0KTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfTk9ERSwgXFxcImJ0Zl9fYWRkX3N0cnVjdCBicGZfbGlzdF9ub2RlXFxcIikpXFxuK1xcdFxcdGdvdG8gZXJyX291dDtcXG4rXFx0cmV0dXJuIGJ0ZjtcXG4rXFxuK2Vycl9vdXQ6XFxuK1xcdGJ0Zl9fZnJlZShidGYpO1xcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBhZGRfbG9jYWxfa3B0cihzdHJ1Y3QgYnRmICpidGYsIGludCBwb2ludGVlX2lkLCBjb25zdCBjaGFyICp0YWcpXFxuK3tcXG4rXFx0aW50IGlkO1xcbitcXG4rXFx0aWQgPSBidGZfX2FkZF90eXBlX3RhZyhidGYsIHRhZywgcG9pbnRlZV9pZCk7XFxuK1xcdGlmICghQVNTRVJUX0dUKGlkLCAwLCBcXFwiYnRmX19hZGRfdHlwZV90YWdcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIGlkO1xcbitcXHRpZCA9IGJ0Zl9fYWRkX3B0cihidGYsIGlkKTtcXG4rXFx0QVNTRVJUX0dUKGlkLCAwLCBcXFwiYnRmX19hZGRfcHRyXFxcIik7XFxuK1xcdHJldHVybiBpZDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9zZWxmX2N5Y2xlKGNvbnN0IGNoYXIgKnRhZywgaW50IGV4cGVjdGVkX2VycilcXG4re1xcbitcXHRzdHJ1Y3QgYnRmICpidGY7XFxuK1xcdGludCBpZCwgZXJyO1xcbitcXG4rXFx0YnRmID0gaW5pdF9idGYoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXFxcImluaXRfYnRmXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0aWQgPSBhZGRfbG9jYWxfa3B0cihidGYsIDcsIHRhZyk7XFxuK1xcdGlmIChpZCBcXHUwMDNjPSAwKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcXFwic2VsZl9jeWNsZVxcXCIsIDgpO1xcbitcXHRpZiAoIUFTU0VSVF9FUShpZCwgNywgXFxcImJ0Zl9fYWRkX3N0cnVjdCBzZWxmX2N5Y2xlXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFxcXCJuZXh0XFxcIiwgNiwgMCwgMCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJ0Zl9fYWRkX2ZpZWxkIHNlbGZfY3ljbGU6Om5leHRcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcXG4rXFx0QVNTRVJUX0VRKGVyciwgZXhwZWN0ZWRfZXJyLCBcXFwiY2hlY2sgYnRmXFxcIik7XFxuK291dDpcXG4rXFx0YnRmX19mcmVlKGJ0Zik7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfYWJhX2N5Y2xlKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IGJ0ZiAqYnRmO1xcbitcXHRpbnQgaWQsIGVycjtcXG4rXFxuK1xcdGJ0ZiA9IGluaXRfYnRmKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFxcXCJpbml0X2J0ZlxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCAxMCwgXFxcImtwdHJcXFwiKTtcXG4rXFx0aWYgKGlkIFxcdTAwM2M9IDApXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgOSwgXFxcImtwdHJcXFwiKTtcXG4rXFx0aWYgKGlkIFxcdTAwM2M9IDApXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFxcXCJjeWNsZV9hXFxcIiwgOCk7XFxuK1xcdGlmICghQVNTRVJUX0VRKGlkLCA5LCBcXFwiYnRmX19hZGRfc3RydWN0IGN5Y2xlX2FcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXFxcImJcXFwiLCA2LCAwLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnRmX19hZGRfZmllbGQgY3ljbGVfYTo6YlxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcXFwiY3ljbGVfYlxcXCIsIDgpO1xcbitcXHRpZiAoIUFTU0VSVF9FUShpZCwgMTAsIFxcXCJidGZfX2FkZF9zdHJ1Y3QgY3ljbGVfYlxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcXFwiYVxcXCIsIDgsIDAsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJidGZfX2FkZF9maWVsZCBjeWNsZV9iOjphXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XFxuK1xcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXFxcImNoZWNrIGJ0ZlxcXCIpO1xcbitvdXQ6XFxuK1xcdGJ0Zl9fZnJlZShidGYpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X21peGVkX2N5Y2xlKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IGJ0ZiAqYnRmO1xcbitcXHRpbnQgaWQsIGVycjtcXG4rXFxuK1xcdGJ0ZiA9IGluaXRfYnRmKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFxcXCJpbml0X2J0ZlxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA3LCBcXFwia3B0clxcXCIpO1xcbitcXHRpZiAoaWQgXFx1MDAzYz0gMClcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXFxcIm1peGVkX293bmVyXFxcIiwgMjApO1xcbitcXHRpZiAoIUFTU0VSVF9FUShpZCwgNywgXFxcImJ0Zl9fYWRkX3N0cnVjdCBtaXhlZF9vd25lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcXFwicm9vdFxcXCIsIExJU1RfSEVBRCwgMCwgMCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJ0Zl9fYWRkX2ZpZWxkIG1peGVkX293bmVyOjpyb290XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFxcXCJsb2NrXFxcIiwgU1BJTl9MT0NLLCAxMjgsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJidGZfX2FkZF9maWVsZCBtaXhlZF9vd25lcjo6bG9ja1xcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWQgPSBidGZfX2FkZF9kZWNsX3RhZyhidGYsIFxcXCJjb250YWluczptaXhlZF9ub2RlOm5vZGVcXFwiLCA3LCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoaWQsIDgsIFxcXCJidGZfX2FkZF9kZWNsX3RhZyBtaXhlZF9vd25lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcXFwibWl4ZWRfbm9kZVxcXCIsIDMyKTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoaWQsIDksIFxcXCJidGZfX2FkZF9zdHJ1Y3QgbWl4ZWRfbm9kZVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcXFwibm9kZVxcXCIsIExJU1RfTk9ERSwgMCwgMCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJ0Zl9fYWRkX2ZpZWxkIG1peGVkX25vZGU6Om5vZGVcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXFxcIm93bmVyXFxcIiwgNiwgMTkyLCAwKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnRmX19hZGRfZmllbGQgbWl4ZWRfbm9kZTo6b3duZXJcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcXG4rXFx0QVNTRVJUX0VRKGVyciwgLUVMT09QLCBcXFwiY2hlY2sgYnRmXFxcIik7XFxuK291dDpcXG4rXFx0YnRmX19mcmVlKGJ0Zik7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfYWN5Y2xpY19kZXB0aChpbnQgZGVwdGgsIGludCBleHBlY3RlZF9lcnIpXFxuK3tcXG4rXFx0aW50IHB0cl9pZFtNQVhfT1dORVJTSElQX0RFUFRIICsgMV07XFxuK1xcdGludCBmaXJzdF9zdHJ1Y3RfaWQ7XFxuK1xcdHN0cnVjdCBidGYgKmJ0ZjtcXG4rXFx0aW50IGlkLCBlcnIsIGk7XFxuK1xcbitcXHRidGYgPSBpbml0X2J0ZigpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcXFwiaW5pdF9idGZcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRmaXJzdF9zdHJ1Y3RfaWQgPSA1ICsgMiAqIGRlcHRoO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgZGVwdGg7IGkrKykge1xcbitcXHRcXHRwdHJfaWRbaV0gPSBhZGRfbG9jYWxfa3B0cihidGYsIGZpcnN0X3N0cnVjdF9pZCArIGkgKyAxLCBcXFwia3B0clxcXCIpO1xcbitcXHRcXHRpZiAocHRyX2lkW2ldIFxcdTAwM2M9IDApXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBkZXB0aDsgaSsrKSB7XFxuK1xcdFxcdGNoYXIgbmFtZVsxNl07XFxuK1xcbitcXHRcXHRzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksIFxcXCJvd25lcl8lZFxcXCIsIGkpO1xcbitcXHRcXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIDgpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9FUShpZCwgZmlyc3Rfc3RydWN0X2lkICsgaSwgXFxcImJ0Zl9fYWRkX3N0cnVjdCBvd25lclxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcXFwibmV4dFxcXCIsIHB0cl9pZFtpXSwgMCwgMCk7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJ0Zl9fYWRkX2ZpZWxkIG93bmVyOjpuZXh0XFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXFxcInBsYWluX2xlYWZcXFwiLCA0KTtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoaWQsIGZpcnN0X3N0cnVjdF9pZCArIGRlcHRoLCBcXFwiYnRmX19hZGRfc3RydWN0IHBsYWluX2xlYWZcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcXG4rXFx0QVNTRVJUX0VRKGVyciwgZXhwZWN0ZWRfZXJyLCBcXFwiY2hlY2sgYnRmXFxcIik7XFxuK291dDpcXG4rXFx0YnRmX19mcmVlKGJ0Zik7XFxuK31cXG4rXFxuK3ZvaWQgdGVzdF9sb2NhbF9rcHRyX293bmVyc2hpcCh2b2lkKVxcbit7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJzZWxmX2N5Y2xlXFxcIikpXFxuK1xcdFxcdHRlc3Rfc2VsZl9jeWNsZShcXFwia3B0clxcXCIsIC1FTE9PUCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJ1bnRydXN0ZWRfc2VsZl9jeWNsZVxcXCIpKVxcbitcXHRcXHR0ZXN0X3NlbGZfY3ljbGUoXFxcImtwdHJfdW50cnVzdGVkXFxcIiwgMCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJwZXJjcHVfc2VsZl9jeWNsZVxcXCIpKVxcbitcXHRcXHR0ZXN0X3NlbGZfY3ljbGUoXFxcInBlcmNwdV9rcHRyXFxcIiwgLUVMT09QKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcIkFCQV9jeWNsZVxcXCIpKVxcbitcXHRcXHR0ZXN0X2FiYV9jeWNsZSgpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwibWl4ZWRfZ3JhcGhfcm9vdF9jeWNsZVxcXCIpKVxcbitcXHRcXHR0ZXN0X21peGVkX2N5Y2xlKCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJtYXhfYWN5Y2xpY1xcXCIpKVxcbitcXHRcXHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCwgMCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJ0b29fZGVlcF9hY3ljbGljXFxcIikpXFxuK1xcdFxcdHRlc3RfYWN5Y2xpY19kZXB0aChNQVhfT1dORVJTSElQX0RFUFRIICsgMSwgLUVMT09QKTtcXG4rfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyNzozNC4yNjA4MTg3N1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6OTc1ODgwMDU3MTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NZU0NBTExcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoXCIsXG4gICAgXCJidGZfb3duZXJzaGlwX2RlcHRoXCIsXG4gICAgXCJidGZfb3duZWRfdHlwZV9pZHhcIixcbiAgICBcImJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzXCIsXG4gICAgXCJidGZfcGFyc2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBCVEYgdmFsaWRhdGlvbiBsb2dpYyBpbiB0aGUgQlBGIHN1YnN5c3RlbSBieSByZXBsYWNpbmcgdGhlIGdyYXBoIHJvb3QgYWN5Y2xpY2l0eSBjaGVjayB3aXRoIGEgbmV3IG93bmVyc2hpcCBkZXB0aCBhbmQgY3ljbGUgZGV0ZWN0aW9uIGFsZ29yaXRobSAoYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCBhbmQgYnRmX293bmVyc2hpcF9kZXB0aCkgY292ZXJpbmcgYm90aCBncmFwaCByb290cyBhbmQgbG9jYWwga3B0cnMuIFRoZXNlIGNoYW5nZXMgYXJlIHJlYWNoYWJsZSB2aWEgdGhlIEJQRl9CVEZfTE9BRCBjb21tYW5kIGluIHRoZSBicGYoKSBzeXN0ZW0gY2FsbCBhbmQgd2FycmFudCBmdXp6aW5nIHRvIHZlcmlmeSBncmFwaCB0cmF2ZXJzYWwgY29ycmVjdG5lc3MgYW5kIGJvdW5kIGVuZm9yY2VtZW50LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDdiNWI4ZjY3NjU3OTJiMzY4NjAwYWU1YTY0YmZiNzdiZDExYTkyZTlcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU3VuIFNlcCA2IDEyOjI3OjMyIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9idGYuYyBiL2tlcm5lbC9icGYvYnRmLmNcbmluZGV4IDljMmNhYjA4YmI3OTQuLjNjNTA4ZWJiMjQzODQgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL2J0Zi5jXG4rKysgYi9rZXJuZWwvYnBmL2J0Zi5jXG5AQCAtNDI2OSwxMyArNDI2OSwxMCBAQCBpbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKVxuIHtcbiBcdGludCBpO1xuIFxuLVx0LyogVGhlcmUgYXJlIHRocmVlIHR5cGVzIHRoYXQgc2lnbmlmeSBvd25lcnNoaXAgb2Ygc29tZSBvdGhlciB0eXBlOlxuLVx0ICogIGtwdHJfcmVmLCBicGZfbGlzdF9oZWFkLCBicGZfcmJfcm9vdC5cbi1cdCAqIGtwdHJfcmVmIG9ubHkgc3VwcG9ydHMgc3RvcmluZyBrZXJuZWwgdHlwZXMsIHdoaWNoIGNhbid0IHN0b3JlXG4tXHQgKiByZWZlcmVuY2VzIHRvIHByb2dyYW0gYWxsb2NhdGVkIGxvY2FsIHR5cGVzLlxuLVx0ICpcbi1cdCAqIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBlbnN1cmUgdGhhdCBicGZfe2xpc3RfaGVhZCxyYl9yb290fSBvd25lcnNoaXBcbi1cdCAqIGRvZXMgbm90IGZvcm0gY3ljbGVzLlxuK1x0LypcbitcdCAqIENoZWNrIGZpZWxkcyB3aGljaCByZXF1aXJlIHRoZSBjb21wbGV0ZSBCVEYgYW5kIGluaXRpYWxpemUgcnVudGltZVxuK1x0ICogbWV0YWRhdGEuIE93bmVyc2hpcCByZWxhdGlvbnNoaXBzIGFyZSB2YWxpZGF0ZWQgYWZ0ZXIgZXZlcnkgcmVjb3JkIGhhc1xuK1x0ICogYmVlbiBmaXhlZCB1cC5cbiBcdCAqL1xuIFx0aWYgKElTX0VSUl9PUl9OVUxMKHJlYykgfHwgIShyZWMtXHUwMDNlZmllbGRfbWFzayBcdTAwMjYgKEJQRl9HUkFQSF9ST09UIHwgQlBGX1VQVFIpKSlcbiBcdFx0cmV0dXJuIDA7XG5AQCAtNDMwNiw1MSArNDMwMyw4OCBAQCBpbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKVxuIFx0XHRpZiAoIW1ldGEpXG4gXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXHRcdHJlYy1cdTAwM2VmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9yZWMgPSBtZXRhLVx1MDAzZXJlY29yZDtcbitcdH1cbitcdHJldHVybiAwO1xuK31cbiBcbi1cdFx0LyogV2UgbmVlZCB0byBzZXQgdmFsdWVfcmVjIGZvciBhbGwgcm9vdCB0eXBlcywgYnV0IG5vIG5lZWRcbi1cdFx0ICogdG8gY2hlY2sgb3duZXJzaGlwIGN5Y2xlIGZvciBhIHR5cGUgdW5sZXNzIGl0J3MgYWxzbyBhXG4tXHRcdCAqIG5vZGUgdHlwZS5cbi1cdFx0ICovXG4tXHRcdGlmICghKHJlYy1cdTAwM2VmaWVsZF9tYXNrIFx1MDAyNiBCUEZfR1JBUEhfTk9ERSkpXG4rc3RhdGljIGludCBidGZfb3duZWRfdHlwZV9pZHgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLFxuK1x0XHRcdCAgICAgIGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkKVxuK3tcbitcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKm1ldGE7XG4rXHR1MzIgYnRmX2lkO1xuK1xuK1x0aWYgKGZpZWxkLVx1MDAzZXR5cGUgXHUwMDI2IEJQRl9HUkFQSF9ST09UKSB7XG4rXHRcdGJ0Zl9pZCA9IGZpZWxkLVx1MDAzZWdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xuK1x0fSBlbHNlIGlmIChmaWVsZC1cdTAwM2V0eXBlID09IEJQRl9LUFRSX1JFRiB8fCBmaWVsZC1cdTAwM2V0eXBlID09IEJQRl9LUFRSX1BFUkNQVSkge1xuK1x0XHRpZiAoYnRmX2lzX2tlcm5lbChmaWVsZC1cdTAwM2VrcHRyLmJ0ZikpXG4rXHRcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHRcdGJ0Zl9pZCA9IGZpZWxkLVx1MDAzZWtwdHIuYnRmX2lkO1xuK1x0fSBlbHNlIHtcbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHR9XG4rXG4rXHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xuK1x0aWYgKCFtZXRhKVxuK1x0XHRyZXR1cm4gZmllbGQtXHUwMDNldHlwZSBcdTAwMjYgQlBGX0dSQVBIX1JPT1QgPyAtRUZBVUxUIDogLUVOT0VOVDtcbitcdHJldHVybiBtZXRhIC0gdGFiLVx1MDAzZXR5cGVzO1xuK31cbitcbisvKlxuKyAqIEVhY2ggb3duZXJzaGlwIGVkZ2UgYWRkcyBrZXJuZWwgZnJhbWVzIHRocm91Z2ggYnBmX29ial9mcmVlX2ZpZWxkcygpIGFuZFxuKyAqIF9fYnBmX29ial9kcm9wX2ltcGwoKS4gS2VlcCB0aGUgYm91bmQgZGVsaWJlcmF0ZWx5IHNtYWxsIGJlY2F1c2Ugb2JqZWN0XG4rICogZGVzdHJ1Y3Rpb24gY2FuIGl0c2VsZiBydW4gYmVsb3cgYSBCUEYgY2FsbCBjaGFpbi4gQSBmaW5hbCBwb2ludGVlIHdpdGhvdXRcbisgKiBzcGVjaWFsIGZpZWxkcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIGFuZCBhZGRzIG9ubHkgYVxuKyAqIG5vbi1yZWN1cnNpbmcgZHJvcC5cbisgKi9cbisjZGVmaW5lIEJURl9NQVhfT1dORVJTSElQX0RFUFRIIDhcbitcbitzdGF0aWMgaW50IGJ0Zl9vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuK1x0XHRcdCAgICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLCB1OCAqZGVwdGgsXG4rXHRcdFx0ICAgICAgIGludCBpZHgsIGludCBkZXB0aF9sZWZ0KVxuK3tcbitcdGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMgPSB0YWItXHUwMDNldHlwZXNbaWR4XS5yZWNvcmQ7XG4rXHRpbnQgaSwgcmV0LCBtYXhfZGVwdGggPSAwO1xuK1xuK1x0aWYgKCFkZXB0aF9sZWZ0KVxuK1x0XHRyZXR1cm4gLUVMT09QO1xuK1x0aWYgKGRlcHRoW2lkeF0pXG4rXHRcdGdvdG8gZG9uZTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHJlYy1cdTAwM2VjbnQ7IGkrKykge1xuK1x0XHRyZXQgPSBidGZfb3duZWRfdHlwZV9pZHgoYnRmLCB0YWIsIFx1MDAyNnJlYy1cdTAwM2VmaWVsZHNbaV0pO1xuK1x0XHRpZiAocmV0ID09IC1FTk9FTlQpXG4gXHRcdFx0Y29udGludWU7XG4rXHRcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdFx0cmV0dXJuIHJldDtcbitcdFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIHJldCwgZGVwdGhfbGVmdCAtIDEpO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXHRcdG1heF9kZXB0aCA9IG1heChtYXhfZGVwdGgsIHJldCk7XG4rXHR9XG4rXHRkZXB0aFtpZHhdID0gbWF4X2RlcHRoICsgMTtcbitkb25lOlxuK1x0cmV0dXJuIGRlcHRoW2lkeF0gXHUwMDNlIGRlcHRoX2xlZnQgPyAtRUxPT1AgOiBkZXB0aFtpZHhdO1xuK31cbiBcbi1cdFx0LyogV2UgbmVlZCB0byBlbnN1cmUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW1vbmcgYWxsIHR5cGVzLiBUaGVcbi1cdFx0ICogcHJvcGVyIHdheSB0byBkbyBpdCB3b3VsZCBiZSB0byB0b3BvbG9naWNhbGx5IHNvcnQgYWxsIEJURlxuLVx0XHQgKiBJRHMgYmFzZWQgb24gdGhlIG93bmVyc2hpcCBlZGdlcywgc2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlXG4tXHRcdCAqIGJwZl97bGlzdF9oZWFkLHJiX25vZGV9IGluIGEgdHlwZS4gSW5zdGVhZCwgd2UgdXNlIHRoZVxuLVx0XHQgKiBmb2xsb3dpbmcgcmVzYW9uaW5nOlxuLVx0XHQgKlxuLVx0XHQgKiAtIEEgdHlwZSBjYW4gb25seSBiZSBvd25lZCBieSBhbm90aGVyIHR5cGUgaW4gdXNlciBCVEYgaWYgaXRcbi1cdFx0ICogICBoYXMgYSBicGZfe2xpc3QscmJ9X25vZGUuIExldCdzIGNhbGwgdGhlc2Ugbm9kZSB0eXBlcy5cbi1cdFx0ICogLSBBIHR5cGUgY2FuIG9ubHkgX293bl8gYW5vdGhlciB0eXBlIGluIHVzZXIgQlRGIGlmIGl0IGhhcyBhXG4tXHRcdCAqICAgYnBmX3tsaXN0X2hlYWQscmJfcm9vdH0uIExldCdzIGNhbGwgdGhlc2Ugcm9vdCB0eXBlcy5cbi1cdFx0ICpcbi1cdFx0ICogV2UgZW5zdXJlIHRoYXQgaWYgYSB0eXBlIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBpdHNcbi1cdFx0ICogZWxlbWVudCB0eXBlcyBjYW5ub3QgYmUgcm9vdCB0eXBlcy5cbi1cdFx0ICpcbi1cdFx0ICogVG8gZW5zdXJlIGFjeWNsaWNpdHk6XG4tXHRcdCAqXG4tXHRcdCAqIFdoZW4gQSBpcyBhbiByb290IHR5cGUgYnV0IG5vdCBhIG5vZGUsIGl0cyBvd25lcnNoaXBcbi1cdFx0ICogY2hhaW4gY2FuIGJlOlxuLVx0XHQgKlx0QSAtXHUwMDNlIEIgLVx1MDAzZSBDXG4tXHRcdCAqIFdoZXJlOlxuLVx0XHQgKiAtIEEgaXMgYW4gcm9vdCwgZS5nLiBoYXMgYnBmX3JiX3Jvb3QuXG4tXHRcdCAqIC0gQiBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgZS5nLiBoYXMgYnBmX3JiX25vZGUgYW5kXG4tXHRcdCAqICAgYnBmX2xpc3RfaGVhZC5cbi1cdFx0ICogLSBDIGlzIG9ubHkgYW4gcm9vdCwgZS5nLiBoYXMgYnBmX2xpc3Rfbm9kZVxuLVx0XHQgKlxuLVx0XHQgKiBXaGVuIEEgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIHNvbWUgb3RoZXIgdHlwZSBhbHJlYWR5XG4tXHRcdCAqIG93bnMgaXQgaW4gdGhlIEJURiBkb21haW4sIGhlbmNlIGl0IGNhbiBub3Qgb3duXG4tXHRcdCAqIGFub3RoZXIgcm9vdCB0eXBlIHRocm91Z2ggYW55IG9mIHRoZSBvd25lcnNoaXAgZWRnZXMuXG4tXHRcdCAqXHRBIC1cdTAwM2UgQlxuLVx0XHQgKiBXaGVyZTpcbi1cdFx0ICogLSBBIGlzIGJvdGggYW4gcm9vdCBhbmQgbm9kZS5cbi1cdFx0ICogLSBCIGlzIG9ubHkgYW4gbm9kZS5cbi1cdFx0ICovXG4tXHRcdGlmIChtZXRhLVx1MDAzZXJlY29yZC1cdTAwM2VmaWVsZF9tYXNrIFx1MDAyNiBCUEZfR1JBUEhfUk9PVClcbi1cdFx0XHRyZXR1cm4gLUVMT09QO1xuK3N0YXRpYyBpbnQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4rXHRcdFx0XHQgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIpXG4re1xuK1x0dTggKmRlcHRoO1xuK1x0aW50IGksIHJldCA9IDA7XG4rXG4rXHRkZXB0aCA9IGt2Y2FsbG9jKHRhYi1cdTAwM2VjbnQsIHNpemVvZigqZGVwdGgpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTtcbitcdGlmICghZGVwdGgpXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgdGFiLVx1MDAzZWNudDsgaSsrKSB7XG4rXHRcdHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCBpLFxuK1x0XHRcdFx0XHQgIEJURl9NQVhfT1dORVJTSElQX0RFUFRIKTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRicmVhaztcbitcdFx0cmV0ID0gMDtcbiBcdH1cbi1cdHJldHVybiAwO1xuK1x0a3ZmcmVlKGRlcHRoKTtcbitcdHJldHVybiByZXQ7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIF9fYnRmX3N0cnVjdF9zaG93KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxuQEAgLTYwNDUsNiArNjA3OSwxMCBAQCBzdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcbiBcdFx0XHRpZiAoZXJyIFx1MDAzYyAwKVxuIFx0XHRcdFx0Z290byBlcnJvdXRfbWV0YTtcbiBcdFx0fVxuK1xuK1x0XHRlcnIgPSBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGJ0Ziwgc3RydWN0X21ldGFfdGFiKTtcbitcdFx0aWYgKGVyciBcdTAwM2MgMClcbitcdFx0XHRnb3RvIGVycm91dF9tZXRhO1xuIFx0fVxuIFxuIFx0ZXJyID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcdTAwMjZlbnYtXHUwMDNlbG9nKTtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuY1xuaW5kZXggYzNkMTMzYzZhMDBkNC4uNTJmYWJiZWUzZGQ1YSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcbkBAIC03MTQsNyArNzE0LDcgQEAgc3RhdGljIHZvaWQgdGVzdF9idGYodm9pZClcbiBcdFx0XHRicmVhaztcbiBcbiBcdFx0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XG4tXHRcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXCJjaGVjayBidGZcIik7XG4rXHRcdEFTU0VSVF9FUShlcnIsIDAsIFwiY2hlY2sgYnRmXCIpO1xuIFx0XHRidGZfX2ZyZWUoYnRmKTtcbiBcdFx0YnJlYWs7XG4gXHR9XG5AQCAtNzczLDcgKzc3Myw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfYnRmKHZvaWQpXG4gXHRcdFx0YnJlYWs7XG4gXG4gXHRcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuLVx0XHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFwiY2hlY2sgYnRmXCIpO1xuK1x0XHRBU1NFUlRfRVEoZXJyLCAwLCBcImNoZWNrIGJ0ZlwiKTtcbiBcdFx0YnRmX19mcmVlKGJ0Zik7XG4gXHRcdGJyZWFrO1xuIFx0fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uODM2NzQxNTVlM2I3NFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuY1xuQEAgLTAsMCArMSwyMDIgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qIENvcHlyaWdodCAoYykgMjAyNiBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cbitcbisjaW5jbHVkZSBcdTAwM2NicGYvYnRmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9idGYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuK1xuKyNkZWZpbmUgU1BJTl9MT0NLIDJcbisjZGVmaW5lIExJU1RfSEVBRCAzXG4rI2RlZmluZSBMSVNUX05PREUgNFxuKy8qIEtlZXAgaW4gc3luYyB3aXRoIEJURl9NQVhfT1dORVJTSElQX0RFUFRILiAqL1xuKyNkZWZpbmUgTUFYX09XTkVSU0hJUF9ERVBUSCA4XG4rXG4rc3RhdGljIHN0cnVjdCBidGYgKmluaXRfYnRmKHZvaWQpXG4re1xuK1x0c3RydWN0IGJ0ZiAqYnRmO1xuK1x0aW50IGlkO1xuK1xuK1x0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiYnRmX19uZXdfZW1wdHlcIikpXG4rXHRcdHJldHVybiBOVUxMO1xuK1x0aWQgPSBidGZfX2FkZF9pbnQoYnRmLCBcImludFwiLCA0LCBCVEZfSU5UX1NJR05FRCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgMSwgXCJidGZfX2FkZF9pbnRcIikpXG4rXHRcdGdvdG8gZXJyX291dDtcbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJicGZfc3Bpbl9sb2NrXCIsIDQpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIFNQSU5fTE9DSywgXCJidGZfX2FkZF9zdHJ1Y3QgYnBmX3NwaW5fbG9ja1wiKSlcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcImJwZl9saXN0X2hlYWRcIiwgMTYpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfSEVBRCwgXCJidGZfX2FkZF9zdHJ1Y3QgYnBmX2xpc3RfaGVhZFwiKSlcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcImJwZl9saXN0X25vZGVcIiwgMjQpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfTk9ERSwgXCJidGZfX2FkZF9zdHJ1Y3QgYnBmX2xpc3Rfbm9kZVwiKSlcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0cmV0dXJuIGJ0ZjtcbitcbitlcnJfb3V0OlxuK1x0YnRmX19mcmVlKGJ0Zik7XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIGludCBhZGRfbG9jYWxfa3B0cihzdHJ1Y3QgYnRmICpidGYsIGludCBwb2ludGVlX2lkLCBjb25zdCBjaGFyICp0YWcpXG4re1xuK1x0aW50IGlkO1xuK1xuK1x0aWQgPSBidGZfX2FkZF90eXBlX3RhZyhidGYsIHRhZywgcG9pbnRlZV9pZCk7XG4rXHRpZiAoIUFTU0VSVF9HVChpZCwgMCwgXCJidGZfX2FkZF90eXBlX3RhZ1wiKSlcbitcdFx0cmV0dXJuIGlkO1xuK1x0aWQgPSBidGZfX2FkZF9wdHIoYnRmLCBpZCk7XG4rXHRBU1NFUlRfR1QoaWQsIDAsIFwiYnRmX19hZGRfcHRyXCIpO1xuK1x0cmV0dXJuIGlkO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X3NlbGZfY3ljbGUoY29uc3QgY2hhciAqdGFnLCBpbnQgZXhwZWN0ZWRfZXJyKVxuK3tcbitcdHN0cnVjdCBidGYgKmJ0ZjtcbitcdGludCBpZCwgZXJyO1xuK1xuK1x0YnRmID0gaW5pdF9idGYoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiaW5pdF9idGZcIikpXG4rXHRcdHJldHVybjtcbitcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA3LCB0YWcpO1xuK1x0aWYgKGlkIFx1MDAzYz0gMClcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwic2VsZl9jeWNsZVwiLCA4KTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCA3LCBcImJ0Zl9fYWRkX3N0cnVjdCBzZWxmX2N5Y2xlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJuZXh0XCIsIDYsIDAsIDApO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIHNlbGZfY3ljbGU6Om5leHRcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XG4rXHRBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsIFwiY2hlY2sgYnRmXCIpO1xuK291dDpcbitcdGJ0Zl9fZnJlZShidGYpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X2FiYV9jeWNsZSh2b2lkKVxuK3tcbitcdHN0cnVjdCBidGYgKmJ0ZjtcbitcdGludCBpZCwgZXJyO1xuK1xuK1x0YnRmID0gaW5pdF9idGYoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiaW5pdF9idGZcIikpXG4rXHRcdHJldHVybjtcbitcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCAxMCwgXCJrcHRyXCIpO1xuK1x0aWYgKGlkIFx1MDAzYz0gMClcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgOSwgXCJrcHRyXCIpO1xuK1x0aWYgKGlkIFx1MDAzYz0gMClcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwiY3ljbGVfYVwiLCA4KTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCA5LCBcImJ0Zl9fYWRkX3N0cnVjdCBjeWNsZV9hXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJiXCIsIDYsIDAsIDApO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIGN5Y2xlX2E6OmJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcImN5Y2xlX2JcIiwgOCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgMTAsIFwiYnRmX19hZGRfc3RydWN0IGN5Y2xlX2JcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcImFcIiwgOCwgMCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgY3ljbGVfYjo6YVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbitcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXCJjaGVjayBidGZcIik7XG4rb3V0OlxuK1x0YnRmX19mcmVlKGJ0Zik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfbWl4ZWRfY3ljbGUodm9pZClcbit7XG4rXHRzdHJ1Y3QgYnRmICpidGY7XG4rXHRpbnQgaWQsIGVycjtcbitcbitcdGJ0ZiA9IGluaXRfYnRmKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcImluaXRfYnRmXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgNywgXCJrcHRyXCIpO1xuK1x0aWYgKGlkIFx1MDAzYz0gMClcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwibWl4ZWRfb3duZXJcIiwgMjApO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIDcsIFwiYnRmX19hZGRfc3RydWN0IG1peGVkX293bmVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJyb290XCIsIExJU1RfSEVBRCwgMCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgbWl4ZWRfb3duZXI6OnJvb3RcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcImxvY2tcIiwgU1BJTl9MT0NLLCAxMjgsIDApO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIG1peGVkX293bmVyOjpsb2NrXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlkID0gYnRmX19hZGRfZGVjbF90YWcoYnRmLCBcImNvbnRhaW5zOm1peGVkX25vZGU6bm9kZVwiLCA3LCAwKTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCA4LCBcImJ0Zl9fYWRkX2RlY2xfdGFnIG1peGVkX293bmVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJtaXhlZF9ub2RlXCIsIDMyKTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCA5LCBcImJ0Zl9fYWRkX3N0cnVjdCBtaXhlZF9ub2RlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJub2RlXCIsIExJU1RfTk9ERSwgMCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgbWl4ZWRfbm9kZTo6bm9kZVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwib3duZXJcIiwgNiwgMTkyLCAwKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBtaXhlZF9ub2RlOjpvd25lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbitcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXCJjaGVjayBidGZcIik7XG4rb3V0OlxuK1x0YnRmX19mcmVlKGJ0Zik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfYWN5Y2xpY19kZXB0aChpbnQgZGVwdGgsIGludCBleHBlY3RlZF9lcnIpXG4re1xuK1x0aW50IHB0cl9pZFtNQVhfT1dORVJTSElQX0RFUFRIICsgMV07XG4rXHRpbnQgZmlyc3Rfc3RydWN0X2lkO1xuK1x0c3RydWN0IGJ0ZiAqYnRmO1xuK1x0aW50IGlkLCBlcnIsIGk7XG4rXG4rXHRidGYgPSBpbml0X2J0ZigpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJpbml0X2J0ZlwiKSlcbitcdFx0cmV0dXJuO1xuK1x0Zmlyc3Rfc3RydWN0X2lkID0gNSArIDIgKiBkZXB0aDtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGRlcHRoOyBpKyspIHtcbitcdFx0cHRyX2lkW2ldID0gYWRkX2xvY2FsX2twdHIoYnRmLCBmaXJzdF9zdHJ1Y3RfaWQgKyBpICsgMSwgXCJrcHRyXCIpO1xuK1x0XHRpZiAocHRyX2lkW2ldIFx1MDAzYz0gMClcbitcdFx0XHRnb3RvIG91dDtcbitcdH1cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGRlcHRoOyBpKyspIHtcbitcdFx0Y2hhciBuYW1lWzE2XTtcbitcbitcdFx0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcIm93bmVyXyVkXCIsIGkpO1xuK1x0XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIDgpO1xuK1x0XHRpZiAoIUFTU0VSVF9FUShpZCwgZmlyc3Rfc3RydWN0X2lkICsgaSwgXCJidGZfX2FkZF9zdHJ1Y3Qgb3duZXJcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJuZXh0XCIsIHB0cl9pZFtpXSwgMCwgMCk7XG4rXHRcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBvd25lcjo6bmV4dFwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdH1cbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJwbGFpbl9sZWFmXCIsIDQpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIGZpcnN0X3N0cnVjdF9pZCArIGRlcHRoLCBcImJ0Zl9fYWRkX3N0cnVjdCBwbGFpbl9sZWFmXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuK1x0QVNTRVJUX0VRKGVyciwgZXhwZWN0ZWRfZXJyLCBcImNoZWNrIGJ0ZlwiKTtcbitvdXQ6XG4rXHRidGZfX2ZyZWUoYnRmKTtcbit9XG4rXG4rdm9pZCB0ZXN0X2xvY2FsX2twdHJfb3duZXJzaGlwKHZvaWQpXG4re1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJzZWxmX2N5Y2xlXCIpKVxuK1x0XHR0ZXN0X3NlbGZfY3ljbGUoXCJrcHRyXCIsIC1FTE9PUCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInVudHJ1c3RlZF9zZWxmX2N5Y2xlXCIpKVxuK1x0XHR0ZXN0X3NlbGZfY3ljbGUoXCJrcHRyX3VudHJ1c3RlZFwiLCAwKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicGVyY3B1X3NlbGZfY3ljbGVcIikpXG4rXHRcdHRlc3Rfc2VsZl9jeWNsZShcInBlcmNwdV9rcHRyXCIsIC1FTE9PUCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcIkFCQV9jeWNsZVwiKSlcbitcdFx0dGVzdF9hYmFfY3ljbGUoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibWl4ZWRfZ3JhcGhfcm9vdF9jeWNsZVwiKSlcbitcdFx0dGVzdF9taXhlZF9jeWNsZSgpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtYXhfYWN5Y2xpY1wiKSlcbitcdFx0dGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEgsIDApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJ0b29fZGVlcF9hY3ljbGljXCIpKVxuK1x0XHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCArIDEsIC1FTE9PUCk7XG4rfVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjc6MzQuMjYwODIwOTFaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo2MTcxMDM0NDg0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEluaXRpYWwgQXNzZXNzbWVudCBvZiB0aGUgQlBGIFBhdGNoKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2guIE15IGltbWVkaWF0ZSBnb2FsIGlzIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyB3YXJyYW50cyBhIGZ1enppbmcgY2FtcGFpZ24sIGFuZCBpZiBzbywgaG93IHRvIGJlc3QgYXBwcm9hY2ggaXQuIFdoYXQgY29uZmlndXJhdGlvbnMgYXJlIGdvaW5nIHRvIGJlIG1vc3QgZWZmZWN0aXZlLCBhbmQgd2hpY2ggc3BlY2lmaWMgc3ltYm9scyBhcmUgdGhlIG1vc3QgbGlrZWx5IHRhcmdldHMgZm9yIGV4cGxvaXRhdGlvbj9cblxuRmlyc3QsIHRoZSBkaWZmIGl0c2VsZi4gT2theSwgaXQgdG91Y2hlcyBga2VybmVsL2JwZi9idGYuY2AgYW5kIGEgZmV3IHRlc3QgZmlsZXMgdW5kZXIgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4uLmAg4oCTIHRoYXQncyBhbHJlYWR5IGludGVyZXN0aW5nLiBMZXQncyBicmVhayBkb3duIHRoZSBjaGFuZ2VzOiBJbiBga2VybmVsL2JwZi9idGYuY2AsIHdlIHNlZSBtb2RpZmljYXRpb25zIHRvIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2AuIFRoZW4sIHNvbWUgbmV3IGhlbHBlciBmdW5jdGlvbnMgaGF2ZSBiZWVuIGludHJvZHVjZWQ6IGBidGZfb3duZWRfdHlwZV9pZHhgLCBgYnRmX293bmVyc2hpcF9kZXB0aGAsIGFuZCBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAuIENydWNpYWxseSwgdGhlcmUncyBhIG5ldyBjYWxsIHRvIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGJ0Ziwgc3RydWN0X21ldGFfdGFiKWAgd2l0aGluIGBidGZfcGFyc2VgLiBUaGF0J3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IGBzdHJ1Y3RfbWV0YV90YWJgIGFjdHVhbGx5ICppcyogd2l0aGluIHRoYXQgY29udGV4dDsgSSdsbCBuZWVkIHRvIGxvb2sgYXQgdGhlIHN1cnJvdW5kaW5nIGNvZGUgdG8gZGV0ZXJtaW5lIGl0cyByb2xlIGFuZCBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0aWVzLlxuXG5Ob3csIEknbSBnb2luZyB0byBzdGFydCBkaWdnaW5nIGludG8gdGhlIGNvZGUgaXRzZWxmLiBUaW1lIHRvIGZpcmUgdXAgbXkgYW5hbHlzaXMgdG9vbHMgYW5kIGdldCBhIGJldHRlciBwaWN0dXJlIG9mIHRoZSBzaXR1YXRpb24uIEkgbmVlZCB0byBjaGVjayBob3cgdGhlc2UgaGVscGVyIGZ1bmN0aW9ucyBpbnRlcmFjdCB3aXRoIHRoZSBleGlzdGluZyBjb2RlIGFuZCB1bmRlcnN0YW5kIHRoZSBwb3RlbnRpYWwgaW1wbGljYXRpb25zIG9mIHRoZXNlIGNoYW5nZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjc4MjMsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxODEsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyNzo0MC40MzE4NTgzNTNaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzAyMzE4MTYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvYnBmL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL2J0Zi5jPTQzNDE9c3RhdGljIGludCBidGZfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNDM2OC1cXG5rZXJuZWwvYnBmL2J0Zi5jOjQzNjk6c3RhdGljIGludCBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG5rZXJuZWwvYnBmL2J0Zi5jLTQzNzAtXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYz01OTk5PXN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2UoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy02MDgyLVxcbmtlcm5lbC9icGYvYnRmLmM6NjA4MzpcXHRcXHRlcnIgPSBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGJ0Ziwgc3RydWN0X21ldGFfdGFiKTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTYwODQtXFx0XFx0aWYgKGVyciBcXHUwMDNjIDApXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDEyOjI3OjQwLjUwMjA5NzU1OFoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIzMjM2MjcxMjIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgeW91IHJlcXVlc3RlZDpcblxuKipEaXZpbmcgRGVlcCBpbnRvIEJURiBhbmQgaXRzIENhbGxlcnMqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gZ2V0IGEgcmVhbGx5IHNvbGlkIGdyYXNwIG9uIHRoZSBiZWhhdmlvciBvZiB0aGVzZSBzcGVjaWZpYyBmdW5jdGlvbnMuIEkga25vdyB0aGUgZ2VuZXJhbCBpZGVhLCBidXQgdG8gdW5kZXJzdGFuZCB0aGUgKndoeSogYW5kIHRoZSBzdWJ0bGV0aWVzLCBJIG5lZWQgdG8gc2VlIHRoZW0gaW4gYWN0aW9uLiBUaGUgYmVzdCB3YXkgdG8gZG8gdGhhdCwgZXNwZWNpYWxseSBpbiB0aGUga2VybmVsLCBpcyB0byBnbyBzdHJhaWdodCB0byB0aGUgc291cmNlLiBTcGVjaWZpY2FsbHksIEkgc2hvdWxkIGNyYWNrIG9wZW4gYGtlcm5lbC9icGYvYnRmLmNgLiBUaGF0J3Mgd2hlcmUgdGhlIG1hZ2ljIGlzIGhhcHBlbmluZywgcmlnaHQ/IEknbSB0aGlua2luZyB0aGUgYmVzdCBzdHJhdGVneSBpcyB0byBsb29rIGF0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGFzIHdlbGwsIHNvIEkgY2FuIHNlZSB3aGF0IHRoZXNlIGZ1bmN0aW9ucyBhcmUgaW50ZXJhY3Rpbmcgd2l0aCwgd2hhdCBjYWxscyB0aGVtLCBhbmQgd2hhdCB0aGV5IGNhbGwuIENvbnRleHQgaXMga2luZywgYW5kIGluIGEgY29tcGxleCBzeXN0ZW0gbGlrZSB0aGUgQlBGIGluZnJhc3RydWN0dXJlLCBjb250ZXh0IGlzIGV2ZXJ5dGhpbmcuIFRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5IGFuZCBzdGFydCB0cmFjaW5nIHRob3NlIGNhbGxzISBMZXQncyBzZWUgd2hhdCB3ZSBjYW4gbGVhcm4gYWJvdXQgdGhlIHJlbGF0aW9uc2hpcCBvZiBmdW5jdGlvbnMsIGFuZCB0aGUgb3ZlcmFsbCByb2xlIHRoZXNlIGZ1bmN0aW9ucyBwbGF5LlxuXG5cbiIsIklucHV0VG9rZW5zIjo4NjE1LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjc6NDIuODI1NzI3ODlaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NzUzNDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2JwZi9idGYuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA0MzAwLFxuICBcIkxpbmVDb3VudFwiOiA5MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCI0MzAwOlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbjQzMDE6XFx0XFx0XFx0YnRmX2lkID0gcmVjLVxcdTAwM2VmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9idGZfaWQ7XFxuNDMwMjpcXHRcXHRcXHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xcbjQzMDM6XFx0XFx0XFx0aWYgKCFtZXRhKVxcbjQzMDQ6XFx0XFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuNDMwNTpcXHRcXHRcXHRyZWMtXFx1MDAzZWZpZWxkc1tpXS5ncmFwaF9yb290LnZhbHVlX3JlYyA9IG1ldGEtXFx1MDAzZXJlY29yZDtcXG40MzA2OlxcdFxcdH1cXG40MzA3OlxcdFxcdHJldHVybiAwO1xcbjQzMDg6XFx0fVxcbjQzMDk6XFx0XFxuNDMxMDpcXHRzdGF0aWMgaW50IGJ0Zl9vd25lZF90eXBlX2lkeChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsXFxuNDMxMTpcXHRcXHRcXHRcXHQgICAgICBjb25zdCBzdHJ1Y3QgYnRmX2ZpZWxkICpmaWVsZClcXG40MzEyOlxcdHtcXG40MzEzOlxcdFxcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKm1ldGE7XFxuNDMxNDpcXHRcXHR1MzIgYnRmX2lkO1xcbjQzMTU6XFx0XFxuNDMxNjpcXHRcXHRpZiAoZmllbGQtXFx1MDAzZXR5cGUgXFx1MDAyNiBCUEZfR1JBUEhfUk9PVCkge1xcbjQzMTc6XFx0XFx0XFx0YnRmX2lkID0gZmllbGQtXFx1MDAzZWdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xcbjQzMTg6XFx0XFx0fSBlbHNlIGlmIChmaWVsZC1cXHUwMDNldHlwZSA9PSBCUEZfS1BUUl9SRUYgfHwgZmllbGQtXFx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUEVSQ1BVKSB7XFxuNDMxOTpcXHRcXHRcXHRpZiAoYnRmX2lzX2tlcm5lbChmaWVsZC1cXHUwMDNla3B0ci5idGYpKVxcbjQzMjA6XFx0XFx0XFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuNDMyMTpcXHRcXHRcXHRidGZfaWQgPSBmaWVsZC1cXHUwMDNla3B0ci5idGZfaWQ7XFxuNDMyMjpcXHRcXHR9IGVsc2Uge1xcbjQzMjM6XFx0XFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuNDMyNDpcXHRcXHR9XFxuNDMyNTpcXHRcXG40MzI2OlxcdFxcdG1ldGEgPSBidGZfZmluZF9zdHJ1Y3RfbWV0YShidGYsIGJ0Zl9pZCk7XFxuNDMyNzpcXHRcXHRpZiAoIW1ldGEpXFxuNDMyODpcXHRcXHRcXHRyZXR1cm4gZmllbGQtXFx1MDAzZXR5cGUgXFx1MDAyNiBCUEZfR1JBUEhfUk9PVCA/IC1FRkFVTFQgOiAtRU5PRU5UO1xcbjQzMjk6XFx0XFx0cmV0dXJuIG1ldGEgLSB0YWItXFx1MDAzZXR5cGVzO1xcbjQzMzA6XFx0fVxcbjQzMzE6XFx0XFxuNDMzMjpcXHQvKlxcbjQzMzM6XFx0ICogRWFjaCBvd25lcnNoaXAgZWRnZSBhZGRzIGtlcm5lbCBmcmFtZXMgdGhyb3VnaCBicGZfb2JqX2ZyZWVfZmllbGRzKCkgYW5kXFxuNDMzNDpcXHQgKiBfX2JwZl9vYmpfZHJvcF9pbXBsKCkuIEtlZXAgdGhlIGJvdW5kIGRlbGliZXJhdGVseSBzbWFsbCBiZWNhdXNlIG9iamVjdFxcbjQzMzU6XFx0ICogZGVzdHJ1Y3Rpb24gY2FuIGl0c2VsZiBydW4gYmVsb3cgYSBCUEYgY2FsbCBjaGFpbi4gQSBmaW5hbCBwb2ludGVlIHdpdGhvdXRcXG40MzM2OlxcdCAqIHNwZWNpYWwgZmllbGRzIGlzIG5vdCBwcmVzZW50IGluIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgYW5kIGFkZHMgb25seSBhXFxuNDMzNzpcXHQgKiBub24tcmVjdXJzaW5nIGRyb3AuXFxuNDMzODpcXHQgKi9cXG40MzM5OlxcdCNkZWZpbmUgQlRGX01BWF9PV05FUlNISVBfREVQVEggOFxcbjQzNDA6XFx0XFxuNDM0MTpcXHRzdGF0aWMgaW50IGJ0Zl9vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxcbjQzNDI6XFx0XFx0XFx0XFx0ICAgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIsIHU4ICpkZXB0aCxcXG40MzQzOlxcdFxcdFxcdFxcdCAgICAgICBpbnQgaWR4LCBpbnQgZGVwdGhfbGVmdClcXG40MzQ0OlxcdHtcXG40MzQ1OlxcdFxcdGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMgPSB0YWItXFx1MDAzZXR5cGVzW2lkeF0ucmVjb3JkO1xcbjQzNDY6XFx0XFx0aW50IGksIHJldCwgbWF4X2RlcHRoID0gMDtcXG40MzQ3OlxcdFxcbjQzNDg6XFx0XFx0aWYgKCFkZXB0aF9sZWZ0KVxcbjQzNDk6XFx0XFx0XFx0cmV0dXJuIC1FTE9PUDtcXG40MzUwOlxcdFxcdGlmIChkZXB0aFtpZHhdKVxcbjQzNTE6XFx0XFx0XFx0Z290byBkb25lO1xcbjQzNTI6XFx0XFxuNDM1MzpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgcmVjLVxcdTAwM2VjbnQ7IGkrKykge1xcbjQzNTQ6XFx0XFx0XFx0cmV0ID0gYnRmX293bmVkX3R5cGVfaWR4KGJ0ZiwgdGFiLCBcXHUwMDI2cmVjLVxcdTAwM2VmaWVsZHNbaV0pO1xcbjQzNTU6XFx0XFx0XFx0aWYgKHJldCA9PSAtRU5PRU5UKVxcbjQzNTY6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuNDM1NzpcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG40MzU4OlxcdFxcdFxcdFxcdHJldHVybiByZXQ7XFxuNDM1OTpcXHRcXHRcXHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgcmV0LCBkZXB0aF9sZWZ0IC0gMSk7XFxuNDM2MDpcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG40MzYxOlxcdFxcdFxcdFxcdHJldHVybiByZXQ7XFxuNDM2MjpcXHRcXHRcXHRtYXhfZGVwdGggPSBtYXgobWF4X2RlcHRoLCByZXQpO1xcbjQzNjM6XFx0XFx0fVxcbjQzNjQ6XFx0XFx0ZGVwdGhbaWR4XSA9IG1heF9kZXB0aCArIDE7XFxuNDM2NTpcXHRkb25lOlxcbjQzNjY6XFx0XFx0cmV0dXJuIGRlcHRoW2lkeF0gXFx1MDAzZSBkZXB0aF9sZWZ0ID8gLUVMT09QIDogZGVwdGhbaWR4XTtcXG40MzY3OlxcdH1cXG40MzY4OlxcdFxcbjQzNjk6XFx0c3RhdGljIGludCBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG40MzcwOlxcdFxcdFxcdFxcdFxcdCAgICAgc3RydWN0IGJ0Zl9zdHJ1Y3RfbWV0YXMgKnRhYilcXG40MzcxOlxcdHtcXG40MzcyOlxcdFxcdHU4ICpkZXB0aDtcXG40MzczOlxcdFxcdGludCBpLCByZXQgPSAwO1xcbjQzNzQ6XFx0XFxuNDM3NTpcXHRcXHRkZXB0aCA9IGt2Y2FsbG9jKHRhYi1cXHUwMDNlY250LCBzaXplb2YoKmRlcHRoKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTik7XFxuNDM3NjpcXHRcXHRpZiAoIWRlcHRoKVxcbjQzNzc6XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuNDM3ODpcXHRcXG40Mzc5OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyB0YWItXFx1MDAzZWNudDsgaSsrKSB7XFxuNDM4MDpcXHRcXHRcXHRyZXQgPSBidGZfb3duZXJzaGlwX2RlcHRoKGJ0ZiwgdGFiLCBkZXB0aCwgaSxcXG40MzgxOlxcdFxcdFxcdFxcdFxcdFxcdCAgQlRGX01BWF9PV05FUlNISVBfREVQVEgpO1xcbjQzODI6XFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuNDM4MzpcXHRcXHRcXHRcXHRicmVhaztcXG40Mzg0OlxcdFxcdFxcdHJldCA9IDA7XFxuNDM4NTpcXHRcXHR9XFxuNDM4NjpcXHRcXHRrdmZyZWUoZGVwdGgpO1xcbjQzODc6XFx0XFx0cmV0dXJuIHJldDtcXG40Mzg4OlxcdH1cXG40Mzg5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyNzo0Mi44MjYzMDYyOFoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjI1OTk1NzEyODMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHQgcHJvY2Vzc2VzOlxuXG4qKkRlbHZpbmcgaW50byBCVEYgUGFyc2luZyBhbmQgRmllbGQgTWFuaXB1bGF0aW9uKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGBidGZfcGFyc2VgIGFuZCBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIGFyZSBhY3R1YWxseSAqdXNlZCogd2l0aGluIHRoZSBsYXJnZXIgY29udGV4dC4gTXkgZmlyc3QgbW92ZSBpcyBjbGVhcjogSSB3YW50IHRvIHRyYWNlIHRoZSBjYWxsIHBhdGhzLiBJIG5lZWQgdG8gc2VlIHdoZXJlIHRoZXNlIGZ1bmN0aW9ucyBhcmUgaW52b2tlZC4gVW5kZXJzdGFuZGluZyB0aGUgY2FsbGluZyBjb250ZXh0cyB3aWxsIGdpdmUgbWUgaW1tZWRpYXRlIGluc2lnaHQgaW50byB0aGUgcm9sZSBvZiB0aGVzZSBmdW5jdGlvbnMgd2l0aGluIHRoZSBCVEYgKEJQRiBUeXBlIEZvcm1hdCkgaW5mcmFzdHJ1Y3R1cmUuIEFyZSB0aGV5IGNhbGxlZCBkdXJpbmcgQlRGIG9iamVjdCBsb2FkaW5nPyBEdXJpbmcgcHJvZ3JhbSB2ZXJpZmljYXRpb24/IE1heWJlIGR1cmluZyBzb21lIGtpbmQgb2YgdHlwZSBpbnRyb3NwZWN0aW9uIG9yIG9wdGltaXphdGlvbj8gS25vd2luZyB0aGUgY2FsbCBzaXRlcyBpcyBrZXkgdG8gZm9ybXVsYXRpbmcgYSBwcm9wZXIgbWVudGFsIG1vZGVsLiBJJ2xsIHN0YXJ0IHdpdGggYSBzdHJhaWdodGZvcndhcmQgc2VhcmNoIGZvciB0aG9zZSBmdW5jdGlvbiBuYW1lcyBhbmQgZm9sbG93IHRoZSB0cmFpbC4gVGhpcyBzaG91bGQgYmUgaW50ZXJlc3RpbmcuLi4gdGltZSB0byBkaWcgaW4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwMzAwLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyNzo0NS40MjU4ODI2MjJaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzE3MDA0MDUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL2JwZi9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2JwZi9idGYuYz00MTM1PXN0cnVjdCBidGZfcmVjb3JkICpidGZfcGFyc2VfZmllbGRzKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy00MjY3LVxcbmtlcm5lbC9icGYvYnRmLmM6NDI2ODppbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKVxcbmtlcm5lbC9icGYvYnRmLmMtNDI2OS17XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTU5OTk9c3RhdGljIHN0cnVjdCBidGYgKmJ0Zl9wYXJzZShjb25zdCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNzctXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHN0cnVjdF9tZXRhX3RhYi1cXHUwMDNlY250OyBpKyspIHtcXG5rZXJuZWwvYnBmL2J0Zi5jOjYwNzg6XFx0XFx0XFx0ZXJyID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBzdHJ1Y3RfbWV0YV90YWItXFx1MDAzZXR5cGVzW2ldLnJlY29yZCk7XFxua2VybmVsL2JwZi9idGYuYy02MDc5LVxcdFxcdFxcdGlmIChlcnIgXFx1MDAzYyAwKVxcbi0tXFxua2VybmVsL2JwZi9zeXNjYWxsLmM9MTI1NT1zdGF0aWMgaW50IG1hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl90b2tlbiAqdG9rZW4sXFxuLS1cXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy0xMzYzLVxcbmtlcm5lbC9icGYvc3lzY2FsbC5jOjEzNjQ6XFx0cmV0ID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBtYXAtXFx1MDAzZXJlY29yZCk7XFxua2VybmVsL2JwZi9zeXNjYWxsLmMtMTM2NS1cXHRpZiAocmV0IFxcdTAwM2MgMClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjc6NDUuNDk3NTg4MTI4WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzcwMzY4OTgzMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipBbmFseXppbmcgYGJ0Zl9wYXJzZWAgQ2FsbHNpdGVzKipcblxuT2theSwgdGltZSB0byBkaXZlIGluLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgXCJXaGVyZSBleGFjdGx5IGlzIHRoaXMgYGJ0Zl9wYXJzZWAgZnVuY3Rpb24gYmVpbmcgaW52b2tlZD9cIiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgY29udGV4dC4gS25vd2luZyB0aGUgY2FsbGluZyBmdW5jdGlvbnMgaXMgY3J1Y2lhbCBmb3IgZ3Jhc3BpbmcgaXRzIHB1cnBvc2Ugd2l0aGluIHRoZSBicm9hZGVyIHN5c3RlbS4gSSdsbCBuZWVkIHRvIHRyYWNlIHRoZSBjYWxsc2l0ZXMgdG8gZmlndXJlIG91dCB3aGF0IGRhdGEgaXQncyBwcm9jZXNzaW5nLCB3aGF0IHJlc291cmNlcyBpdCdzIHV0aWxpemluZywgYW5kIHdoYXQgdGhlIG92ZXJhbGwgd29ya2Zsb3cgbG9va3MgbGlrZSBhcm91bmQgaXQuIEFyZSB3ZSBkZWFsaW5nIHdpdGgga2VybmVsIHNwYWNlLCB1c2VyIHNwYWNlLCBvciBib3RoPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBjb25jdXJyZW5jeSBpc3N1ZXMgdG8gY29uc2lkZXIsIGdpdmVuIGhvdyBtYW55IGNhbGwgc2l0ZXM/IFRoaXMgY291bGQgZ2l2ZSBtZSBhIG11Y2ggYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIG92ZXJhbGwgcHVycG9zZSBvZiB0aGUgcHJvZ3JhbS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTA5NTAsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyNzo0OS4yMDEyODA3WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NTI1NTYzNSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJidGZfcGFyc2VcXFxcKFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvYnBmL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL2J0Zi5jPTU5NjE9c3RhdGljIGludCBidGZfY2hlY2tfbW9kaWZpZXJfY2hhaW5fbGVuZ3RoKHN0cnVjdCBidGZfdmVyaWZpZXJfZW52ICplbnYsXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTU5OTgtXFxua2VybmVsL2JwZi9idGYuYzo1OTk5OnN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2UoY29uc3QgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLFxcbmtlcm5lbC9icGYvYnRmLmMtNjAwMC1cXHRcXHRcXHQgICAgIHN0cnVjdCBicGZfbG9nX2F0dHIgKmF0dHJfbG9nKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYz04NDA0PWludCBidGZfbmV3X2ZkKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl9sb2dfYXR0ciAqYXR0cl9sb2cpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTg0MDgtXFxua2VybmVsL2JwZi9idGYuYzo4NDA5OlxcdGJ0ZiA9IGJ0Zl9wYXJzZShhdHRyLCB1YXR0ciwgYXR0cl9sb2cpO1xcbmtlcm5lbC9icGYvYnRmLmMtODQxMC1cXHRpZiAoSVNfRVJSKGJ0ZikpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDEyOjI3OjQ5LjI4NjU0MzEzNVoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxNjIwOTMxMDk1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYW5hbHlzaXMgb2YgdGhlIHNpdHVhdGlvbjpcblxuKipJbnZlc3RpZ2F0aW5nIHRoZSBgYnRmX25ld19mZGAgRnVuY3Rpb24gQ2FsbCoqXG5cbk9rYXksIHNvIEknbSB0cmFjaW5nIGRvd24gdGhpcyBgYnRmX25ld19mZGAgZnVuY3Rpb24uIFRoZSBjYWxsIHN0YWNrIGluZGljYXRlcyBpdCdzIHRyaWdnZXJlZCBmcm9tIHRoZSBgYnBmKEJQRl9CVEZfTE9BRClgIHN5c3RlbSBjYWxsLCBzcGVjaWZpY2FsbHkgdGhyb3VnaCBgc3lzY2FsbC5jYC4gU2luY2UgdGhhdCdzIHRoZSBlbnRyeSBwb2ludCwgaXQncyB0aGUgb2J2aW91cyBwbGFjZSB0byBzdGFydC4gSSdsbCBuZWVkIHRvIGRpdmUgaW50byBga2VybmVsL2JwZi9zeXNjYWxsLmNgIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgYGJ0Zl9uZXdfZmRgIGZ1bmN0aW9uIGlzIGJlaW5nIGludm9rZWQgYW5kIHdoYXQgaW5mb3JtYXRpb24gaXMgYmVpbmcgcGFzc2VkLiBUaGF0IHNob3VsZCBnaXZlIG1lIHRoZSBjb250ZXh0IEkgbmVlZCB0byBmaWd1cmUgb3V0IGV4YWN0bHkgd2hhdCdzIGhhcHBlbmluZy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE0MjksIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyNzo1MC45MDc0Nzg1NVoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzI2NjI1NjYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnRmX25ld19mZFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvYnBmL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL2J0Zi5jPTgzOTI9Y29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBidGZfZm9wcyA9IHtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODM5OC1cXG5rZXJuZWwvYnBmL2J0Zi5jOjgzOTk6c3RhdGljIGludCBfX2J0Zl9uZXdfZmQoc3RydWN0IGJ0ZiAqYnRmKVxcbmtlcm5lbC9icGYvYnRmLmMtODQwMC17XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTg0MDMtXFxua2VybmVsL2JwZi9idGYuYzo4NDA0OmludCBidGZfbmV3X2ZkKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl9sb2dfYXR0ciAqYXR0cl9sb2cpXFxua2VybmVsL2JwZi9idGYuYy04NDA1LXtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODQyNC1cXG5rZXJuZWwvYnBmL2J0Zi5jOjg0MjU6XFx0cmV0ID0gX19idGZfbmV3X2ZkKGJ0Zik7XFxua2VybmVsL2JwZi9idGYuYy04NDI2LVxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYz04NTA0PWludCBidGZfZ2V0X2ZkX2J5X2lkKHUzMiBpZClcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODUxNy1cXG5rZXJuZWwvYnBmL2J0Zi5jOjg1MTg6XFx0ZmQgPSBfX2J0Zl9uZXdfZmQoYnRmKTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTg1MTktXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9ODc1Nj1CUEZfQ0FMTF80KGJwZl9idGZfZmluZF9ieV9uYW1lX2tpbmQsIGNoYXIgKiwgbmFtZSwgaW50LCBuYW1lX3N6LCB1MzIsIGtpbmQsIGludCwgZmxhZ3MpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTg3NjktXFx0aWYgKHJldCBcXHUwMDNlIDAgXFx1MDAyNlxcdTAwMjYgYnRmX2lzX21vZHVsZShidGYpKSB7XFxua2VybmVsL2JwZi9idGYuYzo4NzcwOlxcdFxcdGJ0Zl9vYmpfZmQgPSBfX2J0Zl9uZXdfZmQoYnRmKTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTg3NzEtXFx0XFx0aWYgKGJ0Zl9vYmpfZmQgXFx1MDAzYyAwKSB7XFxuLS1cXG5rZXJuZWwvYnBmL3N5c2NhbGwuYz01NTY0PXN0YXRpYyBpbnQgYnBmX2J0Zl9sb2FkKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl9sb2dfYXR0ciAqYXR0cl9sb2cpXFxuLS1cXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy01NTkwLVxcbmtlcm5lbC9icGYvc3lzY2FsbC5jOjU1OTE6XFx0cmV0dXJuIGJ0Zl9uZXdfZmQoYXR0ciwgdWF0dHIsIGF0dHJfbG9nKTtcXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy01NTkyLX1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjc6NTAuOTgwMTQ2MTU2WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQ5MTQzNTc1ODQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBCVEYgUGF0Y2ggYW5kIEl0cyBJbXBsaWNhdGlvbnMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IHRoaXMgcGF0Y2ggaXMgYWRkcmVzc2luZyBhIGZsYXcgaW4gaG93IHdlIGhhbmRsZSBhbmQgdmVyaWZ5IEJURiBkYXRhLCBzcGVjaWZpY2FsbHkgYXJvdW5kIHRoZSBvd25lcnNoaXAgYW5kIGN5Y2xpY2FsIHJlbGF0aW9uc2hpcHMgb2Ygc3RydWN0cyB3aXRoaW4gdGhlIEJQRiBzeXN0ZW0uIEJlZm9yZSB0aGlzLCBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIGhhZCBhIHByZXR0eSBzaW1wbGlzdGljIGNoZWNrIGZvciBncmFwaCByb290IGFjeWNsaWNpdHkuIEl0IHVzZWQgdGhpcyByYXRoZXIgYmFzaWMgaGV1cmlzdGljOiBcIklmIGEgdHlwZSBpcyBib3RoIGEgcm9vdCBhbmQgYSBub2RlLCBpdCdzIGFscmVhZHkgb3duZWQgYW5kIGNhbid0IG93biBhbm90aGVyIHJvb3QgdHlwZS5cIiBQcm9ibGVtIGlzLCB0aGlzIHdhc24ndCByb2J1c3QgZW5vdWdoLiBJdCBmYWlsZWQgdG8gY29uc2lkZXIgYGtwdHJgIG93bmVyc2hpcCBkZXB0aCBvciBjeWNsZXPigJR0aGUgbG9jYWwgcG9pbnRlciBvd25lcnNoaXAgc2NlbmFyaW9zLCBhbmQgSSBzZWUgdGhlIHByb2JsZW0uIFdlIG5lZWQgc29tZXRoaW5nIG1vcmUgc29waGlzdGljYXRlZC5cblxuVGhlIHBhdGNoIGVzc2VudGlhbGx5IHJlZmFjdG9ycyB0aGlzIGxvZ2ljLCBhbmQgaXQgbG9va3MgbGlrZSBhIGdvb2QgY2hhbmdlLiBJdCBzZXBhcmF0ZXMgdGhlIGluaXRpYWwgZ3JhcGggcm9vdCBzZXR0aW5nIGluIGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2AsIG5vdyBqdXN0IHNldHRpbmcgdGhlIGB2YWx1ZV9yZWNgLCBmcm9tIGEgbmV3LCBkZWRpY2F0ZWQgb3duZXJzaGlwIGRlcHRoIGNoZWNrLiBUaGlzIG5ldyBhbGdvcml0aG0sIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCwgaXMgdGhlIGtleS4gSXQncyBkZXNpZ25lZCB0byBjYWxjdWxhdGUgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgIGZvciBhbGwgc3RydWN0IG1ldGFzIHVwIHRvIGEgZGVmaW5lZCBsaW1pdCAoYEJURl9NQVhfT1dORVJTSElQX0RFUFRIYCwgY3VycmVudGx5IDgpLiBUaGlzIGlzIHdoZXJlIHRoZSBoZWF2eSBsaWZ0aW5nIGhhcHBlbnM6IGRldGVjdGluZyBjeWNsZXMgYW5kIGV4Y2Vzc2l2ZSBvd25lcnNoaXAgZGVwdGgsIGNvbnNpZGVyaW5nIGJvdGggdGhlIGdyYXBoIHJvb3RzIChgQlBGX0dSQVBIX1JPT1RgKSBhbmQgdGhlIGxvY2FsIGBrcHRyYCByZWxhdGlvbnNoaXBzIChgQlBGX0tQVFJfUkVGYCBvciBgQlBGX0tQVFJfUEVSQ1BVYCkuIFRoaXMgaXMgYSBtdWNoIG1vcmUgY29tcHJlaGVuc2l2ZSBhcHByb2FjaC5cblxuQWxyaWdodCwgc28gdGhlIGltcGxpY2F0aW9ucyBoZXJlIGFyZSBjbGVhcjogdGhpcyBpbXBhY3RzIEJURiB2ZXJpZmljYXRpb24gYW5kIGxvYWRpbmcgdmlhIHRoZSBgYnBmKEJQRl9CVEZfTE9BRClgIHN5c2NhbGwuIFRoaXMgaXMgcmlnaHQgaW4gdGhlIGNvcmUgb2YgdGhpbmdzLCBga2VybmVsL2JwZi9idGYuY2AuIEFuZCBpdCdzIHJlYWNoYWJsZSB2aWEgYGJwZigpYCB3aXRoIGBCUEZfQlRGX0xPQURgLCB3aGljaCBpcyBhY2Nlc3NpYmxlIGZyb20gYm90aCB1bnByaXZpbGVnZWQgYW5kIHByaXZpbGVnZWQgY29udGV4dHMsIG1lYW5pbmcgaXQncyBhIGdvb2QgdGFyZ2V0IGZvciBmdXp6aW5nLiBXZSBoYXZlIG5ldyByZWN1cnNpb24gbG9naWMsIGdyYXBoIHRyYXZlcnNhbCwgY3ljbGUgZGV0ZWN0aW9uLCBhbmQgZGVwdGggbGltaXRzLiBUaGVzZSBhcmUgYWxsIHBvc2l0aXZlIGluZGljYXRvcnMgdGhhdCBtYWtlIGl0IGEgdmFsdWFibGUgdGFyZ2V0IGZvciBmdXp6aW5nLiBUaGUgbG9jYXRpb24gaW4gdGhlIEJQRiBjb3JlIGlzIGFub3RoZXIgcG9zaXRpdmUuXG5cbk5vdywgSSBzaG91bGQgcXVpY2tseSBjaGVjayB0aGUga2VybmVsIGNvbmZpZyBvcHRpb25zIHRvIGNvbmZpcm0gdGhlIGRlcGVuZGVuY2llcyBmb3IgYGtlcm5lbC9icGYvYnRmLmNgIGFuZCBgQlBGX0JURl9MT0FEYCBhbmQgQlRGIHN1cHBvcnQuIEp1c3QgdG8gbWFrZSBzdXJlIHdlIGtub3cgd2hhdCdzIHJlcXVpcmVkIHRvIG1ha2UgdGhpcyBjb2RlIGFjdGl2ZS4gSSdsbCBjaGVjayBgaW5pdC9LY29uZmlnYCBvciBga2VybmVsL2JwZi9NYWtlZmlsZWAgdG8gY29uZmlybSB0aGUgZGVwZW5kZW5jaWVzIGFuZCBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGFsbCB3ZSBuZWVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjMxMSwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ4OSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyNzo1NS44OTQ1MDY2OTlaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgzMzk2MzM1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJ0ZlxcXFwub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvYnBmL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL01ha2VmaWxlPTEzPW9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gYnBmX2xvY2FsX3N0b3JhZ2UubyBicGZfdGFza19zdG9yYWdlLm9cXG5rZXJuZWwvYnBmL01ha2VmaWxlOjE0Om9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gZml4dXBzLm8gY2ZnLm8gc3RhdGVzLm8gYmFja3RyYWNrLm8gY2hlY2tfYnRmLm9cXG5rZXJuZWwvYnBmL01ha2VmaWxlLTE1LW9iai0ke0NPTkZJR19CUEZfTFNNfVxcdCAgKz0gYnBmX2lub2RlX3N0b3JhZ2Uub1xcbi0tXFxua2VybmVsL2JwZi9NYWtlZmlsZT0xNz1vYmotJChDT05GSUdfQlBGX0pJVCkgKz0gdHJhbXBvbGluZS5vXFxua2VybmVsL2JwZi9NYWtlZmlsZToxODpvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICs9IGJ0Zi5vIG1lbWFsbG9jLm8gcnFzcGlubG9jay5vIHN0cmVhbS5vXFxua2VybmVsL2JwZi9NYWtlZmlsZS0xOS1pZmVxICgkKENPTkZJR19NTVUpJChDT05GSUdfNjRCSVQpLHl5KVxcbi0tXFxua2VybmVsL2JwZi9NYWtlZmlsZT00Mz1pZmVxICgkKENPTkZJR19TWVNGUykseSlcXG5rZXJuZWwvYnBmL01ha2VmaWxlOjQ0Om9iai0kKENPTkZJR19ERUJVR19JTkZPX0JURikgKz0gc3lzZnNfYnRmLm9cXG5rZXJuZWwvYnBmL01ha2VmaWxlLTQ1LWVuZGlmXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDEyOjI3OjU1Ljk3NzkwNzA0NFoiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo2MTcwNjk3NjMwMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipDaGVja2luZyB0aGUgQlBGIENvbmZpZ3VyYXRpb24gTGFuZHNjYXBlKipcblxuT2theSwgc28gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IGBCUEZfU1lTQ0FMTGAgYW5kIGBCUEZgIGFyZSBjb25maWd1cmVkLiBHaXZlbiBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBrZXJuZWwsIEknbGwgc3RhcnQgYnkgY2hlY2tpbmcgdGhlIEtjb25maWcgZmlsZXMuIFRoZSBtb3N0IGxpa2VseSBwbGFjZXMgd291bGQgYmUgYGluaXQvS2NvbmZpZ2AsIGFzIGl0IG9mdGVuIGhvdXNlcyBnbG9iYWwgZmVhdHVyZSB0b2dnbGVzLCBvciBzcGVjaWZpY2FsbHksIGBrZXJuZWwvYnBmL0tjb25maWdgLCBzaW5jZSB0aGF0IGRpcmVjdG9yeSBpcyBkZWRpY2F0ZWQgdG8gQlBGLXJlbGF0ZWQgY29uZmlndXJhdGlvbnMuIEkgbmVlZCB0byBzZWUgaG93IHRoZXNlIG9wdGlvbnMgYXJlIGRlZmluZWQsIHRoZWlyIGRlcGVuZGVuY2llcywgYW5kIGFueSBkZWZhdWx0IHNldHRpbmdzLiBUaGlzIHdpbGwgZ2l2ZSBtZSBhIGNsZWFyIHBpY3R1cmUgb2Ygd2hhdCBjb250cm9scyB0aGUgYWN0aXZhdGlvbiBvZiB0aGVzZSBmZWF0dXJlcy4gS25vd2luZyB0aGlzIGluZm9ybWF0aW9uIHdpbGwgZ3JlYXRseSBoZWxwIHdoZW4gaW52ZXN0aWdhdGluZyBpc3N1ZXMgd2l0aCBCUEYuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNjc5LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjg6NTcuNjg0ODg2MDM2WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MDI2NTc1MzgsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBCUEZfU1lTQ0FMTFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpbml0L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjg6NTguMTg3NTUyMjM0WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIyNjYzNDE4NDUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGlua2luZyBpdDpcblxuKipMb2NhdGluZyB0aGUgQlBGX1NZU0NBTEwgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB0cmFjayBkb3duIHRoZSBkZWZpbml0aW9uIG9mIGBjb25maWcgQlBGX1NZU0NBTExgIGluIHRoZSBLY29uZmlnIGZpbGVzLiBUaGlzIGlzIGxpa2VseSBhIGtleSBjb25maWd1cmF0aW9uIG9wdGlvbiBmb3IgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIEJQRiBzeXNjYWxsIGZ1bmN0aW9uYWxpdHksIGFuZCB1bmRlcnN0YW5kaW5nIGl0cyBkZXBlbmRlbmNpZXMgYW5kIGxvY2F0aW9uIHdpbGwgYmUgZXNzZW50aWFsIGZvciB3aGF0ZXZlciBJJ20gd29ya2luZyBvbi4gVGltZSB0byBkaXZlIGludG8gdGhlIGtlcm5lbCBzb3VyY2UgdHJlZS4gTGV0J3Mgc2VlIGlmIGEgcXVpY2sgYGdyZXBgIHdpbGwgZ2V0IG1lIHN0YXJ0ZWQsIGJ1dCBJJ20gZXhwZWN0aW5nIHRoaXMgb3B0aW9uIHRvIGJlIHByZXR0eSB3aWRlc3ByZWFkIHNvIEkgbWF5IG5lZWQgdG8gdXNlIGEgbW9yZSBwcmVjaXNlIG1ldGhvZCB0byBsb2NhdGUgaXQgd2l0aGluIHRoZSBLY29uZmlnIGhpZXJhcmNoeS4gTGV0J3Mgc3RhcnQgd2l0aCBhIGJhc2ljIHNlYXJjaCB0aG91Z2guIEhvcGVmdWxseSwgaXQncyBub3QgYnVyaWVkIHRvbyBkZWVwIHdpdGhpbiBhbiBpbmNsdWRlLCBhbmQgSSBjYW4gcXVpY2tseSBhc2NlcnRhaW4gaXRzIHBsYWNlIHdpdGhpbiB0aGUgYnJvYWRlciBzeXN0ZW0uIEknbGwgYmUga2VlcGluZyBhbiBleWUgb3V0IGZvciBhbnkgc3Vycm91bmRpbmcgY29udGV4dCwgbGlrZSBgZGVwZW5kcyBvbmAgc3RhdGVtZW50cyBvciBkZWZhdWx0IHZhbHVlcywgYXMgdGhhdCB3aWxsIHByb3ZpZGUgdmFsdWFibGUgaW5zaWdodCBpbnRvIGhvdyB0aGlzIG9wdGlvbiBpbnRlcmFjdHMgd2l0aCBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsLiBPbmNlIEkgaGF2ZSB0aGUgZGVmaW5pdGl2ZSBLY29uZmlnIGZpbGUsIEknbGwgYW5hbHl6ZSB0aGUgc3Vycm91bmRpbmcgYmxvY2tzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzkwMSwiT3V0cHV0VG9rZW5zIjoyMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDEyOjI5OjAwLjQ1Mzg5ODI0OFoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjIzMDMwMTkyNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgQlBGX1NZU0NBTExcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2JwZi9LY29uZmlnPTI5PW1lbnUgXFxcIkJQRiBzdWJzeXN0ZW1cXFwiXFxua2VybmVsL2JwZi9LY29uZmlnLTMwLVxcbmtlcm5lbC9icGYvS2NvbmZpZzozMTpjb25maWcgQlBGX1NZU0NBTExcXG5rZXJuZWwvYnBmL0tjb25maWctMzItXFx0Ym9vbCBcXFwiRW5hYmxlIGJwZigpIHN5c3RlbSBjYWxsXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyOTowMi42ODQyMDU1MzRaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjI2MjA2MDkxNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gcmVhZGluZyB0aGUgcHJvdmlkZWQgdGV4dDpcblxuKipCUEYgQ29uZmlndXJhdGlvbiBUaG91Z2h0cyoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGUgYGtlcm5lbC9icGYvS2NvbmZpZ2AgZmlsZS4gSSdtIGZvY3VzaW5nIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSAzMS4gQmFzZWQgb24gbXkgZXhwZXJpZW5jZSwgSSdtIGV4cGVjdGluZyB0byBzZWUgdGhlIGNvcmUgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gQlBGLCBsaWtlbHkgdGhlIGdlbmVyYWwgZW5hYmxlL2Rpc2FibGUgc3dpdGNoLCBvciBtYXliZSBzb21lIGZ1bmRhbWVudGFsIGZlYXR1cmVzIHRoYXQgYXJlIGNvbnNpZGVyZWQgY3JpdGljYWwuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgY29udHJvbHMgdGhlIGJhc2ljIGJ1aWxkaW5nIGJsb2NrcyBoZXJlLiBMZXQncyBzZWUgaWYgdGhpcyBsaW5lIGlzIGNvbnRyb2xsaW5nIHRoZSBjb3JlIG9yIHNvbWV0aGluZyBzcGVjaWZpYyB0byB0aGUgYXJjaGl0ZWN0dXJlIEkgYW0gc3R1ZHlpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0MjYwLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjk6MDQuOTQ2MjY5MDk5WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk0MzUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9icGYvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAyNSxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAyNTpcXHQjIGRlZmF1bHQgZm9yIGtlcm5lbHMgdGhhdCB3ZXJlIGNvbXBpbGVkIHdpdGggQlBGIEpJVCBzdXBwb3J0LlxcbiAgMjY6XFx0Y29uZmlnIEFSQ0hfV0FOVF9ERUZBVUxUX0JQRl9KSVRcXG4gIDI3OlxcdFxcdGJvb2xcXG4gIDI4OlxcdFxcbiAgMjk6XFx0bWVudSBcXFwiQlBGIHN1YnN5c3RlbVxcXCJcXG4gIDMwOlxcdFxcbiAgMzE6XFx0Y29uZmlnIEJQRl9TWVNDQUxMXFxuICAzMjpcXHRcXHRib29sIFxcXCJFbmFibGUgYnBmKCkgc3lzdGVtIGNhbGxcXFwiXFxuICAzMzpcXHRcXHRzZWxlY3QgQlBGXFxuICAzNDpcXHRcXHRzZWxlY3QgSVJRX1dPUktcXG4gIDM1OlxcdFxcdHNlbGVjdCBORUVEX1RBU0tTX1JDVVxcbiAgMzY6XFx0XFx0c2VsZWN0IFRBU0tTX1RSQUNFX1JDVVxcbiAgMzc6XFx0XFx0c2VsZWN0IEJJTkFSWV9QUklOVEZcXG4gIDM4OlxcdFxcdHNlbGVjdCBORVRfU09DS19NU0cgaWYgTkVUXFxuICAzOTpcXHRcXHRzZWxlY3QgTkVUX1hHUkVTUyBpZiBORVRcXG4gIDQwOlxcdFxcdHNlbGVjdCBQQUdFX1BPT0wgaWYgTkVUXFxuICA0MTpcXHRcXHRkZWZhdWx0IG5cXG4gIDQyOlxcdFxcdGhlbHBcXG4gIDQzOlxcdFxcdCAgRW5hYmxlIHRoZSBicGYoKSBzeXN0ZW0gY2FsbCB0aGF0IGFsbG93cyB0byBtYW5pcHVsYXRlIEJQRiBwcm9ncmFtc1xcbiAgNDQ6XFx0XFx0ICBhbmQgbWFwcyB2aWEgZmlsZSBkZXNjcmlwdG9ycy5cXG4gIDQ1OlxcdFxcbiAgNDY6XFx0Y29uZmlnIEJQRl9KSVRcXG4gIDQ3OlxcdFxcdGJvb2wgXFxcIkVuYWJsZSBCUEYgSnVzdCBJbiBUaW1lIGNvbXBpbGVyXFxcIlxcbiAgNDg6XFx0XFx0ZGVwZW5kcyBvbiBCUEZcXG4gIDQ5OlxcdFxcdGRlcGVuZHMgb24gSEFWRV9DQlBGX0pJVCB8fCBIQVZFX0VCUEZfSklUXFxuICA1MDpcXHRcXHRzZWxlY3QgRVhFQ01FTVxcbiAgNTE6XFx0XFx0aGVscFxcbiAgNTI6XFx0XFx0ICBCUEYgcHJvZ3JhbXMgYXJlIG5vcm1hbGx5IGhhbmRsZWQgYnkgYSBCUEYgaW50ZXJwcmV0ZXIuIFRoaXMgb3B0aW9uXFxuICA1MzpcXHRcXHQgIGFsbG93cyB0aGUga2VybmVsIHRvIGdlbmVyYXRlIG5hdGl2ZSBjb2RlIHdoZW4gYSBwcm9ncmFtIGlzIGxvYWRlZFxcbiAgNTQ6XFx0XFx0ICBpbnRvIHRoZSBrZXJuZWwuIFRoaXMgd2lsbCBzaWduaWZpY2FudGx5IHNwZWVkLXVwIHByb2Nlc3Npbmcgb2YgQlBGXFxuICA1NTpcXHRcXHQgIHByb2dyYW1zLlxcbiAgNTY6XFx0XFxuICA1NzpcXHRcXHQgIE5vdGUsIGFuIGFkbWluIHNob3VsZCBlbmFibGUgdGhpcyBmZWF0dXJlIGNoYW5naW5nOlxcbiAgNTg6XFx0XFx0ICAvcHJvYy9zeXMvbmV0L2NvcmUvYnBmX2ppdF9lbmFibGVcXG4gIDU5OlxcdFxcdCAgL3Byb2Mvc3lzL25ldC9jb3JlL2JwZl9qaXRfaGFyZGVuICAgKG9wdGlvbmFsKVxcbiAgNjA6XFx0XFx0ICAvcHJvYy9zeXMvbmV0L2NvcmUvYnBmX2ppdF9rYWxsc3ltcyAob3B0aW9uYWwpXFxuICA2MTpcXHRcXG4gIDYyOlxcdGNvbmZpZyBCUEZfSklUX0FMV0FZU19PTlxcbiAgNjM6XFx0XFx0Ym9vbCBcXFwiUGVybWFuZW50bHkgZW5hYmxlIEJQRiBKSVQgYW5kIHJlbW92ZSBCUEYgaW50ZXJwcmV0ZXJcXFwiXFxuICA2NDpcXHRcXHRkZXBlbmRzIG9uIEJQRl9TWVNDQUxMIFxcdTAwMjZcXHUwMDI2IEhBVkVfRUJQRl9KSVQgXFx1MDAyNlxcdTAwMjYgQlBGX0pJVFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyOTowNC45NDYzNjUzMTlaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6Njc5NDY4MzgwMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipCVEYgQWN5Y2xpY2l0eSBDaGVjayBhbmQgT3duZXJzaGlwIERlcHRoIFZhbGlkYXRpb24qKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBteSBpbml0aWFsIHRob3VnaHQgaXM6IGBCUEZfU1lTQ0FMTGAgc2VlbXMgbGlrZSB0aGUga2V5IGNvbmZpZyBmbGFnIGhlcmUuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlbid0IGFueSBvdGhlciBoaWRkZW4gZGVwZW5kZW5jaWVzIGZvciBCVEYgZnVuY3Rpb25hbGl0eS4gSXMgYENPTkZJR19ERUJVR19JTkZPX0JURmAgYWxzbyBuZWVkZWQsIG9yIGlzIGBidGYub2AgYnVpbHQgZGlyZWN0bHkgd2hlbiBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyBlbmFibGVkPyBMZXQncyBjaGVjayB0aGUgYGtlcm5lbC9icGYvTWFrZWZpbGVgLi4uIFllcCwgdGhlcmUgaXQgaXM6IGBvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICs9IGJ0Zi5vIG1lbWFsbG9jLm8gcnFzcGlubG9jay5vIHN0cmVhbS5vYC4gU28gYENPTkZJR19CUEZfU1lTQ0FMTGAgKmRvZXMqIGNvbXBpbGUgYGJ0Zi5vYC4gR29vZC5cblxuTm93LCBsZXQncyBpZGVudGlmeSB0aGUgc3BlY2lmaWMgZnVuY3Rpb25zIHRoaXMgcGF0Y2ggaXMgbW9kaWZ5aW5nIG9yIGFkZGluZyDigJMgdGhlIEZvY3VzU3ltYm9scywgc28gdG8gc3BlYWsuIExvb2tpbmcgYXQgYGtlcm5lbC9icGYvYnRmLmNgLCBJIHNlZSB0aGVzZSBjaGFuZ2VkIGZ1bmN0aW9uczpcblxuMS4gIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYFxuMi4gIGBidGZfb3duZXJzaGlwX2RlcHRoYFxuMy4gIGBidGZfb3duZWRfdHlwZV9pZHhgXG40LiAgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYFxuNS4gIGBidGZfcGFyc2VgIChjYWxsZXIgaW5zaWRlIGBidGYuY2ApXG42LiAgYGJ0Zl9uZXdfZmRgIChCVEYgbG9hZCBlbnRyeXBvaW50KVxuXG5BcmUgYW55IG9mIHRoZXNlIHViaXF1aXRvdXM/IFRoZXkgYXJlIGNsZWFybHkgZm9jdXNlZCBvbiBCVEYsIGFuZCBub3QgdXNlZCBldmVyeXdoZXJlIGluIHRoZSBrZXJuZWwuIExldCdzIG1ha2Ugc3VyZS5cblxuKiAgIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCAtIHN0YXRpYywgbmV3XG4qICAgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgIC0gc3RhdGljLCBuZXdcbiogICBgYnRmX293bmVkX3R5cGVfaWR4YCAtIHN0YXRpYywgbmV3XG4qICAgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzYCAtIGdsb2JhbCBmdW5jdGlvbiwgbW9kaWZpZWRcbiogICBgYnRmX3BhcnNlYCAtIHN0YXRpYyBmdW5jdGlvbiwgbW9kaWZpZWQgY2FsbGVyXG4qICAgYGJ0Zl9uZXdfZmRgIC0gZ2xvYmFsIGZ1bmN0aW9uXG5cblNpbmNlIHRoZXkgYXJlIGluIGEgQyBmaWxlIGluIGtlcm5lbC9icGYvYnRmLmMsIGV2ZW4gc3RhdGljIGZ1bmN0aW9ucyBpbiB2bWxpbnV4IGhhdmUgc3ltYm9scyBpbiBrYWxsc3ltcyAodW5sZXNzIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyKS4gTGlzdGluZyBzdGF0aWMgZnVuY3Rpb25zIGFuZCBub24tc3RhdGljIG9uZXMgbGlrZSBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIGFuZCBgYnRmX25ld19mZGAgZW5zdXJlcyB0aGUgZnV6emVyIGhpdHMgdGhlbS5cblxuT2theSwgbGV0J3MganVzdCBkb3VibGUtY2hlY2sgZXZlcnl0aGluZyB0byBiZSBjZXJ0YWluLiBXZSdyZSBnb29kIHRvIGdvLlxuXG4qICAgV29ydGhGdXp6aW5nOiBUcnVlXG4qICAgRW5hYmxlQ29uZmlnczogXFxbXCJCUEZcXF9TWVNDQUxMXCJcXF1cbiogICBGb2N1c1N5bWJvbHM6IFxcW1xuICAgICogICBcImJ0ZlxcX2NoZWNrXFxfb3duZXJzaGlwXFxfZGVwdGhcIixcbiAgICAqICAgXCJidGZcXF9vd25lcnNoaXBcXF9kZXB0aFwiLFxuICAgICogICBcImJ0ZlxcX293bmVkXFxfdHlwZVxcX2lkeFwiLFxuICAgICogICBcImJ0ZlxcX2NoZWNrXFxfYW5kXFxfZml4dXBcXF9maWVsZHNcIixcbiAgICAqICAgXCJidGZcXF9wYXJzZVwiLFxuICAgICogICBcImJ0ZlxcX25ld1xcX2ZkXCJcbiAgICBcXF1cblxuRmluYWxseSwgdGhlIHJlYXNvbmluZzogVGhpcyBwYXRjaCBpcyByZWZhY3RvcmluZyB0aGUgYWN5Y2xpY2l0eSBjaGVjayBmb3IgQlRGIHN0cnVjdHVyZXMgYW5kIGFkZGluZyBhIG5ldyByZWN1cnNpdmUgZGVwdGggdmFsaWRhdGlvbiBhbGdvcml0aG0gKGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCwgYGJ0Zl9vd25lcnNoaXBfZGVwdGhgLCBgYnRmX293bmVkX3R5cGVfaWR4YCkgdG8gZW5mb3JjZSBvd25lcnNoaXAgZ3JhcGggZGVwdGggbGltaXRzIGFuZCBkZXRlY3QgY3ljbGVzIGFjcm9zcyBncmFwaCByb290cyBhbmQgbG9jYWwga3B0cnMgZHVyaW5nIEJURiBsb2FkaW5nLiBUaGlzICptb2RpZmllcyogcmVhY2hhYmxlIGxvZ2ljIGluIHRoZSBjb3JlIEJQRiBzdWJzeXN0ZW0gZXhwb3NlZCB2aWEgdGhlIGBCUEZfQlRGX0xPQURgIGNvbW1hbmQgb2YgdGhlIGBicGYoKWAgc3lzY2FsbC5cblxuQWxsIGNsZWFyLCBhbGwgdmVyaWZpZWQuIEknbSByZWFkeSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1MDI1LCJPdXRwdXRUb2tlbnMiOjE4MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc1NCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDEyOjI5OjExLjc0MTA1Mjc5MloiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwNzc2ODA0MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NZU0NBTExcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoXCIsXG4gICAgXCJidGZfb3duZXJzaGlwX2RlcHRoXCIsXG4gICAgXCJidGZfb3duZWRfdHlwZV9pZHhcIixcbiAgICBcImJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzXCIsXG4gICAgXCJidGZfcGFyc2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBCVEYgdmFsaWRhdGlvbiBsb2dpYyBpbiB0aGUgQlBGIHN1YnN5c3RlbSBieSByZXBsYWNpbmcgdGhlIGdyYXBoIHJvb3QgYWN5Y2xpY2l0eSBjaGVjayB3aXRoIGEgbmV3IG93bmVyc2hpcCBkZXB0aCBhbmQgY3ljbGUgZGV0ZWN0aW9uIGFsZ29yaXRobSAoYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCBhbmQgYnRmX293bmVyc2hpcF9kZXB0aCkgY292ZXJpbmcgYm90aCBncmFwaCByb290cyBhbmQgbG9jYWwga3B0cnMuIFRoZXNlIGNoYW5nZXMgYXJlIHJlYWNoYWJsZSB2aWEgdGhlIEJQRl9CVEZfTE9BRCBjb21tYW5kIGluIHRoZSBicGYoKSBzeXN0ZW0gY2FsbCBhbmQgd2FycmFudCBmdXp6aW5nIHRvIHZlcmlmeSBncmFwaCB0cmF2ZXJzYWwgY29ycmVjdG5lc3MgYW5kIGJvdW5kIGVuZm9yY2VtZW50LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aFwiLFxuICAgIFwiYnRmX293bmVyc2hpcF9kZXB0aFwiLFxuICAgIFwiYnRmX293bmVkX3R5cGVfaWR4XCIsXG4gICAgXCJidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc1wiLFxuICAgIFwiYnRmX3BhcnNlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgQlRGIHZhbGlkYXRpb24gbG9naWMgaW4gdGhlIEJQRiBzdWJzeXN0ZW0gYnkgcmVwbGFjaW5nIHRoZSBncmFwaCByb290IGFjeWNsaWNpdHkgY2hlY2sgd2l0aCBhIG5ldyBvd25lcnNoaXAgZGVwdGggYW5kIGN5Y2xlIGRldGVjdGlvbiBhbGdvcml0aG0gKGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGggYW5kIGJ0Zl9vd25lcnNoaXBfZGVwdGgpIGNvdmVyaW5nIGJvdGggZ3JhcGggcm9vdHMgYW5kIGxvY2FsIGtwdHJzLiBUaGVzZSBjaGFuZ2VzIGFyZSByZWFjaGFibGUgdmlhIHRoZSBCUEZfQlRGX0xPQUQgY29tbWFuZCBpbiB0aGUgYnBmKCkgc3lzdGVtIGNhbGwgYW5kIHdhcnJhbnQgZnV6emluZyB0byB2ZXJpZnkgZ3JhcGggdHJhdmVyc2FsIGNvcnJlY3RuZXNzIGFuZCBib3VuZCBlbmZvcmNlbWVudC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjk6MTEuODQ4ODMwMjg1WiIsIlNlcSI6MjMsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDM0NzE2OTIyNSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDEyOjI5OjExLjg0OTczNzQzNVoiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjI0MzQ2MjU3NTE1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCB1cGRhdGVzIHRoZSBCVEYgdmVyaWZpZXIgdG8gdmFsaWRhdGUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW5kIGVuZm9yY2UgYSBtYXhpbXVtIG93bmVyc2hpcCBkZXB0aCAoQlRGX01BWF9PV05FUlNISVBfREVQVEgpIGFjcm9zcyBCUEYgZ3JhcGggcm9vdHMgYW5kIGxvY2FsIGtwdHJzLlxcblxcbk1lbW9yeSBzYWZldHkgYW5hbHlzaXM6XFxuMS4gVGhlIHRlbXBvcmFyeSBkZXB0aCBhcnJheSB1c2VkIGR1cmluZyBvd25lcnNoaXAgdHJhdmVyc2FsIGlzIGFsbG9jYXRlZCB2aWEga3ZjYWxsb2MoKSwgZW5zdXJpbmcgaXQgaXMgZnVsbHkgemVyby1pbml0aWFsaXplZC5cXG4yLiBBbGwgbG9jYWwgdmFyaWFibGVzIGluIGJ0Zl9vd25lcnNoaXBfZGVwdGgoKSwgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCgpLCBhbmQgYnRmX293bmVkX3R5cGVfaWR4KCkgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXFxuMy4gTm8gZGF0YSBzdHJ1Y3R1cmVzIG9yIGJ1ZmZlcnMgYXJlIGNvcGllZCB0byB1c2VyIHNwYWNlLCBhbmQgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgcmVhZCBvciB1c2VkIGluIGNvbmRpdGlvbmFsIGJyYW5jaGluZy5cXG40LiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIHBvaW50ZXIgYXJpdGhtZXRpYyBvciBhcnJheSBpbmRleGluZyBpbnRvIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgd291bGQgYmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOLlxcblxcblRoZXJlZm9yZSwgdGhpcyBjaGFuZ2UgZG9lcyBub3QgaW50cm9kdWNlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgbmVlZGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDdiNWI4ZjY3NjU3OTJiMzY4NjAwYWU1YTY0YmZiNzdiZDExYTkyZTlcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU3VuIFNlcCA2IDEyOjI3OjMyIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9idGYuYyBiL2tlcm5lbC9icGYvYnRmLmNcbmluZGV4IDljMmNhYjA4YmI3OTQuLjNjNTA4ZWJiMjQzODQgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL2J0Zi5jXG4rKysgYi9rZXJuZWwvYnBmL2J0Zi5jXG5AQCAtNDI2OSwxMyArNDI2OSwxMCBAQCBpbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKVxuIHtcbiBcdGludCBpO1xuIFxuLVx0LyogVGhlcmUgYXJlIHRocmVlIHR5cGVzIHRoYXQgc2lnbmlmeSBvd25lcnNoaXAgb2Ygc29tZSBvdGhlciB0eXBlOlxuLVx0ICogIGtwdHJfcmVmLCBicGZfbGlzdF9oZWFkLCBicGZfcmJfcm9vdC5cbi1cdCAqIGtwdHJfcmVmIG9ubHkgc3VwcG9ydHMgc3RvcmluZyBrZXJuZWwgdHlwZXMsIHdoaWNoIGNhbid0IHN0b3JlXG4tXHQgKiByZWZlcmVuY2VzIHRvIHByb2dyYW0gYWxsb2NhdGVkIGxvY2FsIHR5cGVzLlxuLVx0ICpcbi1cdCAqIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBlbnN1cmUgdGhhdCBicGZfe2xpc3RfaGVhZCxyYl9yb290fSBvd25lcnNoaXBcbi1cdCAqIGRvZXMgbm90IGZvcm0gY3ljbGVzLlxuK1x0LypcbitcdCAqIENoZWNrIGZpZWxkcyB3aGljaCByZXF1aXJlIHRoZSBjb21wbGV0ZSBCVEYgYW5kIGluaXRpYWxpemUgcnVudGltZVxuK1x0ICogbWV0YWRhdGEuIE93bmVyc2hpcCByZWxhdGlvbnNoaXBzIGFyZSB2YWxpZGF0ZWQgYWZ0ZXIgZXZlcnkgcmVjb3JkIGhhc1xuK1x0ICogYmVlbiBmaXhlZCB1cC5cbiBcdCAqL1xuIFx0aWYgKElTX0VSUl9PUl9OVUxMKHJlYykgfHwgIShyZWMtXHUwMDNlZmllbGRfbWFzayBcdTAwMjYgKEJQRl9HUkFQSF9ST09UIHwgQlBGX1VQVFIpKSlcbiBcdFx0cmV0dXJuIDA7XG5AQCAtNDMwNiw1MSArNDMwMyw4OCBAQCBpbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKVxuIFx0XHRpZiAoIW1ldGEpXG4gXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXHRcdHJlYy1cdTAwM2VmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9yZWMgPSBtZXRhLVx1MDAzZXJlY29yZDtcbitcdH1cbitcdHJldHVybiAwO1xuK31cbiBcbi1cdFx0LyogV2UgbmVlZCB0byBzZXQgdmFsdWVfcmVjIGZvciBhbGwgcm9vdCB0eXBlcywgYnV0IG5vIG5lZWRcbi1cdFx0ICogdG8gY2hlY2sgb3duZXJzaGlwIGN5Y2xlIGZvciBhIHR5cGUgdW5sZXNzIGl0J3MgYWxzbyBhXG4tXHRcdCAqIG5vZGUgdHlwZS5cbi1cdFx0ICovXG4tXHRcdGlmICghKHJlYy1cdTAwM2VmaWVsZF9tYXNrIFx1MDAyNiBCUEZfR1JBUEhfTk9ERSkpXG4rc3RhdGljIGludCBidGZfb3duZWRfdHlwZV9pZHgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLFxuK1x0XHRcdCAgICAgIGNvbnN0IHN0cnVjdCBidGZfZmllbGQgKmZpZWxkKVxuK3tcbitcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKm1ldGE7XG4rXHR1MzIgYnRmX2lkO1xuK1xuK1x0aWYgKGZpZWxkLVx1MDAzZXR5cGUgXHUwMDI2IEJQRl9HUkFQSF9ST09UKSB7XG4rXHRcdGJ0Zl9pZCA9IGZpZWxkLVx1MDAzZWdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xuK1x0fSBlbHNlIGlmIChmaWVsZC1cdTAwM2V0eXBlID09IEJQRl9LUFRSX1JFRiB8fCBmaWVsZC1cdTAwM2V0eXBlID09IEJQRl9LUFRSX1BFUkNQVSkge1xuK1x0XHRpZiAoYnRmX2lzX2tlcm5lbChmaWVsZC1cdTAwM2VrcHRyLmJ0ZikpXG4rXHRcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHRcdGJ0Zl9pZCA9IGZpZWxkLVx1MDAzZWtwdHIuYnRmX2lkO1xuK1x0fSBlbHNlIHtcbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4rXHR9XG4rXG4rXHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xuK1x0aWYgKCFtZXRhKVxuK1x0XHRyZXR1cm4gZmllbGQtXHUwMDNldHlwZSBcdTAwMjYgQlBGX0dSQVBIX1JPT1QgPyAtRUZBVUxUIDogLUVOT0VOVDtcbitcdHJldHVybiBtZXRhIC0gdGFiLVx1MDAzZXR5cGVzO1xuK31cbitcbisvKlxuKyAqIEVhY2ggb3duZXJzaGlwIGVkZ2UgYWRkcyBrZXJuZWwgZnJhbWVzIHRocm91Z2ggYnBmX29ial9mcmVlX2ZpZWxkcygpIGFuZFxuKyAqIF9fYnBmX29ial9kcm9wX2ltcGwoKS4gS2VlcCB0aGUgYm91bmQgZGVsaWJlcmF0ZWx5IHNtYWxsIGJlY2F1c2Ugb2JqZWN0XG4rICogZGVzdHJ1Y3Rpb24gY2FuIGl0c2VsZiBydW4gYmVsb3cgYSBCUEYgY2FsbCBjaGFpbi4gQSBmaW5hbCBwb2ludGVlIHdpdGhvdXRcbisgKiBzcGVjaWFsIGZpZWxkcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIGFuZCBhZGRzIG9ubHkgYVxuKyAqIG5vbi1yZWN1cnNpbmcgZHJvcC5cbisgKi9cbisjZGVmaW5lIEJURl9NQVhfT1dORVJTSElQX0RFUFRIIDhcbitcbitzdGF0aWMgaW50IGJ0Zl9vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuK1x0XHRcdCAgICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLCB1OCAqZGVwdGgsXG4rXHRcdFx0ICAgICAgIGludCBpZHgsIGludCBkZXB0aF9sZWZ0KVxuK3tcbitcdGNvbnN0IHN0cnVjdCBidGZfcmVjb3JkICpyZWMgPSB0YWItXHUwMDNldHlwZXNbaWR4XS5yZWNvcmQ7XG4rXHRpbnQgaSwgcmV0LCBtYXhfZGVwdGggPSAwO1xuK1xuK1x0aWYgKCFkZXB0aF9sZWZ0KVxuK1x0XHRyZXR1cm4gLUVMT09QO1xuK1x0aWYgKGRlcHRoW2lkeF0pXG4rXHRcdGdvdG8gZG9uZTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHJlYy1cdTAwM2VjbnQ7IGkrKykge1xuK1x0XHRyZXQgPSBidGZfb3duZWRfdHlwZV9pZHgoYnRmLCB0YWIsIFx1MDAyNnJlYy1cdTAwM2VmaWVsZHNbaV0pO1xuK1x0XHRpZiAocmV0ID09IC1FTk9FTlQpXG4gXHRcdFx0Y29udGludWU7XG4rXHRcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdFx0cmV0dXJuIHJldDtcbitcdFx0cmV0ID0gYnRmX293bmVyc2hpcF9kZXB0aChidGYsIHRhYiwgZGVwdGgsIHJldCwgZGVwdGhfbGVmdCAtIDEpO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXHRcdG1heF9kZXB0aCA9IG1heChtYXhfZGVwdGgsIHJldCk7XG4rXHR9XG4rXHRkZXB0aFtpZHhdID0gbWF4X2RlcHRoICsgMTtcbitkb25lOlxuK1x0cmV0dXJuIGRlcHRoW2lkeF0gXHUwMDNlIGRlcHRoX2xlZnQgPyAtRUxPT1AgOiBkZXB0aFtpZHhdO1xuK31cbiBcbi1cdFx0LyogV2UgbmVlZCB0byBlbnN1cmUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW1vbmcgYWxsIHR5cGVzLiBUaGVcbi1cdFx0ICogcHJvcGVyIHdheSB0byBkbyBpdCB3b3VsZCBiZSB0byB0b3BvbG9naWNhbGx5IHNvcnQgYWxsIEJURlxuLVx0XHQgKiBJRHMgYmFzZWQgb24gdGhlIG93bmVyc2hpcCBlZGdlcywgc2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlXG4tXHRcdCAqIGJwZl97bGlzdF9oZWFkLHJiX25vZGV9IGluIGEgdHlwZS4gSW5zdGVhZCwgd2UgdXNlIHRoZVxuLVx0XHQgKiBmb2xsb3dpbmcgcmVzYW9uaW5nOlxuLVx0XHQgKlxuLVx0XHQgKiAtIEEgdHlwZSBjYW4gb25seSBiZSBvd25lZCBieSBhbm90aGVyIHR5cGUgaW4gdXNlciBCVEYgaWYgaXRcbi1cdFx0ICogICBoYXMgYSBicGZfe2xpc3QscmJ9X25vZGUuIExldCdzIGNhbGwgdGhlc2Ugbm9kZSB0eXBlcy5cbi1cdFx0ICogLSBBIHR5cGUgY2FuIG9ubHkgX293bl8gYW5vdGhlciB0eXBlIGluIHVzZXIgQlRGIGlmIGl0IGhhcyBhXG4tXHRcdCAqICAgYnBmX3tsaXN0X2hlYWQscmJfcm9vdH0uIExldCdzIGNhbGwgdGhlc2Ugcm9vdCB0eXBlcy5cbi1cdFx0ICpcbi1cdFx0ICogV2UgZW5zdXJlIHRoYXQgaWYgYSB0eXBlIGlzIGJvdGggYSByb290IGFuZCBub2RlLCBpdHNcbi1cdFx0ICogZWxlbWVudCB0eXBlcyBjYW5ub3QgYmUgcm9vdCB0eXBlcy5cbi1cdFx0ICpcbi1cdFx0ICogVG8gZW5zdXJlIGFjeWNsaWNpdHk6XG4tXHRcdCAqXG4tXHRcdCAqIFdoZW4gQSBpcyBhbiByb290IHR5cGUgYnV0IG5vdCBhIG5vZGUsIGl0cyBvd25lcnNoaXBcbi1cdFx0ICogY2hhaW4gY2FuIGJlOlxuLVx0XHQgKlx0QSAtXHUwMDNlIEIgLVx1MDAzZSBDXG4tXHRcdCAqIFdoZXJlOlxuLVx0XHQgKiAtIEEgaXMgYW4gcm9vdCwgZS5nLiBoYXMgYnBmX3JiX3Jvb3QuXG4tXHRcdCAqIC0gQiBpcyBib3RoIGEgcm9vdCBhbmQgbm9kZSwgZS5nLiBoYXMgYnBmX3JiX25vZGUgYW5kXG4tXHRcdCAqICAgYnBmX2xpc3RfaGVhZC5cbi1cdFx0ICogLSBDIGlzIG9ubHkgYW4gcm9vdCwgZS5nLiBoYXMgYnBmX2xpc3Rfbm9kZVxuLVx0XHQgKlxuLVx0XHQgKiBXaGVuIEEgaXMgYm90aCBhIHJvb3QgYW5kIG5vZGUsIHNvbWUgb3RoZXIgdHlwZSBhbHJlYWR5XG4tXHRcdCAqIG93bnMgaXQgaW4gdGhlIEJURiBkb21haW4sIGhlbmNlIGl0IGNhbiBub3Qgb3duXG4tXHRcdCAqIGFub3RoZXIgcm9vdCB0eXBlIHRocm91Z2ggYW55IG9mIHRoZSBvd25lcnNoaXAgZWRnZXMuXG4tXHRcdCAqXHRBIC1cdTAwM2UgQlxuLVx0XHQgKiBXaGVyZTpcbi1cdFx0ICogLSBBIGlzIGJvdGggYW4gcm9vdCBhbmQgbm9kZS5cbi1cdFx0ICogLSBCIGlzIG9ubHkgYW4gbm9kZS5cbi1cdFx0ICovXG4tXHRcdGlmIChtZXRhLVx1MDAzZXJlY29yZC1cdTAwM2VmaWVsZF9tYXNrIFx1MDAyNiBCUEZfR1JBUEhfUk9PVClcbi1cdFx0XHRyZXR1cm4gLUVMT09QO1xuK3N0YXRpYyBpbnQgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4rXHRcdFx0XHQgICAgIHN0cnVjdCBidGZfc3RydWN0X21ldGFzICp0YWIpXG4re1xuK1x0dTggKmRlcHRoO1xuK1x0aW50IGksIHJldCA9IDA7XG4rXG4rXHRkZXB0aCA9IGt2Y2FsbG9jKHRhYi1cdTAwM2VjbnQsIHNpemVvZigqZGVwdGgpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTtcbitcdGlmICghZGVwdGgpXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgdGFiLVx1MDAzZWNudDsgaSsrKSB7XG4rXHRcdHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCBpLFxuK1x0XHRcdFx0XHQgIEJURl9NQVhfT1dORVJTSElQX0RFUFRIKTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRicmVhaztcbitcdFx0cmV0ID0gMDtcbiBcdH1cbi1cdHJldHVybiAwO1xuK1x0a3ZmcmVlKGRlcHRoKTtcbitcdHJldHVybiByZXQ7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIF9fYnRmX3N0cnVjdF9zaG93KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0LFxuQEAgLTYwNDUsNiArNjA3OSwxMCBAQCBzdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcbiBcdFx0XHRpZiAoZXJyIFx1MDAzYyAwKVxuIFx0XHRcdFx0Z290byBlcnJvdXRfbWV0YTtcbiBcdFx0fVxuK1xuK1x0XHRlcnIgPSBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoKGJ0Ziwgc3RydWN0X21ldGFfdGFiKTtcbitcdFx0aWYgKGVyciBcdTAwM2MgMClcbitcdFx0XHRnb3RvIGVycm91dF9tZXRhO1xuIFx0fVxuIFxuIFx0ZXJyID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcdTAwMjZlbnYtXHUwMDNlbG9nKTtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9saW5rZWRfbGlzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbGlua2VkX2xpc3QuY1xuaW5kZXggYzNkMTMzYzZhMDBkNC4uNTJmYWJiZWUzZGQ1YSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNcbkBAIC03MTQsNyArNzE0LDcgQEAgc3RhdGljIHZvaWQgdGVzdF9idGYodm9pZClcbiBcdFx0XHRicmVhaztcbiBcbiBcdFx0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XG4tXHRcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXCJjaGVjayBidGZcIik7XG4rXHRcdEFTU0VSVF9FUShlcnIsIDAsIFwiY2hlY2sgYnRmXCIpO1xuIFx0XHRidGZfX2ZyZWUoYnRmKTtcbiBcdFx0YnJlYWs7XG4gXHR9XG5AQCAtNzczLDcgKzc3Myw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfYnRmKHZvaWQpXG4gXHRcdFx0YnJlYWs7XG4gXG4gXHRcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuLVx0XHRBU1NFUlRfRVEoZXJyLCAtRUxPT1AsIFwiY2hlY2sgYnRmXCIpO1xuK1x0XHRBU1NFUlRfRVEoZXJyLCAwLCBcImNoZWNrIGJ0ZlwiKTtcbiBcdFx0YnRmX19mcmVlKGJ0Zik7XG4gXHRcdGJyZWFrO1xuIFx0fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xvY2FsX2twdHJfb3duZXJzaGlwLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9sb2NhbF9rcHRyX293bmVyc2hpcC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uODM2NzQxNTVlM2I3NFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuY1xuQEAgLTAsMCArMSwyMDIgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qIENvcHlyaWdodCAoYykgMjAyNiBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4gKi9cbitcbisjaW5jbHVkZSBcdTAwM2NicGYvYnRmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9idGYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuK1xuKyNkZWZpbmUgU1BJTl9MT0NLIDJcbisjZGVmaW5lIExJU1RfSEVBRCAzXG4rI2RlZmluZSBMSVNUX05PREUgNFxuKy8qIEtlZXAgaW4gc3luYyB3aXRoIEJURl9NQVhfT1dORVJTSElQX0RFUFRILiAqL1xuKyNkZWZpbmUgTUFYX09XTkVSU0hJUF9ERVBUSCA4XG4rXG4rc3RhdGljIHN0cnVjdCBidGYgKmluaXRfYnRmKHZvaWQpXG4re1xuK1x0c3RydWN0IGJ0ZiAqYnRmO1xuK1x0aW50IGlkO1xuK1xuK1x0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiYnRmX19uZXdfZW1wdHlcIikpXG4rXHRcdHJldHVybiBOVUxMO1xuK1x0aWQgPSBidGZfX2FkZF9pbnQoYnRmLCBcImludFwiLCA0LCBCVEZfSU5UX1NJR05FRCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgMSwgXCJidGZfX2FkZF9pbnRcIikpXG4rXHRcdGdvdG8gZXJyX291dDtcbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJicGZfc3Bpbl9sb2NrXCIsIDQpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIFNQSU5fTE9DSywgXCJidGZfX2FkZF9zdHJ1Y3QgYnBmX3NwaW5fbG9ja1wiKSlcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcImJwZl9saXN0X2hlYWRcIiwgMTYpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfSEVBRCwgXCJidGZfX2FkZF9zdHJ1Y3QgYnBmX2xpc3RfaGVhZFwiKSlcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcImJwZl9saXN0X25vZGVcIiwgMjQpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIExJU1RfTk9ERSwgXCJidGZfX2FkZF9zdHJ1Y3QgYnBmX2xpc3Rfbm9kZVwiKSlcbitcdFx0Z290byBlcnJfb3V0O1xuK1x0cmV0dXJuIGJ0ZjtcbitcbitlcnJfb3V0OlxuK1x0YnRmX19mcmVlKGJ0Zik7XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIGludCBhZGRfbG9jYWxfa3B0cihzdHJ1Y3QgYnRmICpidGYsIGludCBwb2ludGVlX2lkLCBjb25zdCBjaGFyICp0YWcpXG4re1xuK1x0aW50IGlkO1xuK1xuK1x0aWQgPSBidGZfX2FkZF90eXBlX3RhZyhidGYsIHRhZywgcG9pbnRlZV9pZCk7XG4rXHRpZiAoIUFTU0VSVF9HVChpZCwgMCwgXCJidGZfX2FkZF90eXBlX3RhZ1wiKSlcbitcdFx0cmV0dXJuIGlkO1xuK1x0aWQgPSBidGZfX2FkZF9wdHIoYnRmLCBpZCk7XG4rXHRBU1NFUlRfR1QoaWQsIDAsIFwiYnRmX19hZGRfcHRyXCIpO1xuK1x0cmV0dXJuIGlkO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X3NlbGZfY3ljbGUoY29uc3QgY2hhciAqdGFnLCBpbnQgZXhwZWN0ZWRfZXJyKVxuK3tcbitcdHN0cnVjdCBidGYgKmJ0ZjtcbitcdGludCBpZCwgZXJyO1xuK1xuK1x0YnRmID0gaW5pdF9idGYoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiaW5pdF9idGZcIikpXG4rXHRcdHJldHVybjtcbitcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCA3LCB0YWcpO1xuK1x0aWYgKGlkIFx1MDAzYz0gMClcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwic2VsZl9jeWNsZVwiLCA4KTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCA3LCBcImJ0Zl9fYWRkX3N0cnVjdCBzZWxmX2N5Y2xlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJuZXh0XCIsIDYsIDAsIDApO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIHNlbGZfY3ljbGU6Om5leHRcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZXJyID0gYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0Zik7XG4rXHRBU1NFUlRfRVEoZXJyLCBleHBlY3RlZF9lcnIsIFwiY2hlY2sgYnRmXCIpO1xuK291dDpcbitcdGJ0Zl9fZnJlZShidGYpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X2FiYV9jeWNsZSh2b2lkKVxuK3tcbitcdHN0cnVjdCBidGYgKmJ0ZjtcbitcdGludCBpZCwgZXJyO1xuK1xuK1x0YnRmID0gaW5pdF9idGYoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiaW5pdF9idGZcIikpXG4rXHRcdHJldHVybjtcbitcdGlkID0gYWRkX2xvY2FsX2twdHIoYnRmLCAxMCwgXCJrcHRyXCIpO1xuK1x0aWYgKGlkIFx1MDAzYz0gMClcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgOSwgXCJrcHRyXCIpO1xuK1x0aWYgKGlkIFx1MDAzYz0gMClcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwiY3ljbGVfYVwiLCA4KTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCA5LCBcImJ0Zl9fYWRkX3N0cnVjdCBjeWNsZV9hXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJiXCIsIDYsIDAsIDApO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIGN5Y2xlX2E6OmJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWQgPSBidGZfX2FkZF9zdHJ1Y3QoYnRmLCBcImN5Y2xlX2JcIiwgOCk7XG4rXHRpZiAoIUFTU0VSVF9FUShpZCwgMTAsIFwiYnRmX19hZGRfc3RydWN0IGN5Y2xlX2JcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcImFcIiwgOCwgMCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgY3ljbGVfYjo6YVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbitcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXCJjaGVjayBidGZcIik7XG4rb3V0OlxuK1x0YnRmX19mcmVlKGJ0Zik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfbWl4ZWRfY3ljbGUodm9pZClcbit7XG4rXHRzdHJ1Y3QgYnRmICpidGY7XG4rXHRpbnQgaWQsIGVycjtcbitcbitcdGJ0ZiA9IGluaXRfYnRmKCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcImluaXRfYnRmXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRpZCA9IGFkZF9sb2NhbF9rcHRyKGJ0ZiwgNywgXCJrcHRyXCIpO1xuK1x0aWYgKGlkIFx1MDAzYz0gMClcbitcdFx0Z290byBvdXQ7XG4rXHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIFwibWl4ZWRfb3duZXJcIiwgMjApO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIDcsIFwiYnRmX19hZGRfc3RydWN0IG1peGVkX293bmVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJyb290XCIsIExJU1RfSEVBRCwgMCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgbWl4ZWRfb3duZXI6OnJvb3RcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZXJyID0gYnRmX19hZGRfZmllbGQoYnRmLCBcImxvY2tcIiwgU1BJTl9MT0NLLCAxMjgsIDApO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJ0Zl9fYWRkX2ZpZWxkIG1peGVkX293bmVyOjpsb2NrXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlkID0gYnRmX19hZGRfZGVjbF90YWcoYnRmLCBcImNvbnRhaW5zOm1peGVkX25vZGU6bm9kZVwiLCA3LCAwKTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCA4LCBcImJ0Zl9fYWRkX2RlY2xfdGFnIG1peGVkX293bmVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJtaXhlZF9ub2RlXCIsIDMyKTtcbitcdGlmICghQVNTRVJUX0VRKGlkLCA5LCBcImJ0Zl9fYWRkX3N0cnVjdCBtaXhlZF9ub2RlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJub2RlXCIsIExJU1RfTk9ERSwgMCwgMCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnRmX19hZGRfZmllbGQgbWl4ZWRfbm9kZTo6bm9kZVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRlcnIgPSBidGZfX2FkZF9maWVsZChidGYsIFwib3duZXJcIiwgNiwgMTkyLCAwKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBtaXhlZF9ub2RlOjpvd25lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRlcnIgPSBidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKTtcbitcdEFTU0VSVF9FUShlcnIsIC1FTE9PUCwgXCJjaGVjayBidGZcIik7XG4rb3V0OlxuK1x0YnRmX19mcmVlKGJ0Zik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfYWN5Y2xpY19kZXB0aChpbnQgZGVwdGgsIGludCBleHBlY3RlZF9lcnIpXG4re1xuK1x0aW50IHB0cl9pZFtNQVhfT1dORVJTSElQX0RFUFRIICsgMV07XG4rXHRpbnQgZmlyc3Rfc3RydWN0X2lkO1xuK1x0c3RydWN0IGJ0ZiAqYnRmO1xuK1x0aW50IGlkLCBlcnIsIGk7XG4rXG4rXHRidGYgPSBpbml0X2J0ZigpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJpbml0X2J0ZlwiKSlcbitcdFx0cmV0dXJuO1xuK1x0Zmlyc3Rfc3RydWN0X2lkID0gNSArIDIgKiBkZXB0aDtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGRlcHRoOyBpKyspIHtcbitcdFx0cHRyX2lkW2ldID0gYWRkX2xvY2FsX2twdHIoYnRmLCBmaXJzdF9zdHJ1Y3RfaWQgKyBpICsgMSwgXCJrcHRyXCIpO1xuK1x0XHRpZiAocHRyX2lkW2ldIFx1MDAzYz0gMClcbitcdFx0XHRnb3RvIG91dDtcbitcdH1cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGRlcHRoOyBpKyspIHtcbitcdFx0Y2hhciBuYW1lWzE2XTtcbitcbitcdFx0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcIm93bmVyXyVkXCIsIGkpO1xuK1x0XHRpZCA9IGJ0Zl9fYWRkX3N0cnVjdChidGYsIG5hbWUsIDgpO1xuK1x0XHRpZiAoIUFTU0VSVF9FUShpZCwgZmlyc3Rfc3RydWN0X2lkICsgaSwgXCJidGZfX2FkZF9zdHJ1Y3Qgb3duZXJcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGVyciA9IGJ0Zl9fYWRkX2ZpZWxkKGJ0ZiwgXCJuZXh0XCIsIHB0cl9pZFtpXSwgMCwgMCk7XG4rXHRcdGlmICghQVNTRVJUX09LKGVyciwgXCJidGZfX2FkZF9maWVsZCBvd25lcjo6bmV4dFwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdH1cbitcdGlkID0gYnRmX19hZGRfc3RydWN0KGJ0ZiwgXCJwbGFpbl9sZWFmXCIsIDQpO1xuK1x0aWYgKCFBU1NFUlRfRVEoaWQsIGZpcnN0X3N0cnVjdF9pZCArIGRlcHRoLCBcImJ0Zl9fYWRkX3N0cnVjdCBwbGFpbl9sZWFmXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGVyciA9IGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpO1xuK1x0QVNTRVJUX0VRKGVyciwgZXhwZWN0ZWRfZXJyLCBcImNoZWNrIGJ0ZlwiKTtcbitvdXQ6XG4rXHRidGZfX2ZyZWUoYnRmKTtcbit9XG4rXG4rdm9pZCB0ZXN0X2xvY2FsX2twdHJfb3duZXJzaGlwKHZvaWQpXG4re1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJzZWxmX2N5Y2xlXCIpKVxuK1x0XHR0ZXN0X3NlbGZfY3ljbGUoXCJrcHRyXCIsIC1FTE9PUCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInVudHJ1c3RlZF9zZWxmX2N5Y2xlXCIpKVxuK1x0XHR0ZXN0X3NlbGZfY3ljbGUoXCJrcHRyX3VudHJ1c3RlZFwiLCAwKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwicGVyY3B1X3NlbGZfY3ljbGVcIikpXG4rXHRcdHRlc3Rfc2VsZl9jeWNsZShcInBlcmNwdV9rcHRyXCIsIC1FTE9PUCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcIkFCQV9jeWNsZVwiKSlcbitcdFx0dGVzdF9hYmFfY3ljbGUoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibWl4ZWRfZ3JhcGhfcm9vdF9jeWNsZVwiKSlcbitcdFx0dGVzdF9taXhlZF9jeWNsZSgpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtYXhfYWN5Y2xpY1wiKSlcbitcdFx0dGVzdF9hY3ljbGljX2RlcHRoKE1BWF9PV05FUlNISVBfREVQVEgsIDApO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJ0b29fZGVlcF9hY3ljbGljXCIpKVxuK1x0XHR0ZXN0X2FjeWNsaWNfZGVwdGgoTUFYX09XTkVSU0hJUF9ERVBUSCArIDEsIC1FTE9PUCk7XG4rfVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjk6MTEuODQ5NzM4OTc1WiIsIlNlcSI6MjUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjg3MzE0NjA0ODksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBQYXRjaCBmb3IgVW5pbml0aWFsaXplZCBNZW1vcnkgUmlza3MqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBwYXRjaCBhbmQgc2VlIGlmIHdlIGhhdmUgYW55IEtNU0FOIGNvbmNlcm5zIGhlcmUuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBnbyBtZXRob2RpY2FsbHkgdGhyb3VnaCB0aGUgY2hhbmdlcywgZm9jdXNpbmcgb24gd2hlcmUgZGF0YSBpcyBiZWluZyBoYW5kbGVkIGFuZCBlc3BlY2lhbGx5IHdoZXJlIG1lbW9yeSBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiBoYXBwZW5zLlxuXG5GaXJzdCwgdGhlIGBrZXJuZWwvYnBmL2J0Zi5jYCBjaGFuZ2VzOiBJdCBsb29rcyBsaWtlIHRoZXkncmUgcmV3b3JraW5nIHRoZSBvd25lcnNoaXAgdmFsaWRhdGlvbiBsb2dpYyB3aXRoaW4gdGhlIEJURiAoQlBGIFR5cGUgRm9ybWF0KSBzeXN0ZW0uIFNwZWNpZmljYWxseSwgdGhleSd2ZSBzaGlmdGVkIHRoZSBjeWNsZSBkZXRlY3Rpb24gYW5kIG93bmVyc2hpcCB2YWxpZGF0aW9uIGFyb3VuZCB3aXRoaW4gYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKClgLiBJbnRlcmVzdGluZyB0aGF0IHRoZXkgYXJlIHJlbW92aW5nIG9sZGVyIGN5Y2xlIGRldGVjdGlvbiBhbmQgbW92aW5nIG93bmVyc2hpcCB2YWxpZGF0aW9uIGxhdGVyLlxuXG5UaGUgYWRkaXRpb24gb2YgYGJ0Zl9vd25lZF90eXBlX2lkeCgpYCBpbW1lZGlhdGVseSBncmFicyBteSBhdHRlbnRpb24uIEl0J3MgcHVycG9zZSBpcyB0byBmaW5kIHRoZSBzdHJ1Y3QgbWV0YSBpbmRleCBmb3IgYW4gb3duZWQgdHlwZS4gSSBoYXZlIGFuIGl0Y2ggdGhhdCB0aGlzIGZ1bmN0aW9uIGNvdWxkIGJlIGEgcG90ZW50aWFsIHBvaW50IGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSB0byBiZSBleHBvc2VkIGlmIG5vdCBoYW5kbGVkIGNhcmVmdWxseSwgZXNwZWNpYWxseSBpZiB0aGVyZSBhcmUgYW55IHN1YnRsZSBjaGFuZ2VzIGluIGhvdyB0aGlzIG93bmVyc2hpcCBpbmZvcm1hdGlvbiBpcyB0cmFja2VkLCBvciBob3cgaXQgaW50ZXJhY3RzIHdpdGgga2VybmVsIHBvaW50ZXJzLCB0aGlzIGlzIHdoZXJlIHRvIGxvb2suIFRoZSB1c2Ugb2YgYC1FTk9FTlRgIGZvciBrZXJuZWwga3B0cnMgaXMgYWxzbyB3b3J0aCBub3Rpbmc7IHdlIG5lZWQgdG8gc2VlIGhvdyB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSByZXN0IG9mIHRoZSBjb2RlLlxuXG5gYnRmX293bmVyc2hpcF9kZXB0aCgpYCBzZWVtcyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkOyByZWN1cnNpdmUgZGVwdGggY2FsY3VsYXRpb24gd2l0aCBtZW1vaXphdGlvbiwgYW5kIGNoZWNrcyBhZ2FpbnN0IGBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSGAuIFNlZW1zIG5vcm1hbCBlbm91Z2gsIGFsdGhvdWdoIHJlY3Vyc2l2ZSBmdW5jdGlvbnMgYXJlIGFsd2F5cyB3b3J0aCBhIGNsb3NlIGxvb2sgaW4gdGhlc2UgY29udGV4dHMuXG5cbk5vdywgYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKWAgaXMgd2hlcmUgdGhpbmdzIGdldCBhIGJpdCBtb3JlIGNyaXRpY2FsLiBXZSBoYXZlIG1lbW9yeSBhbGxvY2F0aW9uIHdpdGggYGt2Y2FsbG9jYCwgd2hpY2ggaXMgZ29vZC4gQnV0LCB3ZSBoYXZlIGEgY2hlY2sgZm9yIGAhZGVwdGhgIGFuZCBhIHJldHVybiBvZiBgLUVOT01FTWAuIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhpcyBgLUVOT01FTWAgaXMgaGFuZGxlZCBjb3JyZWN0bHkgdXAgdGhlIGNhbGwgc3RhY2sgdG8gYXZvaWQgYW55IHBvdGVudGlhbCB1c2UtYWZ0ZXItZnJlZSBvciBvdGhlciBtZW1vcnktcmVsYXRlZCBpc3N1ZXMsIG9yIHBlcmhhcHMgYSBkZW5pYWwgb2Ygc2VydmljZSBpZiBzb21ldGhpbmcgaXNuJ3QgaGFuZGxlZC4gV2UgYWxzbyBuZWVkIHRvIHNlZSBpZiB0aGUgYGt2ZnJlZShkZXB0aClgIGhhcHBlbnMgaW4gYWxsIGNvZGUgcGF0aHMgYXMgdGhpcyBpcyBjcml0aWNhbCB0byBhdm9pZCBtZW1vcnkgbGVha3MuIFRoZSBmYWN0IHRoYXQgaXQgY2FsbHMgYGJ0Zl9vd25lcnNoaXBfZGVwdGgoKWAgZm9yIGVhY2ggc3RydWN0IG1ldGEgaW5kZXggaXMgYWxzbyBpbXBvcnRhbnQgdG8gY29uc2lkZXIuXG5cbkZpbmFsbHksIHRoZSBgYnRmX3BhcnNlKClgIGNhbGwgdG8gYGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKWAgaXMgdGhlIGVudHJ5IHBvaW50LCBzbyB3ZSBuZWVkIHRvIHNlZSBob3cgZXJyb3JzIGhlcmUgcHJvcGFnYXRlLiBUaGlzIGlzIHdoZXJlIHRoZSBvdmVyYWxsIHNlY3VyaXR5IGltcGxpY2F0aW9ucyBzdGFydCB0byByZXZlYWwgdGhlbXNlbHZlcy5cblxuSSB3aWxsIGFsc28gY2hlY2sgdGhlIHNlbGYgdGVzdHMgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2xpbmtlZF9saXN0LmNgIGFuZCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbG9jYWxfa3B0cl9vd25lcnNoaXAuY2AuXG5cbkknbGwgbmVlZCB0byBnbyBiYWNrIGFuZCB0aG9yb3VnaGx5IGluc3BlY3QgdGhlIGNvZGUgc3Vycm91bmRpbmcgdGhlc2UgZnVuY3Rpb25zLCBzcGVjaWZpY2FsbHkgdGhlIGNvbnRleHQgb2YgYGJ0Zl9jaGVja19hbmRfZml4dXBfZmllbGRzKClgIGFuZCBgYnRmX3BhcnNlYCwgdG8gdW5kZXJzdGFuZCB0aGUgY29udHJvbCBmbG93LCBlcnJvciBoYW5kbGluZywgYW5kIG1lbW9yeSBtYW5hZ2VtZW50LiBXZSBuZWVkIHRvIGJlIGFic29sdXRlbHkgc3VyZSB0aGF0IGV2ZXJ5IGNvZGUgcGF0aCBpcyBzYWZlIGFuZCB0aGF0IHRoZXJlIGFyZSBubyBnYXBzIHRoYXQgY291bGQgbGVhZCB0byBLTVNBTiB0cmlnZ2VyaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3MDM1LCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDg0LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjk6MjAuNTgxMjAyMDY0WiIsIlNlcSI6MjYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDIyMzM5ODQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL2JwZi9idGYuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL2J0Zi5jPTQxMzU9c3RydWN0IGJ0Zl9yZWNvcmQgKmJ0Zl9wYXJzZV9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQsXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTQyNjctXFxua2VybmVsL2JwZi9idGYuYzo0MjY4OmludCBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHN0cnVjdCBidGZfcmVjb3JkICpyZWMpXFxua2VybmVsL2JwZi9idGYuYy00MjY5LXtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NTk5OT1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlKGNvbnN0IHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjA3Ny1cXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2Mgc3RydWN0X21ldGFfdGFiLVxcdTAwM2VjbnQ7IGkrKykge1xcbmtlcm5lbC9icGYvYnRmLmM6NjA3ODpcXHRcXHRcXHRlcnIgPSBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkcyhidGYsIHN0cnVjdF9tZXRhX3RhYi1cXHUwMDNldHlwZXNbaV0ucmVjb3JkKTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTYwNzktXFx0XFx0XFx0aWYgKGVyciBcXHUwMDNjIDApXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDEyOjI5OjIwLjY4MzQ0MTE4OFoiLCJTZXEiOjI3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNDk2Mzg2MDgwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIGl0OlxuXG4qKkRpdmluZyBpbnRvIEJURiBGaWVsZCBIYW5kbGluZyoqXG5cbkFscmlnaHQsIGxldCdzIGdldCBpbnRvIHRoZSBuaXR0eS1ncml0dHkuIEknbSBnb2luZyB0byBkaWcgaW50byB0aGUgYGtlcm5lbC9icGYvYnRmLmNgIGZpbGUgYW5kIHNwZWNpZmljYWxseSBmb2N1cyBvbiB0aGUgY29kZSBzdXJyb3VuZGluZyBgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHNgIGFuZCBgYnRmX3BhcnNlYC4gV2Uga25vdyBCVEYncyBjcnVjaWFsIGZvciBlZmZpY2llbnRseSByZXByZXNlbnRpbmcgYW5kIG1hbmFnaW5nIHR5cGUgaW5mb3JtYXRpb24gZm9yIGVCUEYgcHJvZ3JhbXMsIHNvIEkgd2FudCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgaG93IHRoZSBrZXJuZWwgdmFsaWRhdGVzIGFuZCBtYW5pcHVsYXRlcyBCVEYgZmllbGQgZGVmaW5pdGlvbnMgZHVyaW5nIHBhcnNpbmcuIEl0J3MgaW1wZXJhdGl2ZSBJIGdyYXNwIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgcG90ZW50aWFsIGluY29uc2lzdGVuY2llcyBvciBlcnJvcnMgaW4gdGhlIEJURiBkYXRhIGFuZCwgY3J1Y2lhbGx5LCBob3cgaXQgYXR0ZW1wdHMgdG8gY29ycmVjdCB0aGVtLiBJJ20gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gaG93IHRoZXkndmUgaGFuZGxlZCBzdHJ1Y3R1cmUgYW5kIHVuaW9uIG9mZnNldHMsIGFueSBwYWRkaW5nIGlzc3VlcywgYW5kIGFsc28gaG93IHR5cGUgcmVsYXRpb25zaGlwcyBhcmUgcmVzb2x2ZWQuIExldCdzIHNlZSBob3cgdGhleSd2ZSBhZGRyZXNzZWQgcG90ZW50aWFsIGNvcnJ1cHRpb24gb3IgZXJyb3JzIGluIHRoZSBmaWVsZCBkYXRhIGl0c2VsZiwgYW5kIGVuc3VyZSBvdXIgYXNzdW1wdGlvbnMgbWF0Y2ggdGhlIGltcGxlbWVudGF0aW9uLiBUaGlzIGlzIGdvaW5nIHRvIGJlIGFib3V0IG1haW50YWluaW5nIHRoZSBpbnRlZ3JpdHkgb2YgdGhhdCBjcnVjaWFsIHR5cGUgaW5mb3JtYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg1MDMsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyOToyMy4xNzk4Mjk2NzdaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzA4MTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9icGYvYnRmLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDI2NSxcbiAgXCJMaW5lQ291bnRcIjogOTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiNDI2NTpcXHRcXHRyZXR1cm4gRVJSX1BUUihyZXQpO1xcbjQyNjY6XFx0fVxcbjQyNjc6XFx0XFxuNDI2ODpcXHRpbnQgYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjKVxcbjQyNjk6XFx0e1xcbjQyNzA6XFx0XFx0aW50IGk7XFxuNDI3MTpcXHRcXG40MjcyOlxcdFxcdC8qXFxuNDI3MzpcXHRcXHQgKiBDaGVjayBmaWVsZHMgd2hpY2ggcmVxdWlyZSB0aGUgY29tcGxldGUgQlRGIGFuZCBpbml0aWFsaXplIHJ1bnRpbWVcXG40Mjc0OlxcdFxcdCAqIG1ldGFkYXRhLiBPd25lcnNoaXAgcmVsYXRpb25zaGlwcyBhcmUgdmFsaWRhdGVkIGFmdGVyIGV2ZXJ5IHJlY29yZCBoYXNcXG40Mjc1OlxcdFxcdCAqIGJlZW4gZml4ZWQgdXAuXFxuNDI3NjpcXHRcXHQgKi9cXG40Mjc3OlxcdFxcdGlmIChJU19FUlJfT1JfTlVMTChyZWMpIHx8ICEocmVjLVxcdTAwM2VmaWVsZF9tYXNrIFxcdTAwMjYgKEJQRl9HUkFQSF9ST09UIHwgQlBGX1VQVFIpKSlcXG40Mjc4OlxcdFxcdFxcdHJldHVybiAwO1xcbjQyNzk6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHJlYy1cXHUwMDNlY250OyBpKyspIHtcXG40MjgwOlxcdFxcdFxcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKm1ldGE7XFxuNDI4MTpcXHRcXHRcXHRjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKnQ7XFxuNDI4MjpcXHRcXHRcXHR1MzIgYnRmX2lkO1xcbjQyODM6XFx0XFxuNDI4NDpcXHRcXHRcXHRpZiAocmVjLVxcdTAwM2VmaWVsZHNbaV0udHlwZSA9PSBCUEZfVVBUUikge1xcbjQyODU6XFx0XFx0XFx0XFx0LyogVGhlIHVwdHIgb25seSBzdXBwb3J0cyBwaW5uaW5nIG9uZSBwYWdlIGFuZCBjYW5ub3RcXG40Mjg2OlxcdFxcdFxcdFxcdCAqIHBvaW50IHRvIGEga2VybmVsIHN0cnVjdFxcbjQyODc6XFx0XFx0XFx0XFx0ICovXFxuNDI4ODpcXHRcXHRcXHRcXHRpZiAoYnRmX2lzX2tlcm5lbChyZWMtXFx1MDAzZWZpZWxkc1tpXS5rcHRyLmJ0ZikpXFxuNDI4OTpcXHRcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG40MjkwOlxcdFxcdFxcdFxcdHQgPSBidGZfdHlwZV9ieV9pZChyZWMtXFx1MDAzZWZpZWxkc1tpXS5rcHRyLmJ0ZixcXG40MjkxOlxcdFxcdFxcdFxcdFxcdFxcdCAgIHJlYy1cXHUwMDNlZmllbGRzW2ldLmtwdHIuYnRmX2lkKTtcXG40MjkyOlxcdFxcdFxcdFxcdGlmICghdC1cXHUwMDNlc2l6ZSlcXG40MjkzOlxcdFxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjQyOTQ6XFx0XFx0XFx0XFx0aWYgKHQtXFx1MDAzZXNpemUgXFx1MDAzZSBQQUdFX1NJWkUpXFxuNDI5NTpcXHRcXHRcXHRcXHRcXHRyZXR1cm4gLUUyQklHO1xcbjQyOTY6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuNDI5NzpcXHRcXHRcXHR9XFxuNDI5ODpcXHRcXG40Mjk5OlxcdFxcdFxcdGlmICghKHJlYy1cXHUwMDNlZmllbGRzW2ldLnR5cGUgXFx1MDAyNiBCUEZfR1JBUEhfUk9PVCkpXFxuNDMwMDpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG40MzAxOlxcdFxcdFxcdGJ0Zl9pZCA9IHJlYy1cXHUwMDNlZmllbGRzW2ldLmdyYXBoX3Jvb3QudmFsdWVfYnRmX2lkO1xcbjQzMDI6XFx0XFx0XFx0bWV0YSA9IGJ0Zl9maW5kX3N0cnVjdF9tZXRhKGJ0ZiwgYnRmX2lkKTtcXG40MzAzOlxcdFxcdFxcdGlmICghbWV0YSlcXG40MzA0OlxcdFxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbjQzMDU6XFx0XFx0XFx0cmVjLVxcdTAwM2VmaWVsZHNbaV0uZ3JhcGhfcm9vdC52YWx1ZV9yZWMgPSBtZXRhLVxcdTAwM2VyZWNvcmQ7XFxuNDMwNjpcXHRcXHR9XFxuNDMwNzpcXHRcXHRyZXR1cm4gMDtcXG40MzA4OlxcdH1cXG40MzA5OlxcdFxcbjQzMTA6XFx0c3RhdGljIGludCBidGZfb3duZWRfdHlwZV9pZHgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLFxcbjQzMTE6XFx0XFx0XFx0XFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9maWVsZCAqZmllbGQpXFxuNDMxMjpcXHR7XFxuNDMxMzpcXHRcXHRzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhICptZXRhO1xcbjQzMTQ6XFx0XFx0dTMyIGJ0Zl9pZDtcXG40MzE1OlxcdFxcbjQzMTY6XFx0XFx0aWYgKGZpZWxkLVxcdTAwM2V0eXBlIFxcdTAwMjYgQlBGX0dSQVBIX1JPT1QpIHtcXG40MzE3OlxcdFxcdFxcdGJ0Zl9pZCA9IGZpZWxkLVxcdTAwM2VncmFwaF9yb290LnZhbHVlX2J0Zl9pZDtcXG40MzE4OlxcdFxcdH0gZWxzZSBpZiAoZmllbGQtXFx1MDAzZXR5cGUgPT0gQlBGX0tQVFJfUkVGIHx8IGZpZWxkLVxcdTAwM2V0eXBlID09IEJQRl9LUFRSX1BFUkNQVSkge1xcbjQzMTk6XFx0XFx0XFx0aWYgKGJ0Zl9pc19rZXJuZWwoZmllbGQtXFx1MDAzZWtwdHIuYnRmKSlcXG40MzIwOlxcdFxcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbjQzMjE6XFx0XFx0XFx0YnRmX2lkID0gZmllbGQtXFx1MDAzZWtwdHIuYnRmX2lkO1xcbjQzMjI6XFx0XFx0fSBlbHNlIHtcXG40MzIzOlxcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbjQzMjQ6XFx0XFx0fVxcbjQzMjU6XFx0XFxuNDMyNjpcXHRcXHRtZXRhID0gYnRmX2ZpbmRfc3RydWN0X21ldGEoYnRmLCBidGZfaWQpO1xcbjQzMjc6XFx0XFx0aWYgKCFtZXRhKVxcbjQzMjg6XFx0XFx0XFx0cmV0dXJuIGZpZWxkLVxcdTAwM2V0eXBlIFxcdTAwMjYgQlBGX0dSQVBIX1JPT1QgPyAtRUZBVUxUIDogLUVOT0VOVDtcXG40MzI5OlxcdFxcdHJldHVybiBtZXRhIC0gdGFiLVxcdTAwM2V0eXBlcztcXG40MzMwOlxcdH1cXG40MzMxOlxcdFxcbjQzMzI6XFx0LypcXG40MzMzOlxcdCAqIEVhY2ggb3duZXJzaGlwIGVkZ2UgYWRkcyBrZXJuZWwgZnJhbWVzIHRocm91Z2ggYnBmX29ial9mcmVlX2ZpZWxkcygpIGFuZFxcbjQzMzQ6XFx0ICogX19icGZfb2JqX2Ryb3BfaW1wbCgpLiBLZWVwIHRoZSBib3VuZCBkZWxpYmVyYXRlbHkgc21hbGwgYmVjYXVzZSBvYmplY3RcXG40MzM1OlxcdCAqIGRlc3RydWN0aW9uIGNhbiBpdHNlbGYgcnVuIGJlbG93IGEgQlBGIGNhbGwgY2hhaW4uIEEgZmluYWwgcG9pbnRlZSB3aXRob3V0XFxuNDMzNjpcXHQgKiBzcGVjaWFsIGZpZWxkcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIGFuZCBhZGRzIG9ubHkgYVxcbjQzMzc6XFx0ICogbm9uLXJlY3Vyc2luZyBkcm9wLlxcbjQzMzg6XFx0ICovXFxuNDMzOTpcXHQjZGVmaW5lIEJURl9NQVhfT1dORVJTSElQX0RFUFRIIDhcXG40MzQwOlxcdFxcbjQzNDE6XFx0c3RhdGljIGludCBidGZfb3duZXJzaGlwX2RlcHRoKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG40MzQyOlxcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiLCB1OCAqZGVwdGgsXFxuNDM0MzpcXHRcXHRcXHRcXHQgICAgICAgaW50IGlkeCwgaW50IGRlcHRoX2xlZnQpXFxuNDM0NDpcXHR7XFxuNDM0NTpcXHRcXHRjb25zdCBzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjID0gdGFiLVxcdTAwM2V0eXBlc1tpZHhdLnJlY29yZDtcXG40MzQ2OlxcdFxcdGludCBpLCByZXQsIG1heF9kZXB0aCA9IDA7XFxuNDM0NzpcXHRcXG40MzQ4OlxcdFxcdGlmICghZGVwdGhfbGVmdClcXG40MzQ5OlxcdFxcdFxcdHJldHVybiAtRUxPT1A7XFxuNDM1MDpcXHRcXHRpZiAoZGVwdGhbaWR4XSlcXG40MzUxOlxcdFxcdFxcdGdvdG8gZG9uZTtcXG40MzUyOlxcdFxcbjQzNTM6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHJlYy1cXHUwMDNlY250OyBpKyspIHtcXG40MzU0OlxcdFxcdFxcdHJldCA9IGJ0Zl9vd25lZF90eXBlX2lkeChidGYsIHRhYiwgXFx1MDAyNnJlYy1cXHUwMDNlZmllbGRzW2ldKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjk6MjMuMTgwMTM5ODI3WiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQ0NDA0MjUwOTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIGZ1bmN0aW9ucywgdGhpbmtpbmcgdGhyb3VnaCBpdCBhcyBpZiB0aGV5IHdlcmUgbXkgb3duIG1lbnRhbCBwcm9jZXNzZXM6XG5cbioqUXVpY2sgU2NhbiBvZiBPd25lcnNoaXAgRGVwdGggYW5kIFBhcnNpbmcgRnVuY3Rpb25zKipcblxuQWxyaWdodCwgYmVmb3JlIGRpdmluZyBpbnRvIGFueXRoaW5nIHRvbyBkZWVwLCBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIGhvdyB0aGVzZSByZWxhdGVkIGZ1bmN0aW9ucyBhcmUgaW50ZXJhY3RpbmcuIEknbSB0aGlua2luZyBhYm91dCBgYnRmX293bmVyc2hpcF9kZXB0aGAsIGBidGZfY2hlY2tfb3duZXJzaGlwX2RlcHRoYCwgYW5kIGBidGZfcGFyc2VgIGluIHBhcnRpY3VsYXIuIEltbWVkaWF0ZWx5LCBJJ20gZ29pbmcgdG8gd2FudCB0byB1bmRlcnN0YW5kIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBkZXB0aCBjaGVja2luZyBhbmQgcGFyc2luZy4gSXMgdGhlIGRlcHRoIGNoZWNrIGhhcHBlbmluZyAqYmVmb3JlKiBwYXJzaW5nLCBvciBpcyBpdCBpbnRlcmxlYXZlZCBpbiBzb21lIHdheT8gT3IgaXMgYGJ0Zl9wYXJzZWAgdGhlIG1haW4gZHJpdmVyIHdpdGggdGhlIGRlcHRoIGNoZWNrcyBiZWluZyBzb21lIGtpbmQgb2YgYW5jaWxsYXJ5IG9yIGhlbHBlciBmdW5jdGlvbj8gSSB3YW50IHRvIGtub3cgaWYgdGhlIGBvd25lcnNoaXBfZGVwdGhgIGZ1bmN0aW9ucyBhcmUganVzdCBndWFyZHMsIHNhbml0eSBjaGVja3MsIG9yIGlmIHRoZXkncmUgYWN0dWFsbHkgZnVuZGFtZW50YWxseSBpbnZvbHZlZCBpbiBob3cgdGhlIEJURiBkYXRhIGlzIHByb2Nlc3NlZCBvciBjb25zdHJ1Y3RlZC4gRG9lcyBhIGRlZXAgb3duZXJzaGlwIG1lYW4gc29tZXRoaW5nIGRpZmZlcmVudCBpbiB0aGUgY29udGV4dCBvZiBgYnRmX3BhcnNlYD8gQW5kIGRvZXMgdGhpcyBpbnRlcnBsYXkgY2hhbmdlIGhvdyBJIGFwcHJvYWNoIGEgcG90ZW50aWFsIGFuYWx5c2lzIG9yIGRlYnVnZ2luZyBzaXR1YXRpb24/IFRoaXMgZmVlbHMgbGlrZSBhbiBpbXBvcnRhbnQgc3RhcnRpbmcgcG9pbnQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwMjY0LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyOToyNy42MjA1NjkzOTFaIiwiU2VxIjozMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mzk4MDAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9icGYvYnRmLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDM1NSxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiNDM1NTpcXHRcXHRcXHRpZiAocmV0ID09IC1FTk9FTlQpXFxuNDM1NjpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG40MzU3OlxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbjQzNTg6XFx0XFx0XFx0XFx0cmV0dXJuIHJldDtcXG40MzU5OlxcdFxcdFxcdHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCByZXQsIGRlcHRoX2xlZnQgLSAxKTtcXG40MzYwOlxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbjQzNjE6XFx0XFx0XFx0XFx0cmV0dXJuIHJldDtcXG40MzYyOlxcdFxcdFxcdG1heF9kZXB0aCA9IG1heChtYXhfZGVwdGgsIHJldCk7XFxuNDM2MzpcXHRcXHR9XFxuNDM2NDpcXHRcXHRkZXB0aFtpZHhdID0gbWF4X2RlcHRoICsgMTtcXG40MzY1OlxcdGRvbmU6XFxuNDM2NjpcXHRcXHRyZXR1cm4gZGVwdGhbaWR4XSBcXHUwMDNlIGRlcHRoX2xlZnQgPyAtRUxPT1AgOiBkZXB0aFtpZHhdO1xcbjQzNjc6XFx0fVxcbjQzNjg6XFx0XFxuNDM2OTpcXHRzdGF0aWMgaW50IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxcbjQzNzA6XFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgYnRmX3N0cnVjdF9tZXRhcyAqdGFiKVxcbjQzNzE6XFx0e1xcbjQzNzI6XFx0XFx0dTggKmRlcHRoO1xcbjQzNzM6XFx0XFx0aW50IGksIHJldCA9IDA7XFxuNDM3NDpcXHRcXG40Mzc1OlxcdFxcdGRlcHRoID0ga3ZjYWxsb2ModGFiLVxcdTAwM2VjbnQsIHNpemVvZigqZGVwdGgpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTtcXG40Mzc2OlxcdFxcdGlmICghZGVwdGgpXFxuNDM3NzpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG40Mzc4OlxcdFxcbjQzNzk6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHRhYi1cXHUwMDNlY250OyBpKyspIHtcXG40MzgwOlxcdFxcdFxcdHJldCA9IGJ0Zl9vd25lcnNoaXBfZGVwdGgoYnRmLCB0YWIsIGRlcHRoLCBpLFxcbjQzODE6XFx0XFx0XFx0XFx0XFx0XFx0ICBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSCk7XFxuNDM4MjpcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG40MzgzOlxcdFxcdFxcdFxcdGJyZWFrO1xcbjQzODQ6XFx0XFx0XFx0cmV0ID0gMDtcXG40Mzg1OlxcdFxcdH1cXG40Mzg2OlxcdFxcdGt2ZnJlZShkZXB0aCk7XFxuNDM4NzpcXHRcXHRyZXR1cm4gcmV0O1xcbjQzODg6XFx0fVxcbjQzODk6XFx0XFxuNDM5MDpcXHRzdGF0aWMgdm9pZCBfX2J0Zl9zdHJ1Y3Rfc2hvdyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCxcXG40MzkxOlxcdFxcdFxcdFxcdCAgICAgIHUzMiB0eXBlX2lkLCB2b2lkICpkYXRhLCB1OCBiaXRzX29mZnNldCxcXG40MzkyOlxcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCBidGZfc2hvdyAqc2hvdylcXG40MzkzOlxcdHtcXG40Mzk0OlxcdFxcdGNvbnN0IHN0cnVjdCBidGZfbWVtYmVyICptZW1iZXI7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDEyOjI5OjI3LjYyMDk3MDQ1MVoiLCJTZXEiOjMxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMjE3MjcxNzM4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIGBidGZfcGFyc2VgKipcblxuT2theSwgdGltZSB0byB6ZXJvIGluLiBJJ20gdGhpbmtpbmcgd2UgbmVlZCB0byB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgYGJ0Zl9wYXJzZWAsIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSA2MDc1LiBNeSBndXQgZmVlbGluZyBpcyB0aGF0IHNvbWV0aGluZyBpbnRlcmVzdGluZyBpcyBoYXBwZW5pbmcsIG9yICpub3QqIGhhcHBlbmluZywgYXJvdW5kIHRoYXQgYXJlYSB3aXRoaW4gdGhlIGZ1bmN0aW9uLiBHaXZlbiB3aGF0IEkndmUgYmVlbiBzZWVpbmcgd2l0aCB0aGUgcmVsYXRlZCBpc3N1ZXMsIHRoaXMgaXMgYSBsaWtlbHkgcG9pbnQgZm9yIGRlZXBlciBpbnNwZWN0aW9uLiBUaW1lIHRvIGZpcmUgdXAgdGhlIGRlYnVnZ2VyIGFuZCBzdGFydCB0cmFjaW5nIGV4ZWN1dGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTExNjksIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDEyOjI5OjI5LjgzODI0NTc4OVoiLCJTZXEiOjMyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNzQ0NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2JwZi9idGYuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA2MDcwLFxuICBcIkxpbmVDb3VudFwiOiAzNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCI2MDcwOlxcdFxcdFxcdGdvdG8gZXJyb3V0O1xcbjYwNzE6XFx0XFx0fVxcbjYwNzI6XFx0XFx0YnRmLVxcdTAwM2VzdHJ1Y3RfbWV0YV90YWIgPSBzdHJ1Y3RfbWV0YV90YWI7XFxuNjA3MzpcXHRcXG42MDc0OlxcdFxcdGlmIChzdHJ1Y3RfbWV0YV90YWIpIHtcXG42MDc1OlxcdFxcdFxcdGludCBpO1xcbjYwNzY6XFx0XFxuNjA3NzpcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2Mgc3RydWN0X21ldGFfdGFiLVxcdTAwM2VjbnQ7IGkrKykge1xcbjYwNzg6XFx0XFx0XFx0XFx0ZXJyID0gYnRmX2NoZWNrX2FuZF9maXh1cF9maWVsZHMoYnRmLCBzdHJ1Y3RfbWV0YV90YWItXFx1MDAzZXR5cGVzW2ldLnJlY29yZCk7XFxuNjA3OTpcXHRcXHRcXHRcXHRpZiAoZXJyIFxcdTAwM2MgMClcXG42MDgwOlxcdFxcdFxcdFxcdFxcdGdvdG8gZXJyb3V0X21ldGE7XFxuNjA4MTpcXHRcXHRcXHR9XFxuNjA4MjpcXHRcXG42MDgzOlxcdFxcdFxcdGVyciA9IGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoYnRmLCBzdHJ1Y3RfbWV0YV90YWIpO1xcbjYwODQ6XFx0XFx0XFx0aWYgKGVyciBcXHUwMDNjIDApXFxuNjA4NTpcXHRcXHRcXHRcXHRnb3RvIGVycm91dF9tZXRhO1xcbjYwODY6XFx0XFx0fVxcbjYwODc6XFx0XFxuNjA4ODpcXHRcXHRlcnIgPSBicGZfbG9nX2F0dHJfZmluYWxpemUoYXR0cl9sb2csIFxcdTAwMjZlbnYtXFx1MDAzZWxvZyk7XFxuNjA4OTpcXHRcXHRpZiAoZXJyKVxcbjYwOTA6XFx0XFx0XFx0Z290byBlcnJvdXRfZnJlZTtcXG42MDkxOlxcdFxcbjYwOTI6XFx0XFx0YnRmX3ZlcmlmaWVyX2Vudl9mcmVlKGVudik7XFxuNjA5MzpcXHRcXHRyZWZjb3VudF9zZXQoXFx1MDAyNmJ0Zi1cXHUwMDNlcmVmY250LCAxKTtcXG42MDk0OlxcdFxcdHJldHVybiBidGY7XFxuNjA5NTpcXHRcXG42MDk2OlxcdGVycm91dF9tZXRhOlxcbjYwOTc6XFx0XFx0YnRmX2ZyZWVfc3RydWN0X21ldGFfdGFiKGJ0Zik7XFxuNjA5ODpcXHRlcnJvdXQ6XFxuNjA5OTpcXHRcXHQvKiBvdmVyd3JpdGUgZXJyIHdpdGggLUVOT1NQQyBvciAtRUZBVUxUICovXFxuNjEwMDpcXHRcXHRyZXQgPSBicGZfbG9nX2F0dHJfZmluYWxpemUoYXR0cl9sb2csIFxcdTAwMjZlbnYtXFx1MDAzZWxvZyk7XFxuNjEwMTpcXHRcXHRpZiAocmV0KVxcbjYxMDI6XFx0XFx0XFx0ZXJyID0gcmV0O1xcbjYxMDM6XFx0ZXJyb3V0X2ZyZWU6XFxuNjEwNDpcXHRcXHRidGZfdmVyaWZpZXJfZW52X2ZyZWUoZW52KTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTI6Mjk6MjkuODM4NjI1MDQ5WiIsIlNlcSI6MzMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjYzNTczNDk0NTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gQXNzZXNzbWVudDogQlRGIE93bmVyc2hpcCBWZXJpZmljYXRpb24qKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGdvYWwgaGVyZSBpcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGFueSBuZXcgcmlza3MgdGhhdCByZXF1aXJlIEtNU0FOJ3MgYXR0ZW50aW9uLiBMZXQgbWUgcmVjYXAgbXkgdGhpbmtpbmcuXG5cbkZpcnN0LCBJIHVuZGVyc3RhbmQgdGhpcyBwYXRjaCBmb2N1c2VzIG9uIEJURiAoQmVya2VsZXkgUGFja2V0IEZpbHRlciBUeXBlIEZvcm1hdCkgdmVyaWZpY2F0aW9uLCBzcGVjaWZpY2FsbHkgcmVnYXJkaW5nIHRoZSBvd25lcnNoaXAgb2Ygc3RydWN0dXJlcyB3aXRoaW4gdGhlc2UgQlRGIGRlZmluaXRpb25zLiBJIHNlZSB0aGF0IGBidGZfY2hlY2tfYW5kX2ZpeHVwX2ZpZWxkc2AgaXMgc2V0dGluZyB1cCB0aGUgbmVjZXNzYXJ5IGxpbmtzIGZvciB0aGlzIG93bmVyc2hpcCBjaGVjaywgYW5kIGltcG9ydGFudGx5LCB0aGUgb3duZXJzaGlwIGN5Y2xlIGRldGVjdGlvbiBpcyBub3cgaGFuZGxlZCBieSBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAuXG5cbkRlbHZpbmcgaW50byBgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aGAsIHRoZSBrZXkgaGVyZSBpcyB0aGUgYWxsb2NhdGlvbiBhbmQgdXNlIG9mIHRoZSBgZGVwdGhgIGFycmF5LiBJdCB1c2VzIGBrdmNhbGxvY2AsIHdoaWNoIGlzIHRoZSBjb3JyZWN0IGNhbGwgZm9yIHplcm8taW5pdGlhbGl6aW5nIHRoaXMgYXJyYXksIHdoaWNoIGlzIGNydWNpYWwgZm9yIG91ciBzYWZldHkgYW5hbHlzaXMuIFRoaXMgYXJyYXkgdHJhY2tzIHRoZSBvd25lcnNoaXAgZGVwdGggb2YgZWFjaCBzdHJ1Y3R1cmUuIFRoZSBjb2RlIHRoZW4gcmVjdXJzaXZlbHkgY2hlY2tzIHRoZSBvd25lcnNoaXAgZGVwdGggZm9yIGVhY2ggc3RydWN0IHVwIHRvIGBCVEZfTUFYX09XTkVSU0hJUF9ERVBUSGAuIFRoZSBtZW1vaXphdGlvbiB3aXRoaW4gdGhlIGRlcHRoIGNoZWNrIGlzIGEgZ29vZCBvcHRpbWl6YXRpb24uIElmIHRoZSBgZGVwdGhgIGlzIG5vbi16ZXJvLCBpdCBtZWFucyBpdCB3YXMgcHJldmlvdXNseSBjaGVja2VkLiBJdCB0aGVuIGZyZWVzIHRoZSBtZW1vcnksIHdoaWNoIGlzIGFsc28gaW1wb3J0YW50LlxuXG5Ob3csIHRoZSBjcml0aWNhbCBxdWVzdGlvbjogYXJlIHRoZXJlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcz8gVGhlIGBkZXB0aGAgYXJyYXkgaXMgKnplcm9lZCogYnkgYGt2Y2FsbG9jYC4gQWxsIG90aGVyIHZhcmlhYmxlcyBzZWVtIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQuIE5vdGhpbmcgaXMgZGlyZWN0bHkgY29waWVkIHRvIHVzZXIgc3BhY2Ugb3IgZXhwb3NlZC4gVGhpcyBsb29rcyBnb29kLlxuXG5OZXh0LCBJIG5lZWQgdG8gY29uc2lkZXIgcG90ZW50aWFsIGJ1ZmZlciBvdmVycnVucywgdW5pbml0aWFsaXplZCBmaWVsZHMgaW4gQlBGIG9iamVjdHMsIG9yIGNoYW5nZXMgdG8gbGVuZ3Rocy4gSG93ZXZlciwgdGhpcyBwYXRjaCBpcyBvbmx5IHZhbGlkYXRpbmcgaW50ZXJuYWwgc3RydWN0dXJlcy4gSXQgc2VlbXMgdG8gYmUgc29sZWx5IGludm9sdmVkIGluIHZlcmlmaWNhdGlvbiwgKm5vdCogY3JlYXRpbmcsIG1vZGlmeWluZywgb3Igc2VuZGluZyBhbnl0aGluZyB0byB1c2VyLXNwYWNlIHRoYXQgaXNuJ3QgYWxyZWFkeSBoYW5kbGVkIGJ5IG90aGVyIGtlcm5lbCBjb2RlLiBJJ20gc2F0aXNmaWVkIHRoYXQgdGhpcyBwYXRjaCBkb2Vzbid0IGludHJvZHVjZSBhbnkgbmV3IHZ1bG5lcmFiaWxpdGllcyByZWxhdGVkIHRvIHRoZXNlIGlzc3Vlcy4gRnVydGhlciwgaWYgdGhlcmUgd2VyZSBhbnkgbWVtb3J5IHByb2JsZW1zIGluIHRoZSB0YWJsZSwgS0FTQU4gc2hvdWxkIGhhbmRsZSB0aGVtLlxuXG5MZXQgbWUgZ28gdGhyb3VnaCBteSB1c3VhbCBjaGVja2xpc3Q6IG5vIGtlcm5lbCBzdHJ1Y3R1cmVzIGFyZSBzZW50IHRvIHVzZXIgc3BhY2Ugd2hlcmUgZmllbGRzIG1pZ2h0IGJlIHVuaW5pdGlhbGl6ZWQuIFRoZXJlIGlzIG5vIGNvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyBiYXNlZCBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy4gQ29tcGxleCBkYXRhIHN0cnVjdHVyZXMsIGxpa2UgdGhlIGRlcHRoIGFycmF5LCBhcmUgY29ycmVjdGx5IGluaXRpYWxpemVkIHdpdGggYGt2Y2FsbG9jYC4gVGhlIGJvdW5kcyBjaGVja3MgYXJlIGdvb2QgYW5kIHRoaXMgcGF0Y2ggZG9lc24ndCBpbnRyb2R1Y2UgYW55IG5ldyBvcHBvcnR1bml0aWVzIHRvIHJlYWQgdW5pbml0aWFsaXplZCBtZW1vcnkuXG5cblRoZXJlZm9yZSwgYWZ0ZXIgdGhpcyBkZXRhaWxlZCBhc3Nlc3NtZW50LCBJIGNhbiBjb25maWRlbnRseSBjb25jbHVkZSB0aGF0IGBOZWVkc0tNU0FOYCBzaG91bGQgYmUgZmFsc2UuXG5cbkluIHN1bW1hcnksIHRoaXMgcGF0Y2ggZW5mb3JjZXMgQlRGIG93bmVyc2hpcCB2ZXJpZmljYXRpb24gdG8gY2hlY2sgZm9yIGN5Y2xlcyBhbmQgbGltaXQgZGVwdGguIFRoZSBtYWluIG1lbW9yeSBjb25jZXJuIGlzIGNvcnJlY3RseSBoYW5kbGVkIGJ5IGBrdmNhbGxvY2AsIHplcm9pbmcgdGhlIGBkZXB0aGAgYXJyYXkuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggdGhlIHRhYmxlIG9yIGxvb3BzIGFyZSBiZXR0ZXIgYWRkcmVzc2VkIGJ5IHN0YW5kYXJkIHNhbml0aXplcnMgc3VjaCBhcyBLQVNBTi5cblxuSSdtIGNvbWZvcnRhYmxlIHNldHRpbmcgdGhlIHJlc3VsdHMgbm93LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTg3MCwiT3V0cHV0VG9rZW5zIjoyMTMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3MjIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxMjoyOTozNi4xOTU5Nzc2N1oiLCJTZXEiOjM0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1OTcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggdXBkYXRlcyB0aGUgQlRGIHZlcmlmaWVyIHRvIHZhbGlkYXRlIG93bmVyc2hpcCBhY3ljbGljaXR5IGFuZCBlbmZvcmNlIGEgbWF4aW11bSBvd25lcnNoaXAgZGVwdGggKEJURl9NQVhfT1dORVJTSElQX0RFUFRIKSBhY3Jvc3MgQlBGIGdyYXBoIHJvb3RzIGFuZCBsb2NhbCBrcHRycy5cXG5cXG5NZW1vcnkgc2FmZXR5IGFuYWx5c2lzOlxcbjEuIFRoZSB0ZW1wb3JhcnkgZGVwdGggYXJyYXkgdXNlZCBkdXJpbmcgb3duZXJzaGlwIHRyYXZlcnNhbCBpcyBhbGxvY2F0ZWQgdmlhIGt2Y2FsbG9jKCksIGVuc3VyaW5nIGl0IGlzIGZ1bGx5IHplcm8taW5pdGlhbGl6ZWQuXFxuMi4gQWxsIGxvY2FsIHZhcmlhYmxlcyBpbiBidGZfb3duZXJzaGlwX2RlcHRoKCksIGJ0Zl9jaGVja19vd25lcnNoaXBfZGVwdGgoKSwgYW5kIGJ0Zl9vd25lZF90eXBlX2lkeCgpIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLlxcbjMuIE5vIGRhdGEgc3RydWN0dXJlcyBvciBidWZmZXJzIGFyZSBjb3BpZWQgdG8gdXNlciBzcGFjZSwgYW5kIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHJlYWQgb3IgdXNlZCBpbiBjb25kaXRpb25hbCBicmFuY2hpbmcuXFxuNC4gQW55IHBvdGVudGlhbCBpc3N1ZXMgd2l0aCBwb2ludGVyIGFyaXRobWV0aWMgb3IgYXJyYXkgaW5kZXhpbmcgaW50byB0aGUgc3RydWN0IG1ldGFkYXRhIHRhYmxlIHdvdWxkIGJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTi5cXG5cXG5UaGVyZWZvcmUsIHRoaXMgY2hhbmdlIGRvZXMgbm90IGludHJvZHVjZSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IG5lZWRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCB1cGRhdGVzIHRoZSBCVEYgdmVyaWZpZXIgdG8gdmFsaWRhdGUgb3duZXJzaGlwIGFjeWNsaWNpdHkgYW5kIGVuZm9yY2UgYSBtYXhpbXVtIG93bmVyc2hpcCBkZXB0aCAoQlRGX01BWF9PV05FUlNISVBfREVQVEgpIGFjcm9zcyBCUEYgZ3JhcGggcm9vdHMgYW5kIGxvY2FsIGtwdHJzLlxcblxcbk1lbW9yeSBzYWZldHkgYW5hbHlzaXM6XFxuMS4gVGhlIHRlbXBvcmFyeSBkZXB0aCBhcnJheSB1c2VkIGR1cmluZyBvd25lcnNoaXAgdHJhdmVyc2FsIGlzIGFsbG9jYXRlZCB2aWEga3ZjYWxsb2MoKSwgZW5zdXJpbmcgaXQgaXMgZnVsbHkgemVyby1pbml0aWFsaXplZC5cXG4yLiBBbGwgbG9jYWwgdmFyaWFibGVzIGluIGJ0Zl9vd25lcnNoaXBfZGVwdGgoKSwgYnRmX2NoZWNrX293bmVyc2hpcF9kZXB0aCgpLCBhbmQgYnRmX293bmVkX3R5cGVfaWR4KCkgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuXFxuMy4gTm8gZGF0YSBzdHJ1Y3R1cmVzIG9yIGJ1ZmZlcnMgYXJlIGNvcGllZCB0byB1c2VyIHNwYWNlLCBhbmQgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgcmVhZCBvciB1c2VkIGluIGNvbmRpdGlvbmFsIGJyYW5jaGluZy5cXG40LiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIHBvaW50ZXIgYXJpdGhtZXRpYyBvciBhcnJheSBpbmRleGluZyBpbnRvIHRoZSBzdHJ1Y3QgbWV0YWRhdGEgdGFibGUgd291bGQgYmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOLlxcblxcblRoZXJlZm9yZSwgdGhpcyBjaGFuZ2UgZG9lcyBub3QgaW50cm9kdWNlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgbmVlZGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflow8br8j[1] Phase: Succeeded StartedAt: 2026-09-06 12:29:42 +0000 UTC FinishedAt: 2026-09-06 12:29:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-06 12:29:42 +0000 UTC FinishedAt: 2026-09-06 12:29:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[2] Phase: Succeeded StartedAt: 2026-09-06 12:29:42 +0000 UTC FinishedAt: 2026-09-06 16:07:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-06 12:29:42 +0000 UTC FinishedAt: 2026-09-06 16:07:50 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-06 12:29:42 +0000 UTC FinishedAt: 2026-09-06 12:29:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-06 12:29:42 +0000 UTC FinishedAt: 2026-09-06 12:29:48 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow8br8j/series-workflow8br8j-convert-artifact-1285548201/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-06 12:29:52 +0000 UTC FinishedAt: 2026-09-06 12:46:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-06 12:29:52 +0000 UTC FinishedAt: 2026-09-06 12:46:32 +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:*261a2a3a-06b3-4e4f-8f5f-47538f52b433,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-workflow8br8j/series-workflow8br8j-convert-artifact-1285548201/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": "ad8b8b2b-0b6d-48b6-97cf-2ec3a00d747e", "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-workflow8br8j/series-workflow8br8j-build-action-1167479047/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-06 12:29:52 +0000 UTC FinishedAt: 2026-09-06 12:46:22 +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:*261a2a3a-06b3-4e4f-8f5f-47538f52b433,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-workflow8br8j/series-workflow8br8j-convert-artifact-1285548201/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": "ad8b8b2b-0b6d-48b6-97cf-2ec3a00d747e", "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-workflow8br8j/series-workflow8br8j-build-action-1167479047/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-06 12:46:32 +0000 UTC FinishedAt: 2026-09-06 12:46:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-06 12:46:32 +0000 UTC FinishedAt: 2026-09-06 12:46:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-06 12:46:32 +0000 UTC FinishedAt: 2026-09-06 12:46:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-06 12:46:32 +0000 UTC FinishedAt: 2026-09-06 12:46:36 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow8br8j/series-workflow8br8j-convert-artifact-2224954684/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-06 12:46:42 +0000 UTC FinishedAt: 2026-09-06 12:48:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-06 12:46:42 +0000 UTC FinishedAt: 2026-09-06 12:48:22 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*ad8b8b2b-0b6d-48b6-97cf-2ec3a00d747e,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-workflow8br8j/series-workflow8br8j-build-action-1167479047/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-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-06 12:48:32 +0000 UTC FinishedAt: 2026-09-06 12:48:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-06 12:48:32 +0000 UTC FinishedAt: 2026-09-06 12:48:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-06 12:48:32 +0000 UTC FinishedAt: 2026-09-06 13:04:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-06 12:48:32 +0000 UTC FinishedAt: 2026-09-06 13:04:32 +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:*261a2a3a-06b3-4e4f-8f5f-47538f52b433,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-workflow8br8j/series-workflow8br8j-convert-artifact-2224954684/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": "a63df3c1-51ef-4ab6-bc08-a039d0fa848d", "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-workflow8br8j/series-workflow8br8j-build-action-1418848152/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-06 12:48:32 +0000 UTC FinishedAt: 2026-09-06 13:04:22 +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:*261a2a3a-06b3-4e4f-8f5f-47538f52b433,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-workflow8br8j/series-workflow8br8j-convert-artifact-2224954684/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": "a63df3c1-51ef-4ab6-bc08-a039d0fa848d", "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-workflow8br8j/series-workflow8br8j-build-action-1418848152/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-06 13:04:32 +0000 UTC FinishedAt: 2026-09-06 13:04:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-06 13:04:32 +0000 UTC FinishedAt: 2026-09-06 13:04:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-06 13:04:32 +0000 UTC FinishedAt: 2026-09-06 13:06:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-06 13:04:32 +0000 UTC FinishedAt: 2026-09-06 13:06:20 +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:*a63df3c1-51ef-4ab6-bc08-a039d0fa848d,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-workflow8br8j/series-workflow8br8j-build-action-1418848152/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-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-06 13:06:29 +0000 UTC FinishedAt: 2026-09-06 16:07:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-06 13:06:29 +0000 UTC FinishedAt: 2026-09-06 16:07:50 +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-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"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:*ad8b8b2b-0b6d-48b6-97cf-2ec3a00d747e,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*a63df3c1-51ef-4ab6-bc08-a039d0fa848d,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-workflow8br8j/series-workflow8br8j-build-action-1167479047/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-workflow8br8j/series-workflow8br8j-build-action-1418848152/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-06 13:06:29 +0000 UTC FinishedAt: 2026-09-06 13:06:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-06 13:06:29 +0000 UTC FinishedAt: 2026-09-06 13:06:34 +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-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"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-workflow8br8j/series-workflow8br8j-convert-artifact-2602234117/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-06 13:06:29 +0000 UTC FinishedAt: 2026-09-06 13:06:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-06 13:06:29 +0000 UTC FinishedAt: 2026-09-06 13:06:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-06 13:06:29 +0000 UTC FinishedAt: 2026-09-06 13:06:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-06 13:06:39 +0000 UTC FinishedAt: 2026-09-06 16:07:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8br8j[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["btf_check_ownership_depth","btf_ownership_depth","btf_owned_type_idx","btf_check_and_fixup_fields","btf_parse"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"178ac02d-2978-4e9e-a971-b60726da3acb","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-06 13:06:39 +0000 UTC FinishedAt: 2026-09-06 16:07:40 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*ad8b8b2b-0b6d-48b6-97cf-2ec3a00d747e,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*a63df3c1-51ef-4ab6-bc08-a039d0fa848d,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-workflow8br8j/series-workflow8br8j-build-action-1167479047/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-workflow8br8j/series-workflow8br8j-build-action-1418848152/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-workflow8br8j/series-workflow8br8j-convert-artifact-2602234117/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,}