Name: series-workflowb7fjp Phase: Succeeded StartedAt: 2026-07-24 11:54:07 +0000 UTC FinishedAt: 2026-07-24 16:50:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[0] Phase: Succeeded StartedAt: 2026-07-24 11:54:07 +0000 UTC FinishedAt: 2026-07-24 12:17:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[0].run-triage Phase: Succeeded StartedAt: 2026-07-24 11:54:07 +0000 UTC FinishedAt: 2026-07-24 12:17:13 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "86f436567f2516a0083b210bedc933544826a2c3", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "PAGEALLOC_HOGGER" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "86f436567f2516a0083b210bedc933544826a2c3", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "PAGEALLOC_HOGGER" ], "series_id": "40d3dcc5-980e-4f8f-b6af-10f9e0689de3" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "req_page_alloc_write", "free_page_alloc_write", "make_alloc", "free_alloc_helper" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI0IDEyOjE2PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1BBR0VBTExPQ19IT0dHRVImIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtyZXFfcGFnZV9hbGxvY193cml0ZSYjMzQ7LAogICAgJiMzNDtmcmVlX3BhZ2VfYWxsb2Nfd3JpdGUmIzM0OywKICAgICYjMzQ7bWFrZV9hbGxvYyYjMzQ7LAogICAgJiMzNDtmcmVlX2FsbG9jX2hlbHBlciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGRlYnVnZnMgaW50ZXJmYWNlIGZvciBhbGxvY2F0aW5nIHBhZ2VzIGZyb20gc3BlY2lmaWMgbm9kZXMsIHpvbmVzLCBtaWdyYXRlIHR5cGVzLCBhbmQgb3JkZXJzLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCB0ZXN0aW5nL2RlYnVnZ2luZyB0b29sIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgbWVtb3J5IHByZXNzdXJlIGFuZCB0ZXN0IHRoZSBjb3JlIHBhZ2UgYWxsb2NhdG9yIGFuZCBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uIEZ1enppbmcgaXQgaXMgdmFsdWFibGUgdG8gdW5jb3ZlciBwb3RlbnRpYWwgYnVncyBpbiBtZW1vcnkgbWFuYWdlbWVudCBvciBPT00gaGFuZGxpbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjQgMTI6MTY8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA4YWI5MGI1NmY3MWJiMWQxMDcyNzc1N2I4ZjY5YzQ5MWVjODU3NmEwXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBKdWwgMjQgMTI6MTY6MTkgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vS2NvbmZpZy5kZWJ1ZyBiL21tL0tjb25maWcuZGVidWdcbmluZGV4IDc2MzhkNzViMjdkYjhjLi5jOGZjZWNkY2E2YWNhOSAxMDA2NDRcbi0tLSBhL21tL0tjb25maWcuZGVidWdcbiYjNDM7JiM0MzsmIzQzOyBiL21tL0tjb25maWcuZGVidWdcbkBAIC0zMDksMyAmIzQzOzMwOSwxNSBAQCBjb25maWcgUEVSX1ZNQV9MT0NLX1NUQVRTXG4gXHQgIG92ZXJoZWFkIGluIHRoZSBwYWdlIGZhdWx0IHBhdGguXG4gXG4gXHQgIElmIGluIGRvdWJ0LCBzYXkgTi5cbiYjNDM7XG4mIzQzO2NvbmZpZyBQQUdFQUxMT0NfSE9HR0VSXG4mIzQzO1x0Ym9vbCBcJiMzNDtBbGxvYyBwYWdlcyBmcm9tIGRpZmZlcmVudCBub2Rlcywgem9uZXMsIG1pZ3JhdGUgdHlwZXMgYW5kIG9yZGVyc1wmIzM0O1xuJiM0MztcdGRlcGVuZHMgb24gREVCVUdfRlNcbiYjNDM7XHRoZWxwXG4mIzQzO1x0ICBTYXkgWSB0byBhbGxvYyBwYWdlcyBmcm9tIGRpZmZlcmVudCBub2Rlcywgem9uZXMsIG1pZ3JhdGUgdHlwZSBhbmRcbiYjNDM7XHQgIG9yZGVycyB1c2luZyB0aGUgZGVidWcgZnMgZmlsZXN5c3RlbS4gVGhpcyBoZWxwcyB0byBnZW5lcmF0ZSBtZW1vcnlcbiYjNDM7XHQgIHByZXNzdXJlIGVhc2lseS4gVGhpcyBpcyB1c2VmdWwgdG8gZGVidWcgbWVtb3J5IHJlY2xhaW1zIGlzc3VlcyxcbiYjNDM7XHQgIE9PTSB0cmlnZ2VycywgcGFnZSBtaWdyYXRpb24gaXNzdWVzLCBldGMuXG4mIzQzO1xuJiM0MztcdCAgSWYgaW4gZG91YnQsIHNheSBOLlxuJiM0MztcbmRpZmYgLS1naXQgYS9tbS9NYWtlZmlsZSBiL21tL01ha2VmaWxlXG5pbmRleCAyZDA1NzBhMTZlNWJlYi4uYjQ4ZjJhYzZlZTgwODkgMTAwNjQ0XG4tLS0gYS9tbS9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvbW0vTWFrZWZpbGVcbkBAIC0xMzMsNiAmIzQzOzEzMyw3IEBAIG9iai0kKENPTkZJR19JRExFX1BBR0VfVFJBQ0tJTkcpICYjNDM7PSBwYWdlX2lkbGUub1xuIG9iai0kKENPTkZJR19ERUJVR19QQUdFQUxMT0MpICYjNDM7PSBkZWJ1Z19wYWdlX2FsbG9jLm9cbiBvYmotJChDT05GSUdfREVCVUdfUEFHRV9SRUYpICYjNDM7PSBkZWJ1Z19wYWdlX3JlZi5vXG4gb2JqLSQoQ09ORklHX0RBTU9OKSAmIzQzOz0gZGFtb24vXG4mIzQzO29iai0kKENPTkZJR19QQUdFQUxMT0NfSE9HR0VSKSAmIzQzOz0gcGFnZV9hbGxvY19ob2dnZXIub1xuIG9iai0kKENPTkZJR19IQVJERU5FRF9VU0VSQ09QWSkgJiM0Mzs9IHVzZXJjb3B5Lm9cbiBvYmotJChDT05GSUdfUEVSQ1BVX1NUQVRTKSAmIzQzOz0gcGVyY3B1LXN0YXRzLm9cbiBvYmotJChDT05GSUdfWk9ORV9ERVZJQ0UpICYjNDM7PSBtZW1yZW1hcC5vXG5kaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvY19ob2dnZXIuYyBiL21tL3BhZ2VfYWxsb2NfaG9nZ2VyLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uZjU1NGJiYjRhZmE3MzBcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL21tL3BhZ2VfYWxsb2NfaG9nZ2VyLmNcbkBAIC0wLDAgJiM0MzsxLDYxMSBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKlxuJiM0MzsgKiBQYWdlIGFsbG9jYXRvciBEZWJ1Z0ZTIEludGVyZmFjZVxuJiM0MzsgKiBBdXRob3I6IEp1YW4gWWVzY2FzIFx1MDAzY2p5ZXNjYXNAZ29vZ2xlLmNvbVx1MDAzZVxuJiM0MzsgKlxuJiM0MzsgKiBUaGlzIG1vZHVsZSBhbGxvd3MgdG8gbWFrZSBwYWdlIGFsbG9jcyBwZXIgbm9kZSwgem9uZSwgbWlncmF0ZSB0eXBlXG4mIzQzOyAqIGFuZCBvcmRlciB1c2luZyB0aGUgRGVidWdGUyBmaWxlc3lzdGVtLlxuJiM0MzsgKlxuJiM0MzsgKiBXaGVuIHRoaXMgbW9kdWxlIGlzIGluc3RhbGxlZCBhbmQgdGhlIGRlYnVnZnMgaXMgbW91bnRlZCwgdGhlIFwmIzM0O21tXCYjMzQ7IGRpcmVjdG9yeVxuJiM0MzsgXCYjMzQ7IHdpbGwgYmUgY3JlYXRlZCBpbiBcdTAwM2NkZWJ1Z2ZzIG1vdW50IHBvaW50XHUwMDNlL21tXCYjMzQ7IGRpcmVjdG9yeS4gVW5kZXIgdGhpcyBkaXJlY3RvcnksXG4mIzQzOyAqIHRoZXJlIHdpbGwgYmUgc3ViZGlycyB0byBzZWxlY3QgdGhlIG5vZGVzLCB6b25lcywgb3JkZXJzIGFuZCBtaWdyYXRlIHR5cGUuXG4mIzQzOyAqXG4mIzQzOyAqIEZvciBleGFtcGxlOlxuJiM0MzsgKlxuJiM0MzsgKiAgICAgIC9zeXMva2VybmVsL2RlYnVnL21tL1xuJiM0MzsgKiAgICAgIHwtLSBmcmVlXG4mIzQzOyAqICAgICAgYC0tIG5vZGUtMFxuJiM0MzsgKiAgICAgICAgIHwtLSB6b25lLURNQVxuJiM0MzsgKiAgICAgICAgIHwgICB8LS0gb3JkZXItMFxuJiM0MzsgKiAgICAgICAgIHwgICB8ICAgfC0tIG1pZ3JhdGUtSGlnaEF0b21pY1xuJiM0MzsgKiAgICAgICAgIHwgICB8ICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcbiYjNDM7ICogICAgICAgICB8ICAgfCAgIHwtLSBtaWdyYXRlLU1vdmFibGVcbiYjNDM7ICogICAgICAgICB8ICAgfCAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXG4mIzQzOyAqICAgICAgICAgfCAgIHwgICB8LS0gbWlncmF0ZS1SZWNsYWltYWJsZVxuJiM0MzsgKiAgICAgICAgIHwgICB8ICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcbiYjNDM7ICogICAgICAgICB8ICAgfCAgIGAtLSBtaWdyYXRlLVVubW92YWJsZVxuJiM0MzsgKiAgICAgICAgIHwgICB8ICAgICAgIGAtLSBucl9wYWdlc19hbGxvY3NcbiYjNDM7ICogICAgICAgICB8ICAgfC0tIC4uLlxuJiM0MzsgKiAgICAgICAgIHwgICB8XG4mIzQzOyAqICAgICAgICAgfCAgIGAtLSBvcmRlci05XG4mIzQzOyAqICAgICAgICAgfCAgICAgICB8LS0gbWlncmF0ZS1IaWdoQXRvbWljXG4mIzQzOyAqICAgICAgICAgfCAgICAgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuJiM0MzsgKiAgICAgICAgIHwgICAgICAgfC0tIG1pZ3JhdGUtTW92YWJsZVxuJiM0MzsgKiAgICAgICAgIHwgICAgICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcbiYjNDM7ICogICAgICAgICB8ICAgICAgIHwtLSBtaWdyYXRlLVJlY2xhaW1hYmxlXG4mIzQzOyAqICAgICAgICAgfCAgICAgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuJiM0MzsgKiAgICAgICAgIHwgICAgICAgYC0tIG1pZ3JhdGUtVW5tb3ZhYmxlXG4mIzQzOyAqICAgICAgICAgfCAgICAgICAgICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuJiM0MzsgKiAgICAgICAgIGAtLSB6b25lLU5vcm1hbFxuJiM0MzsgKiAgICAgICAgICAgICB8LS0gb3JkZXItMFxuJiM0MzsgKiAgICAgICAgICAgICB8ICAgfC0tIG1pZ3JhdGUtSGlnaEF0b21pY1xuJiM0MzsgKiAgICAgICAgICAgICB8ICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcbiYjNDM7ICogICAgICAgICAgICAgfCAgIHwtLSBtaWdyYXRlLU1vdmFibGVcbiYjNDM7ICogICAgICAgICAgICAgfCAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXG4mIzQzOyAqICAgICAgICAgICAgIHwgICB8LS0gbWlncmF0ZS1SZWNsYWltYWJsZVxuJiM0MzsgKiAgICAgICAgICAgICB8ICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcbiYjNDM7ICogICAgICAgICAgICAgfCAgIGAtLSBtaWdyYXRlLVVubW92YWJsZVxuJiM0MzsgKiAgICAgICAgICAgICB8ICAgICAgIGAtLSBucl9wYWdlc19hbGxvY3NcbiYjNDM7ICogICAgICAgICAgICAgfC0tIC4uLi5cbiYjNDM7ICogICAgICAgICAgICAgfFxuJiM0MzsgKiAgICAgICAgICAgICBgLS0gb3JkZXItOVxuJiM0MzsgKiAgICAgICAgICAgICAgICAgfC0tIG1pZ3JhdGUtSGlnaEF0b21pY1xuJiM0MzsgKiAgICAgICAgICAgICAgICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcbiYjNDM7ICogICAgICAgICAgICAgICAgIHwtLSBtaWdyYXRlLU1vdmFibGVcbiYjNDM7ICogICAgICAgICAgICAgICAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXG4mIzQzOyAqICAgICAgICAgICAgICAgICB8LS0gbWlncmF0ZS1SZWNsYWltYWJsZVxuJiM0MzsgKiAgICAgICAgICAgICAgICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcbiYjNDM7ICogICAgICAgICAgICAgICAgIGAtLSBtaWdyYXRlLVVubW92YWJsZVxuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgIGAtLSBucl9wYWdlc19hbGxvY3NcbiYjNDM7ICpcbiYjNDM7ICogVXNhZ2U6XG4mIzQzOyAqXG4mIzQzOyAqIDEuIFRvIHRyaWdnZXIgdGhlIGFsbG9jYXRpb24sIG5hdmlnYXRlIHRvIHRoZSBkZWJ1Z2ZzIHBhdGggY29ycmVzcG9uZGluZ1xuJiM0MzsgKiAgICB0byB5b3VyIHRhcmdldCBub2RlLCBtZW1vcnkgem9uZSwgYWxsb2NhdGlvbiBvcmRlciwgYW5kIG1pZ3JhdGlvbiB0eXBlLFxuJiM0MzsgKiAgICB0aGVuIHdyaXRlIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvbiBjb3VudCB0byBucl9wYWdlc19hbGxvY3MuXG4mIzQzOyAqXG4mIzQzOyAqICAgIEZvciBleGFtcGxlLCB0byBtYWtlIDMgYWxsb2NzIG9mIG9yZGVyIDksIE1pZ3JhdGUgVHlwZSBNb3ZhYmxlLFxuJiM0MzsgKiAgICBab25lIE5vcm1hbCBhbmQgTm9kZSAwLCBydW46XG4mIzQzOyAqXG4mIzQzOyAqICAgICQgZWNobyAzIFx1MDAzZSAvc3lzL2tlcm5lbC9kZWJ1Zy9tbS9ub2RlLTAvem9uZS1Ob3JtYWwvb3JkZXItOS9taWdyYXRlLU1vdmFibGUvbnJfcGFnZXNfYWxsb2NzXG4mIzQzOyAqXG4mIzQzOyAqIDIuIEZvciBlYWNoIGFsbG9jYXRpb24gY3JlYXRlZCwgYSBjb3JyZXNwb25kaW5nIGZpbGUgbmFtZWQgc2VxdWVudGlhbGx5XG4mIzQzOyAqICAgICgxLCAyLCBuKSB3aWxsIGFwcGVhciBpbiB0aGF0IGRpcmVjdG9yeS5cbiYjNDM7ICpcbiYjNDM7ICogICAgJCBscyAvc3lzL2tlcm5lbC9kZWJ1Zy9tbS9ub2RlLTAvem9uZS1Ob3JtYWwvb3JkZXItOS9taWdyYXRlLU1vdmFibGUvXG4mIzQzOyAqICAgIDEgICAyICAgMyAgbnJfcGFnZXNfYWxsb2NzXG4mIzQzOyAqXG4mIzQzOyAqIDMuIFRvIGZyZWUgdGhlIGFsbG9jYXRpb24sIHdyaXRlIHRoZSBhbGxvY2F0aW9uIGZpbGUgbmFtZSBpbiAvc3lzL2tlcm5lbC9kZWJ1Zy9tbS9mcmVlLlxuJiM0MzsgKiAgICBGb3IgZXhhbXBsZSwgdG8gcmVsZWFzZSB0aGUgMm5kIGFsbG9jYXRpb24gcnVuOlxuJiM0MzsgKlxuJiM0MzsgKiAgICAkIGVjaG8gMiBcdTAwM2UgL3N5cy9rZXJuZWwvZGVidWcvbW0vZnJlZVxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgXCYjMzQ7OiBcJiMzNDsgZm10XG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9hdG9taWMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9lcnJuby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2RlYnVnZnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9nZnAuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9nZnBfdHlwZXMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9oaWdobWVtLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgva2VybmVsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbW16b25lLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbW9kdWxlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbm9kZW1hc2suaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9wcmludGsuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgveGFycmF5LmhcdTAwM2VcbiYjNDM7XG4mIzQzO3N0cnVjdCBkZW50cnkgKm1tZGlyO1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGF0b21pY19sb25nX3QgYWxsb2NzX2ZpbGVfc2VxIC0gUmVwcmVzZW50cyB0aGUgbmFtaW5nIHNlcXVlbmNlIHVzZWQgZm9yXG4mIzQzOyAqIGFsbG9jYXRpb24gZmlsZXMuXG4mIzQzOyAqL1xuJiM0MzthdG9taWNfbG9uZ190IGFsbG9jc19maWxlX3NlcSA9IEFUT01JQ19JTklUKDApO1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGFsbG9jc194YSAtIFJlcHJlc2VudCB0aGUgeGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGFjdHVhbCBhbGxvY2F0aW9ucyBwZXJmb3JtXG4mIzQzOyAqIGJ5IHRoaXMgZHJpdmVyLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIERFRklORV9YQVJSQVkoYWxsb2NzX3hhKTtcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBzdHJ1Y3QgcmVxX2FsbG9jIC0gUmVwcmVzZW50cyB0aGUgcmVxdWVzdGVkIGFsbG9jYXRpb25cbiYjNDM7ICogQG5vZGVfaWR4OiBUaGUgTm9kZSBpbmRleCB0byBhbGxvY2F0ZSBmcm9tLlxuJiM0MzsgKiBAem9uZV9pZHg6IFRoZSBab25lIGluZGV4IHRvIGFsbG9jYXRlIGZyb20uXG4mIzQzOyAqIEBvcmRlcjogVGhlIE9yZGVyIG9mIHBhZ2VzIHRvIGFsbG9jYXRlLlxuJiM0MzsgKiBAbWlncmF0ZV90eXBlOiBUaGUgTWlncmF0ZSB0eXBlIHRvIGFsbG9jYXRlIGZyb20uXG4mIzQzOyAqIEBwYXJlbnRkaXI6IFRoZSBwYXJlbnQgZGlyIHdoZXJlIHRoZSBmaWxlIHJlcHJlc2VudGluZyB0aGUgYWxsb2Mgd2FzIGNyZWF0ZWQuXG4mIzQzOyAqL1xuJiM0MztzdHJ1Y3QgcmVxX2FsbG9jIHtcbiYjNDM7XHRpbnQgbm9kZV9pZHg7XG4mIzQzO1x0aW50IHpvbmVfaWR4O1xuJiM0MztcdGludCBvcmRlcjtcbiYjNDM7XHRpbnQgbWlncmF0ZV90eXBlO1xuJiM0MztcdHN0cnVjdCBkZW50cnkgKnBhcmVudGRpcjtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIHN0cnVjdCBwYWdlX2FsbG9jIC0gUmVwcmVzZW50cyB0aGUgcGFnZSBhbGxvY2F0aW9uLlxuJiM0MzsgKiBAcGFnZTogVGhlIHBvaW50ZXIgdG8gdGhlIHBhZ2UocykgYWxsb2NhdGVkLlxuJiM0MzsgKiBAcmVxX2FsbG9jOiBUaGUgZGV0YWlscyBvZiB0aGUgYWxsb2NhdGlvbi5cbiYjNDM7ICogQGFsbG9jX2RlbnRyeTogVGhlIHBvaW50ZXIgdG8gdGhlIGZpbGUgdGhhdCByZXByZXNlbnRzIHRoZSBhbGxvY2F0aW9uLlxuJiM0MzsgKi9cbiYjNDM7c3RydWN0IHBhZ2VfYWxsb2Mge1xuJiM0MztcdHN0cnVjdCBwYWdlICpwYWdlO1xuJiM0MztcdHN0cnVjdCByZXFfYWxsb2MgKnJlcV9hbGxvYztcbiYjNDM7XHRzdHJ1Y3QgZGVudHJ5ICphbGxvY19kZW50cnk7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3Qga21lbV9jYWNoZSAqcmVxX2FsbG9jX2NhY2hlO1xuJiM0MztzdHJ1Y3Qga21lbV9jYWNoZSAqcGFnZV9hbGxvY19jYWNoZTtcbiYjNDM7XG4mIzQzO2lubGluZSB2b2lkIHNldF96b25lX3RvX2FsbG9jX2Zyb20oaW50IHpvbmVfaWR4LCBnZnBfdCAqZmxhZ3NfcHRyKVxuJiM0Mzt7XG4mIzQzO1x0c3dpdGNoICh6b25lX2lkeCkge1xuJiM0MzsjaWZkZWYgQ09ORklHX1pPTkVfRE1BXG4mIzQzO1x0Y2FzZSBaT05FX0RNQTpcbiYjNDM7XHRcdCpmbGFnc19wdHIgfD0gX19HRlBfRE1BO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzOyNlbmRpZlxuJiM0MzsjaWZkZWYgQ09ORklHX1pPTkVfRE1BMzJcbiYjNDM7XHRjYXNlIFpPTkVfRE1BMzI6XG4mIzQzO1x0XHQqZmxhZ3NfcHRyIHw9IF9fR0ZQX0RNQTMyO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzOyNlbmRpZlxuJiM0MzsjaWZkZWYgQ09ORklHX0hJR0hNRU1cbiYjNDM7XHRjYXNlIFpPTkVfSElHSE1FTTpcbiYjNDM7XHRcdCpmbGFnc19wdHIgfD0gX19HRlBfSElHSE1FTTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MzsjZW5kaWZcbiYjNDM7XHRjYXNlIFpPTkVfTU9WQUJMRTpcbiYjNDM7XHRcdCpmbGFnc19wdHIgfD0gX19HRlBfTU9WQUJMRTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGNhc2UgWk9ORV9OT1JNQUw6XG4mIzQzO1x0ZGVmYXVsdDpcbiYjNDM7XHRcdCpmbGFnc19wdHIgfD0gMDtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7aW5saW5lIHZvaWQgc2V0X21pZ3JhdGVfdHlwZV90b19hbGxvY19mcm9tKGludCBtaWdyYXRlX3R5cGUsIGdmcF90ICpmbGFnc19wdHIpXG4mIzQzO3tcbiYjNDM7XHRzd2l0Y2ggKG1pZ3JhdGVfdHlwZSkge1xuJiM0MztcdGNhc2UgTUlHUkFURV9VTk1PVkFCTEU6XG4mIzQzO1x0XHQqZmxhZ3NfcHRyIFx1MDAyNj0gfihfX0dGUF9SRUNMQUlNQUJMRSB8IF9fR0ZQX01PVkFCTEUpO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBNSUdSQVRFX1JFQ0xBSU1BQkxFOlxuJiM0MztcdFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9SRUNMQUlNQUJMRTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGNhc2UgTUlHUkFURV9ISUdIQVRPTUlDOlxuJiM0MztcdFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9ISUdIO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBNSUdSQVRFX01PVkFCTEU6IGRlZmF1bHQ6XG4mIzQzO1x0XHQqZmxhZ3NfcHRyIHw9IF9fR0ZQX01PVkFCTEU7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBzc2l6ZV90IHBhZ2VfYWxsb2NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVidWYsXG4mIzQzO1x0XHRcdFx0ICAgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcylcbiYjNDM7e1xuJiM0MztcdC8qICBXaGljaCBpbmZvcm1hdGlvbiBzaG91bGQgYmUgcHJpbnQgYWJvdXQgdGhlIHBhZ2Ugb3IgYWxsb2NhdGlvbj8gKi9cbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcGFnZV9hbGxvY19mb3BzID0ge1xuJiM0MztcdC5vd25lciA9IFRISVNfTU9EVUxFLFxuJiM0MztcdC5vcGVuID0gc2ltcGxlX29wZW4sXG4mIzQzO1x0LnJlYWQgPSBwYWdlX2FsbG9jX3JlYWQsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IG1ha2VfYWxsb2Moc3RydWN0IHJlcV9hbGxvYyAqcmVxLFxuJiM0MztcdFx0XHQgICAgZ2ZwX3QgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKmFsbG9jX2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHBhZ2VfYWxsb2MgKnBhO1xuJiM0MztcdHN0cnVjdCBwYWdlICpwYWdlO1xuJiM0MztcdGNoYXIgbmV3X2FsbG9jX25hbWVbMTJdO1xuJiM0MztcdHN0cnVjdCBkZW50cnkgKm5ld19hbGxvY19kZW50cnk7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0cGFnZSA9IGFsbG9jX3BhZ2VzX25vZGVfbm9wcm9mKHJlcS1cdTAwM2Vub2RlX2lkeCwgZmxhZ3MsIHJlcS1cdTAwM2VvcmRlcik7XG4mIzQzO1x0aWYgKHBhZ2UpIHtcbiYjNDM7XHRcdHBhID0ga21lbV9jYWNoZV9hbGxvYyhwYWdlX2FsbG9jX2NhY2hlLCBHRlBfS0VSTkVMKTtcbiYjNDM7XHRcdGlmICghcGEpIHtcbiYjNDM7XHRcdFx0cmV0ID0gLUVOT01FTTtcbiYjNDM7XHRcdFx0Z290byBmcmVlX3BhZ2VzO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdCphbGxvY19pZCA9IGF0b21pY19sb25nX2luY19yZXR1cm4oXHUwMDI2YWxsb2NzX2ZpbGVfc2VxKTtcbiYjNDM7XHRcdHJldCA9IHhhX2luc2VydChcdTAwMjZhbGxvY3NfeGEsICphbGxvY19pZCwgcGEsIEdGUF9LRVJORUwpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0Z290byBmcmVlX3BhZ2VfYWxsb2M7XG4mIzQzO1xuJiM0MztcdFx0c25wcmludGYobmV3X2FsbG9jX25hbWUsIHNpemVvZihuZXdfYWxsb2NfbmFtZSksIFwmIzM0OyVsdVwmIzM0OyxcbiYjNDM7XHRcdFx0ICphbGxvY19pZCk7XG4mIzQzO1xuJiM0MztcdFx0bmV3X2FsbG9jX2RlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoXG4mIzQzO1x0XHRcdG5ld19hbGxvY19uYW1lLCAwNjQ0LCByZXEtXHUwMDNlcGFyZW50ZGlyLFxuJiM0MztcdFx0XHRwYSwgXHUwMDI2cGFnZV9hbGxvY19mb3BzKTtcbiYjNDM7XHRcdGlmIChJU19FUlIobmV3X2FsbG9jX2RlbnRyeSkpIHtcbiYjNDM7XHRcdFx0cmV0ID0gUFRSX0VSUihuZXdfYWxsb2NfZGVudHJ5KTtcbiYjNDM7XHRcdFx0Z290byBlcmFzZV94YV9lbnRyeTtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRwYS1cdTAwM2VyZXFfYWxsb2MgPSByZXE7XG4mIzQzO1x0XHRwYS1cdTAwM2VwYWdlID0gcGFnZTtcbiYjNDM7XHRcdHBhLVx1MDAzZWFsbG9jX2RlbnRyeSA9IG5ld19hbGxvY19kZW50cnk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztlcmFzZV94YV9lbnRyeTpcbiYjNDM7XHR4YV9lcmFzZShcdTAwMjZhbGxvY3NfeGEsICphbGxvY19pZCk7XG4mIzQzO1xuJiM0MztmcmVlX3BhZ2VfYWxsb2M6XG4mIzQzO1x0a21lbV9jYWNoZV9mcmVlKHBhZ2VfYWxsb2NfY2FjaGUsIHBhKTtcbiYjNDM7XG4mIzQzO2ZyZWVfcGFnZXM6XG4mIzQzO1x0X19mcmVlX3BhZ2VzKHBhZ2UsIHBhLVx1MDAzZXJlcV9hbGxvYy1cdTAwM2VvcmRlcik7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZnJlZV9hbGxvY19oZWxwZXIodW5zaWduZWQgbG9uZyBhbGxvY19pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBwYWdlX2FsbG9jICpwYTtcbiYjNDM7XG4mIzQzO1x0cGEgPSB4YV9lcmFzZShcdTAwMjZhbGxvY3NfeGEsIGFsbG9jX2lkKTtcbiYjNDM7XHRpZiAoIXBhKSB7XG4mIzQzO1x0XHRwcl9lcnIoXCYjMzQ7VGhlIGFsbG9jX2lkICVsdSB3YXMgbm90IGZvdW5kIVwmIzM0OywgYWxsb2NfaWQpO1xuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRfX2ZyZWVfcGFnZXMocGEtXHUwMDNlcGFnZSwgcGEtXHUwMDNlcmVxX2FsbG9jLVx1MDAzZW9yZGVyKTtcbiYjNDM7XHRkZWJ1Z2ZzX3JlbW92ZShwYS1cdTAwM2VhbGxvY19kZW50cnkpO1xuJiM0MztcdGttZW1fY2FjaGVfZnJlZShwYWdlX2FsbG9jX2NhY2hlLCBwYSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcmVxX3BhZ2VfYWxsb2Nfd3JpdGUoKSAtIEFsbG9jYXRlcyB0aGUgcGFnZXMgb24gdGhlIHJlcXVlc3RlZCBub2RlLCB6b25lLFxuJiM0MzsgKiBvcmRlciBhbmQgbWlncmF0ZSB0eXBlLiBPbmNlIHRoZSBhbGxvY2F0aW9uIGlzIHBlcmZvcm1lZCwgYSBmaWxlIGlzIGNyZWF0ZWRcbiYjNDM7ICogdG8gZnJlZSB0aGUgYWxsb2NhdGlvbiBsYXRlci5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBzc2l6ZV90IHJlcV9wYWdlX2FsbG9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdWJ1ZixcbiYjNDM7XHRcdFx0XHQgICAgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCByZXFfYWxsb2MgKnJlcSA9IGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgYWxsb2NfaWQ7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBucl9wYWdlc19hbGxvY3M7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyAqYWxsb2NzX2lkcztcbiYjNDM7XHRnZnBfdCBmbGFncyA9IDA7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0ga3N0cnRvdWxfZnJvbV91c2VyKHVidWYsIGNudCwgMTAsIFx1MDAyNm5yX3BhZ2VzX2FsbG9jcyk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdGFsbG9jc19pZHMgPSBrbWFsbG9jX2FycmF5KG5yX3BhZ2VzX2FsbG9jcywgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLFxuJiM0MztcdFx0XHRcdFx0R0ZQX0tFUk5FTCk7XG4mIzQzO1x0aWYgKCFhbGxvY3NfaWRzKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdHNldF96b25lX3RvX2FsbG9jX2Zyb20ocmVxLVx1MDAzZXpvbmVfaWR4LCBcdTAwMjZmbGFncyk7XG4mIzQzO1x0c2V0X21pZ3JhdGVfdHlwZV90b19hbGxvY19mcm9tKHJlcS1cdTAwM2VtaWdyYXRlX3R5cGUsIFx1MDAyNmZsYWdzKTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfcGFnZXNfYWxsb2NzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0cmV0ID0gbWFrZV9hbGxvYyhyZXEsIGZsYWdzLCBcdTAwMjZhbGxvY19pZCk7XG4mIzQzO1x0XHRpZiAocmV0KVxuJiM0MztcdFx0XHRnb3RvIGZyZWVfYWxsb2NzO1xuJiM0MztcbiYjNDM7XHRcdGFsbG9jc19pZHNbaV0gPSBhbGxvY19pZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGtmcmVlKGFsbG9jc19pZHMpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gY250O1xuJiM0MztcbiYjNDM7ZnJlZV9hbGxvY3M6XG4mIzQzO1x0LyogRnJlZSBhbGwgdGhlIHBhZ2VzIHByZXZpb3VzbHkgYWxsb2NhdGVkLiAqL1xuJiM0MztcdGZvciAoaW50IGogPSAwOyBqIFx1MDAzYyBpOyBqJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aW50IHJldDIgPSBmcmVlX2FsbG9jX2hlbHBlcihhbGxvY3NfaWRzW2pdKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAocmV0MilcbiYjNDM7XHRcdFx0cHJfZXJyKFwmIzM0O1VuYWJsZSB0byBmcmVlIHBhZ2VzIGFzc29jaWF0ZWQgd2l0aCBmaWxlICVsdVwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgIGFsbG9jc19pZHNbal0pO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0a2ZyZWUoYWxsb2NzX2lkcyk7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlcV9wYWdlX2FsbG9jX2ZvcHMgPSB7XG4mIzQzO1x0Lm93bmVyID0gVEhJU19NT0RVTEUsXG4mIzQzO1x0Lm9wZW4gPSBzaW1wbGVfb3BlbixcbiYjNDM7XHQud3JpdGUgPSByZXFfcGFnZV9hbGxvY193cml0ZSxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBmcmVlX3BhZ2VfYWxsb2Nfd3JpdGUoKSAtIGZyZWUgdGhlIHByZXZpb3VzbHkgYWxsb2NhdGVkIHBhZ2VzLlxuJiM0MzsgKiBAZmlsZTogRmlsZSB3aGVyZSB0aGUgdXNlciBpcyB3cml0aW5nLlxuJiM0MzsgKiBAdWJ1ZjogQ29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhlIHVzZXIgd2FudHMgdG8gZGVsZXRlIGFuZCBoYXZlIHRoZVxuJiM0MzsgKiAgICAgICBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZmlsZSBmcmVlZC5cbiYjNDM7ICogQGNudDogU2l6ZSBvZiBAdWJ1Zi5cbiYjNDM7ICogQHBwb3M6IEN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGZpbGUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgc3NpemVfdCBmcmVlX3BhZ2VfYWxsb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsXG4mIzQzO1x0XHRcdFx0ICAgICAgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsIHNpemVfdCBjbnQsXG4mIzQzO1x0XHRcdFx0ICAgICAgbG9mZl90ICpwcG9zKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGFsbG9jX2lkO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBrc3RydG91bF9mcm9tX3VzZXIodWJ1ZiwgY250LCAxMCwgXHUwMDI2YWxsb2NfaWQpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBmcmVlX2FsbG9jX2hlbHBlcihhbGxvY19pZCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldHVybiBjbnQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZyZWVfcGFnZV9hbGxvY19mb3BzID0ge1xuJiM0MztcdC5vd25lciA9IFRISVNfTU9EVUxFLFxuJiM0MztcdC53cml0ZSA9IGZyZWVfcGFnZV9hbGxvY193cml0ZSxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBjcmVhdGVfbnJfcGFnZXNfYWxsb2NzX2ZpbGUoKSAtIENyZWF0ZXMgdGhlIGZpbGUgXCYjMzQ7bnJfcGFnZXNfYWxsb2NzXCYjMzQ7LlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgXCYjMzQ7bnJfcGFnZXNfYWxsb2NzXCYjMzQ7IGZpbGUgd2lsbCBiZSB1c2VkIHRvIHdyaXRlIHRoZSBudW1iZXIgb2YgYWxsb2NhdGlvbnNcbiYjNDM7ICogdGhhdCB3aWxsIGJlIHBlcmZvcm1lZC4gV2hlbiB0aGUgYWxsb2NhdGlvbnMgYXJlIHBlcmZvcm1lZCwgYSBuZXcgZmlsZSBmb3JcbiYjNDM7ICogZWFjaCBhbGxvY2F0aW9uIHdpbGwgYmUgY3JlYXRlZCBpbiBAbWlncmF0ZWRpci5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IGNyZWF0ZV9ucl9wYWdlc19hbGxvY3NfZmlsZShzdHJ1Y3QgZGVudHJ5ICptaWdyYXRlZGlyLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgaW50IG5vZGVfaWR4LCBpbnQgem9uZV9pZHgsXG4mIzQzO1x0XHRcdFx0XHQgICAgICBpbnQgb3JkZXIsIGludCBtdHlwZSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCByZXFfYWxsb2MgKnJlcTtcbiYjNDM7XHRzdHJ1Y3QgZGVudHJ5ICpucl9wYWdlcztcbiYjNDM7XG4mIzQzO1x0cmVxID0ga21lbV9jYWNoZV9hbGxvYyhyZXFfYWxsb2NfY2FjaGUsIEdGUF9LRVJORUwpO1xuJiM0MztcdGlmICghcmVxKSB7XG4mIzQzO1x0XHRwcl9lcnIoXCYjMzQ7RmFpbGVkIHRvIGNyZWF0ZSBucl9wYWdlc19hbGxvY3NfaW5mb1wmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJlcS1cdTAwM2Vub2RlX2lkeCA9IG5vZGVfaWR4O1xuJiM0MztcdHJlcS1cdTAwM2V6b25lX2lkeCA9IHpvbmVfaWR4O1xuJiM0MztcdHJlcS1cdTAwM2VvcmRlciA9IG9yZGVyO1xuJiM0MztcdHJlcS1cdTAwM2VtaWdyYXRlX3R5cGUgPSBtdHlwZTtcbiYjNDM7XHRyZXEtXHUwMDNlcGFyZW50ZGlyID0gbWlncmF0ZWRpcjtcbiYjNDM7XG4mIzQzO1x0bnJfcGFnZXMgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKFwmIzM0O25yX3BhZ2VzX2FsbG9jc1wmIzM0OywgMDY0NCwgbWlncmF0ZWRpciwgcmVxLFxuJiM0MztcdFx0XHRcdCAgICAgICBcdTAwMjZyZXFfcGFnZV9hbGxvY19mb3BzKTtcbiYjNDM7XHRpZiAoSVNfRVJSKG5yX3BhZ2VzKSlcbiYjNDM7XHRcdHJldHVybiBQVFJfRVJSKG5yX3BhZ2VzKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBjcmVhdGVfbWlncmF0ZV90eXBlX3N1YmRpcnMoKSAtIENyZWF0ZXMgYSBkaXJlY3RvcnkgZm9yIGVhY2ggbWlncmF0ZSB0eXBlXG4mIzQzOyAqIGluc2lkZSB0aGUgb3JkZXIgZGlyZWN0b3J5LiBPbmNlIHRoZSBtaWdyYXRlIHR5cGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQsIGl0XG4mIzQzOyAqIGNyZWF0ZXMgdGhlIFwmIzM0O25yX2FsbG9jc1wmIzM0OyBmaWxlIGFuZCB0aGUgXCYjMzQ7ZnJlZVwmIzM0OyBmaWxlLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBpbnQgY3JlYXRlX21pZ3JhdGVfdHlwZV9zdWJkaXJzKHN0cnVjdCBkZW50cnkgKm9yZGVyZGlyLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgaW50IG5vZGVfaWR4LCBpbnQgem9uZV9pZHgsXG4mIzQzO1x0XHRcdFx0XHQgICAgICBpbnQgb3JkZXIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZGVudHJ5ICptaWdyYXRlZGlyO1xuJiM0MztcdGNoYXIgZGlybmFtZVsyNF07XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpbnQgbXR5cGUgPSAwOyBtdHlwZSBcdTAwM2MgTUlHUkFURV9UWVBFUzsgbXR5cGUmIzQzOyYjNDM7KSB7XG4mIzQzOyNpZmRlZiBDT05GSUdfQ01BXG4mIzQzO1x0XHRpZiAobXR5cGUgPT0gTUlHUkFURV9DTUEpIC8qIENNQSBhbGxvY3MgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0Ki9cbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzOyNlbmRpZlxuJiM0MzsjaWZkZWYgQ09ORklHX01FTU9SWV9JU09MQVRJT05cbiYjNDM7XHRcdGlmIChtdHlwZSA9PSBNSUdSQVRFX0lTT0xBVEUpIC8qIGNhbiYjMzk7dCBhbGxvY2F0ZSBmcm9tIGhlcmUgKi9cbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzOyNlbmRpZlxuJiM0MztcdFx0c25wcmludGYoZGlybmFtZSwgc2l6ZW9mKGRpcm5hbWUpLCBcJiMzNDttaWdyYXRlLSVzXCYjMzQ7LFxuJiM0MztcdFx0XHQgbWlncmF0ZXR5cGVfbmFtZXNbbXR5cGVdKTtcbiYjNDM7XHRcdG1pZ3JhdGVkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoZGlybmFtZSwgb3JkZXJkaXIpO1xuJiM0MztcdFx0aWYgKElTX0VSUihtaWdyYXRlZGlyKSlcbiYjNDM7XHRcdFx0cmV0dXJuIFBUUl9FUlIobWlncmF0ZWRpcik7XG4mIzQzO1xuJiM0MztcdFx0cmV0ID0gY3JlYXRlX25yX3BhZ2VzX2FsbG9jc19maWxlKG1pZ3JhdGVkaXIsIG5vZGVfaWR4LFxuJiM0MztcdFx0XHRcdFx0XHQgIHpvbmVfaWR4LCBvcmRlciwgbXR5cGUpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogY3JlYXRlX3BhZ2Vfb3JkZXJzX3N1YmRpcnMoKSAtIENyZWF0ZXMgYSBkaXJlY3RvcnkgZm9yIGVhY2ggcGFnZSBvcmRlciBpbnNpZGVcbiYjNDM7ICogdGhlIHpvbmUgZGlyZWN0b3J5LiBPbmNlIHRoYXQgdGhlIHBhZ2Ugb3JkZXIgZGlyZWN0b3J5IGlzIGNyZWF0ZWQsIGl0IGNyZWF0ZXNcbiYjNDM7ICogYSBkaXJlY3RvcnkgZm9yIGVhY2ggbWlncmF0ZSB0eXBlLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBpbnQgY3JlYXRlX3BhZ2Vfb3JkZXJzX3N1YmRpcnMoc3RydWN0IGRlbnRyeSAqem9uZWRpcixcbiYjNDM7XHRcdFx0XHRcdCAgICAgaW50IG5vZGVfaWR4LCBpbnQgem9uZV9pZHgsXG4mIzQzO1x0XHRcdFx0XHQgICAgIHN0cnVjdCB6b25lICp6b25lKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGRlbnRyeSAqb3JkZXJkaXI7XG4mIzQzO1x0Y2hhciBkaXJuYW1lWzEyXTtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRmb3IgKGludCBvcmRlciA9IDA7IG9yZGVyIFx1MDAzYyBOUl9QQUdFX09SREVSUzsgb3JkZXImIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRzbnByaW50ZihkaXJuYW1lLCBzaXplb2YoZGlybmFtZSksIFwmIzM0O29yZGVyLSVkXCYjMzQ7LCBvcmRlcik7XG4mIzQzO1x0XHRvcmRlcmRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihkaXJuYW1lLCB6b25lZGlyKTtcbiYjNDM7XHRcdGlmIChJU19FUlIob3JkZXJkaXIpKVxuJiM0MztcdFx0XHRyZXR1cm4gUFRSX0VSUihvcmRlcmRpcik7XG4mIzQzO1xuJiM0MztcdFx0cmV0ID0gY3JlYXRlX21pZ3JhdGVfdHlwZV9zdWJkaXJzKG9yZGVyZGlyLCBub2RlX2lkeCwgem9uZV9pZHgsXG4mIzQzO1x0XHRcdFx0XHRcdCAgb3JkZXIpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogY3JlYXRlX3pvbmVzX3N1YmRpcnMoKSAtIENyZWF0ZXMgYSBkaXJlY3RvcnkgZm9yIGVhY2ggcG9wdWxhdGVkIHpvbmUgaW4gdGhlXG4mIzQzOyAqIG5vZGUuIE9uY2UgdGhhdCB0aGUgem9uZSBkaXJlY3RvcnkgaXMgY3JlYXRlZCwgaXQgY3JlYXRlcyBhIGRpcmVjdG9yeSBmb3JcbiYjNDM7ICogZWFjaCBvcmRlciBzdXBwb3J0ZWQuXG4mIzQzOyAqXG4mIzQzOyAqIE5vdGU6IFpPTkVfREVWSUNFIHBhZ2VzIHdvbiYjMzk7dCBiZSBhbGxvY2F0ZWQgdXNpbmcgdGhpcyBkcml2ZXIuIFRoZSBtYWluIHJlYXNvblxuJiM0MzsgKiBpcyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBtYW5hZ2VkIGJ5IHRoZSBCdWRkeSBBbGxvY2F0b3Igb3IgQ01BIGFsbG9jYXRvci5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IGNyZWF0ZV96b25lc19zdWJkaXJzKHN0cnVjdCBkZW50cnkgKm5vZGVkaXIsIGludCBub2RlX2lkeCxcbiYjNDM7XHRcdFx0XHQgICAgICAgc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdGEpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZGVudHJ5ICp6b25lZGlyO1xuJiM0MztcdHN0cnVjdCB6b25lICp6b25lO1xuJiM0MztcdHN0cnVjdCB6b25lICpub2RlX3pvbmVzID0gcGdkYXRhLVx1MDAzZW5vZGVfem9uZXM7XG4mIzQzO1x0aW50IHpvbmVfaWR4O1xuJiM0MztcdGNoYXIgZGlybmFtZVsyNF07XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0Zm9yICh6b25lID0gbm9kZV96b25lcywgem9uZV9pZHggPSAwOyB6b25lIC0gbm9kZV96b25lcyBcdTAwM2MgTUFYX05SX1pPTkVTO1xuJiM0MztcdCAgICAgJiM0MzsmIzQzO3pvbmUsICYjNDM7JiM0Mzt6b25lX2lkeCkge1xuJiM0MztcdFx0aWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1xuJiM0MztcdFx0LyogWk9ORV9ERVZJQ0UgcGFnZXMgd29uJiMzOTt0IGJlIGFsbG9jYXRlZCB1c2luZyB0aGlzIGRyaXZlci4gKi9cbiYjNDM7XHRcdGlmICh6b25lX2lzX3pvbmVfZGV2aWNlKHpvbmUpKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XG4mIzQzO1x0XHRzbnByaW50ZihkaXJuYW1lLCBzaXplb2YoZGlybmFtZSksIFwmIzM0O3pvbmUtJXNcJiMzNDssIHpvbmUtXHUwMDNlbmFtZSk7XG4mIzQzO1x0XHR6b25lZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKGRpcm5hbWUsIG5vZGVkaXIpO1xuJiM0MztcdFx0aWYgKElTX0VSUih6b25lZGlyKSlcbiYjNDM7XHRcdFx0cmV0dXJuIFBUUl9FUlIoem9uZWRpcik7XG4mIzQzO1xuJiM0MztcdFx0cmV0ID0gY3JlYXRlX3BhZ2Vfb3JkZXJzX3N1YmRpcnMoem9uZWRpciwgbm9kZV9pZHgsIHpvbmVfaWR4LFxuJiM0MztcdFx0XHRcdFx0XHQgem9uZSk7XG4mIzQzO1x0XHRpZiAocmV0KVxuJiM0MztcdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBjcmVhdGVfbm9kZXNfc3ViZGlycygpIC0gQ3JlYXRlcyBhIGRpcmVjdG9yeSBmb3IgZWFjaCBvbmxpbmUgbm9kZSBpbiB0aGVcbiYjNDM7ICogc3lzdGVtLiBPbmNlIHRoYXQgdGhlIG5vZGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQsIGl0IGNyZWF0ZXMgYSBkaXJlY3RvcnkgZm9yXG4mIzQzOyAqIGVhY2ggem9uZSBpbiB0aGUgbm9kZS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IGNyZWF0ZV9ub2Rlc19zdWJkaXJzKHN0cnVjdCBkZW50cnkgKm1tZGlyKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGRlbnRyeSAqbm9kZWRpcjtcbiYjNDM7XHRpbnQgbm9kZV9pZHg7XG4mIzQzO1x0Y2hhciBkaXJuYW1lWzEyXTtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlX2lkeCkge1xuJiM0MztcdFx0c3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdGEgPSBOT0RFX0RBVEEobm9kZV9pZHgpO1xuJiM0MztcbiYjNDM7XHRcdHNucHJpbnRmKGRpcm5hbWUsIHNpemVvZihkaXJuYW1lKSwgXCYjMzQ7bm9kZS0lZFwmIzM0Oywgbm9kZV9pZHgpO1xuJiM0MztcdFx0bm9kZWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihkaXJuYW1lLCBtbWRpcik7XG4mIzQzO1x0XHRpZiAoSVNfRVJSKG5vZGVkaXIpKVxuJiM0MztcdFx0XHRyZXR1cm4gUFRSX0VSUihub2RlZGlyKTtcbiYjNDM7XG4mIzQzO1x0XHRyZXQgPSBjcmVhdGVfem9uZXNfc3ViZGlycyhub2RlZGlyLCBub2RlX2lkeCwgcGdkYXRhKTtcbiYjNDM7XHRcdGlmIChyZXQpXG4mIzQzO1x0XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBfX2luaXQgcGFnZV9hbGxvY19ob2dnZXJfZGVidWdmc19pbml0KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZGVudHJ5ICpmcmVlX2ZpbGU7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0cmVxX2FsbG9jX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoXG4mIzQzO1x0XHRcJiMzNDtyZXFfYWxsb2NfY2FjaGVcJiMzNDssIHNpemVvZihzdHJ1Y3QgcmVxX2FsbG9jKSwgMCxcbiYjNDM7XHRcdFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7XG4mIzQzO1x0aWYgKCFyZXFfYWxsb2NfY2FjaGUpIHtcbiYjNDM7XHRcdHByX2VycihcJiMzNDtUaGUgcmVxX2FsbG9jX2NhY2hlIGNvdWxkbiYjMzk7dCBiZSBjcmVhdGVkXCYjMzQ7KTtcbiYjNDM7XHRcdHJldCA9IC1FTk9NRU07XG4mIzQzO1x0XHRnb3RvIGVycm9yX2V4aXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRwYWdlX2FsbG9jX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoXG4mIzQzO1x0XHRcJiMzNDtwYWdlX2FsbG9jX2NhY2hlXCYjMzQ7LCBzaXplb2Yoc3RydWN0IHBhZ2VfYWxsb2MpLCAwLFxuJiM0MztcdFx0U0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTtcbiYjNDM7XHRpZiAoIXBhZ2VfYWxsb2NfY2FjaGUpIHtcbiYjNDM7XHRcdHByX2VycihcJiMzNDtUaGUgcGFnZV9hbGxvY19jYWNoZSBjb3VsZG4mIzM5O3QgYmUgY3JlYXRlZFwmIzM0Oyk7XG4mIzQzO1x0XHRyZXQgPSAtRU5PTUVNO1xuJiM0MztcdFx0Z290byBjbGVhbl9yZXFfYWxsb2NfY2FjaGU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRtbWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihcJiMzNDttbVwmIzM0OywgTlVMTCk7XG4mIzQzO1x0aWYgKElTX0VSUihtbWRpcikpIHtcbiYjNDM7XHRcdHByX2VycihcJiMzNDtVbmFibGUgdG8gY3JlYXRlIG1tIGRpcmVjdG9yeVwmIzM0Oyk7XG4mIzQzO1x0XHRyZXQgPSBQVFJfRVJSKG1tZGlyKTtcbiYjNDM7XHRcdGdvdG8gY2xlYW5fcGFnZV9hbGxvY19jYWNoZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IGNyZWF0ZV9ub2Rlc19zdWJkaXJzKG1tZGlyKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0Z290byBjbGVhbl9kaXI7XG4mIzQzO1xuJiM0MztcdGZyZWVfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoXCYjMzQ7ZnJlZVwmIzM0OywgMDY0NCwgbW1kaXIsIE5VTEwsXG4mIzQzO1x0XHRcdFx0XHRcdTAwMjZmcmVlX3BhZ2VfYWxsb2NfZm9wcyk7XG4mIzQzO1x0aWYgKElTX0VSUihmcmVlX2ZpbGUpKSB7XG4mIzQzO1x0XHRyZXQgPSBQVFJfRVJSKGZyZWVfZmlsZSk7XG4mIzQzO1x0XHRnb3RvIGNsZWFuX2RpcjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7Y2xlYW5fZGlyOlxuJiM0MztcdGRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShtbWRpcik7XG4mIzQzO1xuJiM0MztjbGVhbl9wYWdlX2FsbG9jX2NhY2hlOlxuJiM0MztcdGttZW1fY2FjaGVfZGVzdHJveShwYWdlX2FsbG9jX2NhY2hlKTtcbiYjNDM7XG4mIzQzO2NsZWFuX3JlcV9hbGxvY19jYWNoZTpcbiYjNDM7XHRrbWVtX2NhY2hlX2Rlc3Ryb3kocmVxX2FsbG9jX2NhY2hlKTtcbiYjNDM7XG4mIzQzO2Vycm9yX2V4aXQ6XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgX19leGl0IHBhZ2VfYWxsb2NfaG9nZ2VyX2RlYnVnZnNfZXhpdCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHBhZ2VfYWxsb2MgKnBhO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgaWR4O1xuJiM0MztcbiYjNDM7XHR4YV9mb3JfZWFjaChcdTAwMjZhbGxvY3NfeGEsIGlkeCwgcGEpIHtcbiYjNDM7XHRcdF9fZnJlZV9wYWdlcyhwYS1cdTAwM2VwYWdlLCBwYS1cdTAwM2VyZXFfYWxsb2MtXHUwMDNlb3JkZXIpO1xuJiM0MztcdFx0eGFfZXJhc2UoXHUwMDI2YWxsb2NzX3hhLCBpZHgpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKG1tZGlyKTtcbiYjNDM7XHRrbWVtX2NhY2hlX2Rlc3Ryb3kocmVxX2FsbG9jX2NhY2hlKTtcbiYjNDM7XHRrbWVtX2NhY2hlX2Rlc3Ryb3kocGFnZV9hbGxvY19jYWNoZSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO21vZHVsZV9pbml0KHBhZ2VfYWxsb2NfaG9nZ2VyX2RlYnVnZnNfaW5pdCk7XG4mIzQzO21vZHVsZV9leGl0KHBhZ2VfYWxsb2NfaG9nZ2VyX2RlYnVnZnNfZXhpdCk7XG4mIzQzO1xuJiM0MztNT0RVTEVfQVVUSE9SKFwmIzM0O0p1YW4gWWVzY2FzXCYjMzQ7KTtcbiYjNDM7TU9EVUxFX0RFU0NSSVBUSU9OKFwmIzM0O01vZHVsZSB0byBhbGxvYyBwYWdlcyB0byBnZW5lcmF0ZSBtZW1vcnkgcHJlc3N1cmVcJiMzNDspO1xuJiM0MztNT0RVTEVfTElDRU5TRShcJiMzNDtHUExcJiMzNDspO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI0IDEyOjE2PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtQQUdFQUxMT0NfSE9HR0VSJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7cmVxX3BhZ2VfYWxsb2Nfd3JpdGUmIzM0OywKICAgICYjMzQ7ZnJlZV9wYWdlX2FsbG9jX3dyaXRlJiMzNDssCiAgICAmIzM0O21ha2VfYWxsb2MmIzM0OywKICAgICYjMzQ7ZnJlZV9hbGxvY19oZWxwZXImIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBkZWJ1Z2ZzIGludGVyZmFjZSBmb3IgYWxsb2NhdGluZyBwYWdlcyBmcm9tIHNwZWNpZmljIG5vZGVzLCB6b25lcywgbWlncmF0ZSB0eXBlcywgYW5kIG9yZGVycy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgdGVzdGluZy9kZWJ1Z2dpbmcgdG9vbCB0aGF0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIG1lbW9yeSBwcmVzc3VyZSBhbmQgdGVzdCB0aGUgY29yZSBwYWdlIGFsbG9jYXRvciBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLiBGdXp6aW5nIGl0IGlzIHZhbHVhYmxlIHRvIHVuY292ZXIgcG90ZW50aWFsIGJ1Z3MgaW4gbWVtb3J5IG1hbmFnZW1lbnQgb3IgT09NIGhhbmRsaW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdAogICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksCiAgIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA4YWI5MGI1NmY3MWJiMWQxMDcyNzc1N2I4ZjY5YzQ5MWVjODU3NmEwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBKdWwgMjQgMTI6MTY6MTkgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9LY29uZmlnLmRlYnVnIGIvbW0vS2NvbmZpZy5kZWJ1ZwppbmRleCA3NjM4ZDc1YjI3ZGI4Yy4uYzhmY2VjZGNhNmFjYTkgMTAwNjQ0Ci0tLSBhL21tL0tjb25maWcuZGVidWcKJiM0MzsmIzQzOyYjNDM7IGIvbW0vS2NvbmZpZy5kZWJ1ZwpAQCAtMzA5LDMgJiM0MzszMDksMTUgQEAgY29uZmlnIFBFUl9WTUFfTE9DS19TVEFUUwogCSAgb3ZlcmhlYWQgaW4gdGhlIHBhZ2UgZmF1bHQgcGF0aC4KIAogCSAgSWYgaW4gZG91YnQsIHNheSBOLgomIzQzOwomIzQzO2NvbmZpZyBQQUdFQUxMT0NfSE9HR0VSCiYjNDM7CWJvb2wgJiMzNDtBbGxvYyBwYWdlcyBmcm9tIGRpZmZlcmVudCBub2Rlcywgem9uZXMsIG1pZ3JhdGUgdHlwZXMgYW5kIG9yZGVycyYjMzQ7CiYjNDM7CWRlcGVuZHMgb24gREVCVUdfRlMKJiM0MzsJaGVscAomIzQzOwkgIFNheSBZIHRvIGFsbG9jIHBhZ2VzIGZyb20gZGlmZmVyZW50IG5vZGVzLCB6b25lcywgbWlncmF0ZSB0eXBlIGFuZAomIzQzOwkgIG9yZGVycyB1c2luZyB0aGUgZGVidWcgZnMgZmlsZXN5c3RlbS4gVGhpcyBoZWxwcyB0byBnZW5lcmF0ZSBtZW1vcnkKJiM0MzsJICBwcmVzc3VyZSBlYXNpbHkuIFRoaXMgaXMgdXNlZnVsIHRvIGRlYnVnIG1lbW9yeSByZWNsYWltcyBpc3N1ZXMsCiYjNDM7CSAgT09NIHRyaWdnZXJzLCBwYWdlIG1pZ3JhdGlvbiBpc3N1ZXMsIGV0Yy4KJiM0MzsKJiM0MzsJICBJZiBpbiBkb3VidCwgc2F5IE4uCiYjNDM7CmRpZmYgLS1naXQgYS9tbS9NYWtlZmlsZSBiL21tL01ha2VmaWxlCmluZGV4IDJkMDU3MGExNmU1YmViLi5iNDhmMmFjNmVlODA4OSAxMDA2NDQKLS0tIGEvbW0vTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvbW0vTWFrZWZpbGUKQEAgLTEzMyw2ICYjNDM7MTMzLDcgQEAgb2JqLSQoQ09ORklHX0lETEVfUEFHRV9UUkFDS0lORykgJiM0Mzs9IHBhZ2VfaWRsZS5vCiBvYmotJChDT05GSUdfREVCVUdfUEFHRUFMTE9DKSAmIzQzOz0gZGVidWdfcGFnZV9hbGxvYy5vCiBvYmotJChDT05GSUdfREVCVUdfUEFHRV9SRUYpICYjNDM7PSBkZWJ1Z19wYWdlX3JlZi5vCiBvYmotJChDT05GSUdfREFNT04pICYjNDM7PSBkYW1vbi8KJiM0MztvYmotJChDT05GSUdfUEFHRUFMTE9DX0hPR0dFUikgJiM0Mzs9IHBhZ2VfYWxsb2NfaG9nZ2VyLm8KIG9iai0kKENPTkZJR19IQVJERU5FRF9VU0VSQ09QWSkgJiM0Mzs9IHVzZXJjb3B5Lm8KIG9iai0kKENPTkZJR19QRVJDUFVfU1RBVFMpICYjNDM7PSBwZXJjcHUtc3RhdHMubwogb2JqLSQoQ09ORklHX1pPTkVfREVWSUNFKSAmIzQzOz0gbWVtcmVtYXAubwpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvY19ob2dnZXIuYyBiL21tL3BhZ2VfYWxsb2NfaG9nZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLmY1NTRiYmI0YWZhNzMwCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvbW0vcGFnZV9hbGxvY19ob2dnZXIuYwpAQCAtMCwwICYjNDM7MSw2MTEgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qCiYjNDM7ICogUGFnZSBhbGxvY2F0b3IgRGVidWdGUyBJbnRlcmZhY2UKJiM0MzsgKiBBdXRob3I6IEp1YW4gWWVzY2FzICZsdDtqeWVzY2FzQGdvb2dsZS5jb20mZ3Q7CiYjNDM7ICoKJiM0MzsgKiBUaGlzIG1vZHVsZSBhbGxvd3MgdG8gbWFrZSBwYWdlIGFsbG9jcyBwZXIgbm9kZSwgem9uZSwgbWlncmF0ZSB0eXBlCiYjNDM7ICogYW5kIG9yZGVyIHVzaW5nIHRoZSBEZWJ1Z0ZTIGZpbGVzeXN0ZW0uCiYjNDM7ICoKJiM0MzsgKiBXaGVuIHRoaXMgbW9kdWxlIGlzIGluc3RhbGxlZCBhbmQgdGhlIGRlYnVnZnMgaXMgbW91bnRlZCwgdGhlICYjMzQ7bW0mIzM0OyBkaXJlY3RvcnkKJiM0MzsgJiMzNDsgd2lsbCBiZSBjcmVhdGVkIGluICZsdDtkZWJ1Z2ZzIG1vdW50IHBvaW50Jmd0Oy9tbSYjMzQ7IGRpcmVjdG9yeS4gVW5kZXIgdGhpcyBkaXJlY3RvcnksCiYjNDM7ICogdGhlcmUgd2lsbCBiZSBzdWJkaXJzIHRvIHNlbGVjdCB0aGUgbm9kZXMsIHpvbmVzLCBvcmRlcnMgYW5kIG1pZ3JhdGUgdHlwZS4KJiM0MzsgKgomIzQzOyAqIEZvciBleGFtcGxlOgomIzQzOyAqCiYjNDM7ICogICAgICAvc3lzL2tlcm5lbC9kZWJ1Zy9tbS8KJiM0MzsgKiAgICAgIHwtLSBmcmVlCiYjNDM7ICogICAgICBgLS0gbm9kZS0wCiYjNDM7ICogICAgICAgICB8LS0gem9uZS1ETUEKJiM0MzsgKiAgICAgICAgIHwgICB8LS0gb3JkZXItMAomIzQzOyAqICAgICAgICAgfCAgIHwgICB8LS0gbWlncmF0ZS1IaWdoQXRvbWljCiYjNDM7ICogICAgICAgICB8ICAgfCAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzCiYjNDM7ICogICAgICAgICB8ICAgfCAgIHwtLSBtaWdyYXRlLU1vdmFibGUKJiM0MzsgKiAgICAgICAgIHwgICB8ICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3MKJiM0MzsgKiAgICAgICAgIHwgICB8ICAgfC0tIG1pZ3JhdGUtUmVjbGFpbWFibGUKJiM0MzsgKiAgICAgICAgIHwgICB8ICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3MKJiM0MzsgKiAgICAgICAgIHwgICB8ICAgYC0tIG1pZ3JhdGUtVW5tb3ZhYmxlCiYjNDM7ICogICAgICAgICB8ICAgfCAgICAgICBgLS0gbnJfcGFnZXNfYWxsb2NzCiYjNDM7ICogICAgICAgICB8ICAgfC0tIC4uLgomIzQzOyAqICAgICAgICAgfCAgIHwKJiM0MzsgKiAgICAgICAgIHwgICBgLS0gb3JkZXItOQomIzQzOyAqICAgICAgICAgfCAgICAgICB8LS0gbWlncmF0ZS1IaWdoQXRvbWljCiYjNDM7ICogICAgICAgICB8ICAgICAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzCiYjNDM7ICogICAgICAgICB8ICAgICAgIHwtLSBtaWdyYXRlLU1vdmFibGUKJiM0MzsgKiAgICAgICAgIHwgICAgICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3MKJiM0MzsgKiAgICAgICAgIHwgICAgICAgfC0tIG1pZ3JhdGUtUmVjbGFpbWFibGUKJiM0MzsgKiAgICAgICAgIHwgICAgICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3MKJiM0MzsgKiAgICAgICAgIHwgICAgICAgYC0tIG1pZ3JhdGUtVW5tb3ZhYmxlCiYjNDM7ICogICAgICAgICB8ICAgICAgICAgICBgLS0gbnJfcGFnZXNfYWxsb2NzCiYjNDM7ICogICAgICAgICBgLS0gem9uZS1Ob3JtYWwKJiM0MzsgKiAgICAgICAgICAgICB8LS0gb3JkZXItMAomIzQzOyAqICAgICAgICAgICAgIHwgICB8LS0gbWlncmF0ZS1IaWdoQXRvbWljCiYjNDM7ICogICAgICAgICAgICAgfCAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzCiYjNDM7ICogICAgICAgICAgICAgfCAgIHwtLSBtaWdyYXRlLU1vdmFibGUKJiM0MzsgKiAgICAgICAgICAgICB8ICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3MKJiM0MzsgKiAgICAgICAgICAgICB8ICAgfC0tIG1pZ3JhdGUtUmVjbGFpbWFibGUKJiM0MzsgKiAgICAgICAgICAgICB8ICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3MKJiM0MzsgKiAgICAgICAgICAgICB8ICAgYC0tIG1pZ3JhdGUtVW5tb3ZhYmxlCiYjNDM7ICogICAgICAgICAgICAgfCAgICAgICBgLS0gbnJfcGFnZXNfYWxsb2NzCiYjNDM7ICogICAgICAgICAgICAgfC0tIC4uLi4KJiM0MzsgKiAgICAgICAgICAgICB8CiYjNDM7ICogICAgICAgICAgICAgYC0tIG9yZGVyLTkKJiM0MzsgKiAgICAgICAgICAgICAgICAgfC0tIG1pZ3JhdGUtSGlnaEF0b21pYwomIzQzOyAqICAgICAgICAgICAgICAgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jcwomIzQzOyAqICAgICAgICAgICAgICAgICB8LS0gbWlncmF0ZS1Nb3ZhYmxlCiYjNDM7ICogICAgICAgICAgICAgICAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzCiYjNDM7ICogICAgICAgICAgICAgICAgIHwtLSBtaWdyYXRlLVJlY2xhaW1hYmxlCiYjNDM7ICogICAgICAgICAgICAgICAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzCiYjNDM7ICogICAgICAgICAgICAgICAgIGAtLSBtaWdyYXRlLVVubW92YWJsZQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgYC0tIG5yX3BhZ2VzX2FsbG9jcwomIzQzOyAqCiYjNDM7ICogVXNhZ2U6CiYjNDM7ICoKJiM0MzsgKiAxLiBUbyB0cmlnZ2VyIHRoZSBhbGxvY2F0aW9uLCBuYXZpZ2F0ZSB0byB0aGUgZGVidWdmcyBwYXRoIGNvcnJlc3BvbmRpbmcKJiM0MzsgKiAgICB0byB5b3VyIHRhcmdldCBub2RlLCBtZW1vcnkgem9uZSwgYWxsb2NhdGlvbiBvcmRlciwgYW5kIG1pZ3JhdGlvbiB0eXBlLAomIzQzOyAqICAgIHRoZW4gd3JpdGUgdGhlIHJlcXVlc3RlZCBhbGxvY2F0aW9uIGNvdW50IHRvIG5yX3BhZ2VzX2FsbG9jcy4KJiM0MzsgKgomIzQzOyAqICAgIEZvciBleGFtcGxlLCB0byBtYWtlIDMgYWxsb2NzIG9mIG9yZGVyIDksIE1pZ3JhdGUgVHlwZSBNb3ZhYmxlLAomIzQzOyAqICAgIFpvbmUgTm9ybWFsIGFuZCBOb2RlIDAsIHJ1bjoKJiM0MzsgKgomIzQzOyAqICAgICQgZWNobyAzICZndDsgL3N5cy9rZXJuZWwvZGVidWcvbW0vbm9kZS0wL3pvbmUtTm9ybWFsL29yZGVyLTkvbWlncmF0ZS1Nb3ZhYmxlL25yX3BhZ2VzX2FsbG9jcwomIzQzOyAqCiYjNDM7ICogMi4gRm9yIGVhY2ggYWxsb2NhdGlvbiBjcmVhdGVkLCBhIGNvcnJlc3BvbmRpbmcgZmlsZSBuYW1lZCBzZXF1ZW50aWFsbHkKJiM0MzsgKiAgICAoMSwgMiwgbikgd2lsbCBhcHBlYXIgaW4gdGhhdCBkaXJlY3RvcnkuCiYjNDM7ICoKJiM0MzsgKiAgICAkIGxzIC9zeXMva2VybmVsL2RlYnVnL21tL25vZGUtMC96b25lLU5vcm1hbC9vcmRlci05L21pZ3JhdGUtTW92YWJsZS8KJiM0MzsgKiAgICAxICAgMiAgIDMgIG5yX3BhZ2VzX2FsbG9jcwomIzQzOyAqCiYjNDM7ICogMy4gVG8gZnJlZSB0aGUgYWxsb2NhdGlvbiwgd3JpdGUgdGhlIGFsbG9jYXRpb24gZmlsZSBuYW1lIGluIC9zeXMva2VybmVsL2RlYnVnL21tL2ZyZWUuCiYjNDM7ICogICAgRm9yIGV4YW1wbGUsIHRvIHJlbGVhc2UgdGhlIDJuZCBhbGxvY2F0aW9uIHJ1bjoKJiM0MzsgKgomIzQzOyAqICAgICQgZWNobyAyICZndDsgL3N5cy9rZXJuZWwvZGVidWcvbW0vZnJlZQomIzQzOyAqLwomIzQzOwomIzQzOyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgJiMzNDs6ICYjMzQ7IGZtdAomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9hdG9taWMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvZXJybm8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvZGVidWdmcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9nZnAuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvZ2ZwX3R5cGVzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2hpZ2htZW0uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgva2VybmVsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21tem9uZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9tb2R1bGUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbm9kZW1hc2suaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcHJpbnRrLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgveGFycmF5LmgmZ3Q7CiYjNDM7CiYjNDM7c3RydWN0IGRlbnRyeSAqbW1kaXI7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYXRvbWljX2xvbmdfdCBhbGxvY3NfZmlsZV9zZXEgLSBSZXByZXNlbnRzIHRoZSBuYW1pbmcgc2VxdWVuY2UgdXNlZCBmb3IKJiM0MzsgKiBhbGxvY2F0aW9uIGZpbGVzLgomIzQzOyAqLwomIzQzO2F0b21pY19sb25nX3QgYWxsb2NzX2ZpbGVfc2VxID0gQVRPTUlDX0lOSVQoMCk7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYWxsb2NzX3hhIC0gUmVwcmVzZW50IHRoZSB4YXJyYXkgdGhhdCBjb250YWlucyB0aGUgYWN0dWFsIGFsbG9jYXRpb25zIHBlcmZvcm0KJiM0MzsgKiBieSB0aGlzIGRyaXZlci4KJiM0MzsgKi8KJiM0MztzdGF0aWMgREVGSU5FX1hBUlJBWShhbGxvY3NfeGEpOwomIzQzOwomIzQzOy8qKgomIzQzOyAqIHN0cnVjdCByZXFfYWxsb2MgLSBSZXByZXNlbnRzIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvbgomIzQzOyAqIEBub2RlX2lkeDogVGhlIE5vZGUgaW5kZXggdG8gYWxsb2NhdGUgZnJvbS4KJiM0MzsgKiBAem9uZV9pZHg6IFRoZSBab25lIGluZGV4IHRvIGFsbG9jYXRlIGZyb20uCiYjNDM7ICogQG9yZGVyOiBUaGUgT3JkZXIgb2YgcGFnZXMgdG8gYWxsb2NhdGUuCiYjNDM7ICogQG1pZ3JhdGVfdHlwZTogVGhlIE1pZ3JhdGUgdHlwZSB0byBhbGxvY2F0ZSBmcm9tLgomIzQzOyAqIEBwYXJlbnRkaXI6IFRoZSBwYXJlbnQgZGlyIHdoZXJlIHRoZSBmaWxlIHJlcHJlc2VudGluZyB0aGUgYWxsb2Mgd2FzIGNyZWF0ZWQuCiYjNDM7ICovCiYjNDM7c3RydWN0IHJlcV9hbGxvYyB7CiYjNDM7CWludCBub2RlX2lkeDsKJiM0MzsJaW50IHpvbmVfaWR4OwomIzQzOwlpbnQgb3JkZXI7CiYjNDM7CWludCBtaWdyYXRlX3R5cGU7CiYjNDM7CXN0cnVjdCBkZW50cnkgKnBhcmVudGRpcjsKJiM0Mzt9OwomIzQzOwomIzQzOy8qCiYjNDM7ICogc3RydWN0IHBhZ2VfYWxsb2MgLSBSZXByZXNlbnRzIHRoZSBwYWdlIGFsbG9jYXRpb24uCiYjNDM7ICogQHBhZ2U6IFRoZSBwb2ludGVyIHRvIHRoZSBwYWdlKHMpIGFsbG9jYXRlZC4KJiM0MzsgKiBAcmVxX2FsbG9jOiBUaGUgZGV0YWlscyBvZiB0aGUgYWxsb2NhdGlvbi4KJiM0MzsgKiBAYWxsb2NfZGVudHJ5OiBUaGUgcG9pbnRlciB0byB0aGUgZmlsZSB0aGF0IHJlcHJlc2VudHMgdGhlIGFsbG9jYXRpb24uCiYjNDM7ICovCiYjNDM7c3RydWN0IHBhZ2VfYWxsb2MgewomIzQzOwlzdHJ1Y3QgcGFnZSAqcGFnZTsKJiM0MzsJc3RydWN0IHJlcV9hbGxvYyAqcmVxX2FsbG9jOwomIzQzOwlzdHJ1Y3QgZGVudHJ5ICphbGxvY19kZW50cnk7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3Qga21lbV9jYWNoZSAqcmVxX2FsbG9jX2NhY2hlOwomIzQzO3N0cnVjdCBrbWVtX2NhY2hlICpwYWdlX2FsbG9jX2NhY2hlOwomIzQzOwomIzQzO2lubGluZSB2b2lkIHNldF96b25lX3RvX2FsbG9jX2Zyb20oaW50IHpvbmVfaWR4LCBnZnBfdCAqZmxhZ3NfcHRyKQomIzQzO3sKJiM0MzsJc3dpdGNoICh6b25lX2lkeCkgewomIzQzOyNpZmRlZiBDT05GSUdfWk9ORV9ETUEKJiM0MzsJY2FzZSBaT05FX0RNQToKJiM0MzsJCSpmbGFnc19wdHIgfD0gX19HRlBfRE1BOwomIzQzOwkJYnJlYWs7CiYjNDM7I2VuZGlmCiYjNDM7I2lmZGVmIENPTkZJR19aT05FX0RNQTMyCiYjNDM7CWNhc2UgWk9ORV9ETUEzMjoKJiM0MzsJCSpmbGFnc19wdHIgfD0gX19HRlBfRE1BMzI7CiYjNDM7CQlicmVhazsKJiM0MzsjZW5kaWYKJiM0MzsjaWZkZWYgQ09ORklHX0hJR0hNRU0KJiM0MzsJY2FzZSBaT05FX0hJR0hNRU06CiYjNDM7CQkqZmxhZ3NfcHRyIHw9IF9fR0ZQX0hJR0hNRU07CiYjNDM7CQlicmVhazsKJiM0MzsjZW5kaWYKJiM0MzsJY2FzZSBaT05FX01PVkFCTEU6CiYjNDM7CQkqZmxhZ3NfcHRyIHw9IF9fR0ZQX01PVkFCTEU7CiYjNDM7CQlicmVhazsKJiM0MzsJY2FzZSBaT05FX05PUk1BTDoKJiM0MzsJZGVmYXVsdDoKJiM0MzsJCSpmbGFnc19wdHIgfD0gMDsKJiM0MzsJCWJyZWFrOwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzO2lubGluZSB2b2lkIHNldF9taWdyYXRlX3R5cGVfdG9fYWxsb2NfZnJvbShpbnQgbWlncmF0ZV90eXBlLCBnZnBfdCAqZmxhZ3NfcHRyKQomIzQzO3sKJiM0MzsJc3dpdGNoIChtaWdyYXRlX3R5cGUpIHsKJiM0MzsJY2FzZSBNSUdSQVRFX1VOTU9WQUJMRToKJiM0MzsJCSpmbGFnc19wdHIgJmFtcDs9IH4oX19HRlBfUkVDTEFJTUFCTEUgfCBfX0dGUF9NT1ZBQkxFKTsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIE1JR1JBVEVfUkVDTEFJTUFCTEU6CiYjNDM7CQkqZmxhZ3NfcHRyIHw9IF9fR0ZQX1JFQ0xBSU1BQkxFOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgTUlHUkFURV9ISUdIQVRPTUlDOgomIzQzOwkJKmZsYWdzX3B0ciB8PSBfX0dGUF9ISUdIOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgTUlHUkFURV9NT1ZBQkxFOiBkZWZhdWx0OgomIzQzOwkJKmZsYWdzX3B0ciB8PSBfX0dGUF9NT1ZBQkxFOwomIzQzOwkJYnJlYWs7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHNzaXplX3QgcGFnZV9hbGxvY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdWJ1ZiwKJiM0MzsJCQkJICAgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKJiM0Mzt7CiYjNDM7CS8qICBXaGljaCBpbmZvcm1hdGlvbiBzaG91bGQgYmUgcHJpbnQgYWJvdXQgdGhlIHBhZ2Ugb3IgYWxsb2NhdGlvbj8gKi8KJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBhZ2VfYWxsb2NfZm9wcyA9IHsKJiM0MzsJLm93bmVyID0gVEhJU19NT0RVTEUsCiYjNDM7CS5vcGVuID0gc2ltcGxlX29wZW4sCiYjNDM7CS5yZWFkID0gcGFnZV9hbGxvY19yZWFkLAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGludCBtYWtlX2FsbG9jKHN0cnVjdCByZXFfYWxsb2MgKnJlcSwKJiM0MzsJCQkgICAgZ2ZwX3QgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKmFsbG9jX2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHBhZ2VfYWxsb2MgKnBhOwomIzQzOwlzdHJ1Y3QgcGFnZSAqcGFnZTsKJiM0MzsJY2hhciBuZXdfYWxsb2NfbmFtZVsxMl07CiYjNDM7CXN0cnVjdCBkZW50cnkgKm5ld19hbGxvY19kZW50cnk7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXBhZ2UgPSBhbGxvY19wYWdlc19ub2RlX25vcHJvZihyZXEtJmd0O25vZGVfaWR4LCBmbGFncywgcmVxLSZndDtvcmRlcik7CiYjNDM7CWlmIChwYWdlKSB7CiYjNDM7CQlwYSA9IGttZW1fY2FjaGVfYWxsb2MocGFnZV9hbGxvY19jYWNoZSwgR0ZQX0tFUk5FTCk7CiYjNDM7CQlpZiAoIXBhKSB7CiYjNDM7CQkJcmV0ID0gLUVOT01FTTsKJiM0MzsJCQlnb3RvIGZyZWVfcGFnZXM7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQkqYWxsb2NfaWQgPSBhdG9taWNfbG9uZ19pbmNfcmV0dXJuKCZhbXA7YWxsb2NzX2ZpbGVfc2VxKTsKJiM0MzsJCXJldCA9IHhhX2luc2VydCgmYW1wO2FsbG9jc194YSwgKmFsbG9jX2lkLCBwYSwgR0ZQX0tFUk5FTCk7CiYjNDM7CQlpZiAocmV0KQomIzQzOwkJCWdvdG8gZnJlZV9wYWdlX2FsbG9jOwomIzQzOwomIzQzOwkJc25wcmludGYobmV3X2FsbG9jX25hbWUsIHNpemVvZihuZXdfYWxsb2NfbmFtZSksICYjMzQ7JWx1JiMzNDssCiYjNDM7CQkJICphbGxvY19pZCk7CiYjNDM7CiYjNDM7CQluZXdfYWxsb2NfZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgKJiM0MzsJCQluZXdfYWxsb2NfbmFtZSwgMDY0NCwgcmVxLSZndDtwYXJlbnRkaXIsCiYjNDM7CQkJcGEsICZhbXA7cGFnZV9hbGxvY19mb3BzKTsKJiM0MzsJCWlmIChJU19FUlIobmV3X2FsbG9jX2RlbnRyeSkpIHsKJiM0MzsJCQlyZXQgPSBQVFJfRVJSKG5ld19hbGxvY19kZW50cnkpOwomIzQzOwkJCWdvdG8gZXJhc2VfeGFfZW50cnk7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlwYS0mZ3Q7cmVxX2FsbG9jID0gcmVxOwomIzQzOwkJcGEtJmd0O3BhZ2UgPSBwYWdlOwomIzQzOwkJcGEtJmd0O2FsbG9jX2RlbnRyeSA9IG5ld19hbGxvY19kZW50cnk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MztlcmFzZV94YV9lbnRyeToKJiM0MzsJeGFfZXJhc2UoJmFtcDthbGxvY3NfeGEsICphbGxvY19pZCk7CiYjNDM7CiYjNDM7ZnJlZV9wYWdlX2FsbG9jOgomIzQzOwlrbWVtX2NhY2hlX2ZyZWUocGFnZV9hbGxvY19jYWNoZSwgcGEpOwomIzQzOwomIzQzO2ZyZWVfcGFnZXM6CiYjNDM7CV9fZnJlZV9wYWdlcyhwYWdlLCBwYS0mZ3Q7cmVxX2FsbG9jLSZndDtvcmRlcik7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZnJlZV9hbGxvY19oZWxwZXIodW5zaWduZWQgbG9uZyBhbGxvY19pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBwYWdlX2FsbG9jICpwYTsKJiM0MzsKJiM0MzsJcGEgPSB4YV9lcmFzZSgmYW1wO2FsbG9jc194YSwgYWxsb2NfaWQpOwomIzQzOwlpZiAoIXBhKSB7CiYjNDM7CQlwcl9lcnIoJiMzNDtUaGUgYWxsb2NfaWQgJWx1IHdhcyBub3QgZm91bmQhJiMzNDssIGFsbG9jX2lkKTsKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwl9CiYjNDM7CiYjNDM7CV9fZnJlZV9wYWdlcyhwYS0mZ3Q7cGFnZSwgcGEtJmd0O3JlcV9hbGxvYy0mZ3Q7b3JkZXIpOwomIzQzOwlkZWJ1Z2ZzX3JlbW92ZShwYS0mZ3Q7YWxsb2NfZGVudHJ5KTsKJiM0MzsJa21lbV9jYWNoZV9mcmVlKHBhZ2VfYWxsb2NfY2FjaGUsIHBhKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJlcV9wYWdlX2FsbG9jX3dyaXRlKCkgLSBBbGxvY2F0ZXMgdGhlIHBhZ2VzIG9uIHRoZSByZXF1ZXN0ZWQgbm9kZSwgem9uZSwKJiM0MzsgKiBvcmRlciBhbmQgbWlncmF0ZSB0eXBlLiBPbmNlIHRoZSBhbGxvY2F0aW9uIGlzIHBlcmZvcm1lZCwgYSBmaWxlIGlzIGNyZWF0ZWQKJiM0MzsgKiB0byBmcmVlIHRoZSBhbGxvY2F0aW9uIGxhdGVyLgomIzQzOyAqLwomIzQzO3N0YXRpYyBzc2l6ZV90IHJlcV9wYWdlX2FsbG9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdWJ1ZiwKJiM0MzsJCQkJICAgICBzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgcmVxX2FsbG9jICpyZXEgPSBmaWxlLSZndDtwcml2YXRlX2RhdGE7CiYjNDM7CXVuc2lnbmVkIGxvbmcgYWxsb2NfaWQ7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnJfcGFnZXNfYWxsb2NzOwomIzQzOwl1bnNpZ25lZCBsb25nICphbGxvY3NfaWRzOwomIzQzOwlnZnBfdCBmbGFncyA9IDA7CiYjNDM7CWludCByZXQ7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlyZXQgPSBrc3RydG91bF9mcm9tX3VzZXIodWJ1ZiwgY250LCAxMCwgJmFtcDtucl9wYWdlc19hbGxvY3MpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJYWxsb2NzX2lkcyA9IGttYWxsb2NfYXJyYXkobnJfcGFnZXNfYWxsb2NzLCBzaXplb2YodW5zaWduZWQgbG9uZyksCiYjNDM7CQkJCQlHRlBfS0VSTkVMKTsKJiM0MzsJaWYgKCFhbGxvY3NfaWRzKQomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CiYjNDM7CXNldF96b25lX3RvX2FsbG9jX2Zyb20ocmVxLSZndDt6b25lX2lkeCwgJmFtcDtmbGFncyk7CiYjNDM7CXNldF9taWdyYXRlX3R5cGVfdG9fYWxsb2NfZnJvbShyZXEtJmd0O21pZ3JhdGVfdHlwZSwgJmFtcDtmbGFncyk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBucl9wYWdlc19hbGxvY3M7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlyZXQgPSBtYWtlX2FsbG9jKHJlcSwgZmxhZ3MsICZhbXA7YWxsb2NfaWQpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlnb3RvIGZyZWVfYWxsb2NzOwomIzQzOwomIzQzOwkJYWxsb2NzX2lkc1tpXSA9IGFsbG9jX2lkOwomIzQzOwl9CiYjNDM7CiYjNDM7CWtmcmVlKGFsbG9jc19pZHMpOwomIzQzOwomIzQzOwlyZXR1cm4gY250OwomIzQzOwomIzQzO2ZyZWVfYWxsb2NzOgomIzQzOwkvKiBGcmVlIGFsbCB0aGUgcGFnZXMgcHJldmlvdXNseSBhbGxvY2F0ZWQuICovCiYjNDM7CWZvciAoaW50IGogPSAwOyBqICZsdDsgaTsgaiYjNDM7JiM0MzspIHsKJiM0MzsJCWludCByZXQyID0gZnJlZV9hbGxvY19oZWxwZXIoYWxsb2NzX2lkc1tqXSk7CiYjNDM7CiYjNDM7CQlpZiAocmV0MikKJiM0MzsJCQlwcl9lcnIoJiMzNDtVbmFibGUgdG8gZnJlZSBwYWdlcyBhc3NvY2lhdGVkIHdpdGggZmlsZSAlbHUmIzM0OywKJiM0MzsJCQkgICAgICAgYWxsb2NzX2lkc1tqXSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJa2ZyZWUoYWxsb2NzX2lkcyk7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlcV9wYWdlX2FsbG9jX2ZvcHMgPSB7CiYjNDM7CS5vd25lciA9IFRISVNfTU9EVUxFLAomIzQzOwkub3BlbiA9IHNpbXBsZV9vcGVuLAomIzQzOwkud3JpdGUgPSByZXFfcGFnZV9hbGxvY193cml0ZSwKJiM0Mzt9OwomIzQzOwomIzQzOy8qKgomIzQzOyAqIGZyZWVfcGFnZV9hbGxvY193cml0ZSgpIC0gZnJlZSB0aGUgcHJldmlvdXNseSBhbGxvY2F0ZWQgcGFnZXMuCiYjNDM7ICogQGZpbGU6IEZpbGUgd2hlcmUgdGhlIHVzZXIgaXMgd3JpdGluZy4KJiM0MzsgKiBAdWJ1ZjogQ29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhlIHVzZXIgd2FudHMgdG8gZGVsZXRlIGFuZCBoYXZlIHRoZQomIzQzOyAqICAgICAgIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmaWxlIGZyZWVkLgomIzQzOyAqIEBjbnQ6IFNpemUgb2YgQHVidWYuCiYjNDM7ICogQHBwb3M6IEN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGZpbGUuCiYjNDM7ICovCiYjNDM7c3RhdGljIHNzaXplX3QgZnJlZV9wYWdlX2FsbG9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAomIzQzOwkJCQkgICAgICBjb25zdCBjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IGNudCwKJiM0MzsJCQkJICAgICAgbG9mZl90ICpwcG9zKQomIzQzO3sKJiM0MzsJaW50IHJldDsKJiM0MzsJdW5zaWduZWQgbG9uZyBhbGxvY19pZDsKJiM0MzsKJiM0MzsJcmV0ID0ga3N0cnRvdWxfZnJvbV91c2VyKHVidWYsIGNudCwgMTAsICZhbXA7YWxsb2NfaWQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gZnJlZV9hbGxvY19oZWxwZXIoYWxsb2NfaWQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0dXJuIGNudDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnJlZV9wYWdlX2FsbG9jX2ZvcHMgPSB7CiYjNDM7CS5vd25lciA9IFRISVNfTU9EVUxFLAomIzQzOwkud3JpdGUgPSBmcmVlX3BhZ2VfYWxsb2Nfd3JpdGUsCiYjNDM7fTsKJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBjcmVhdGVfbnJfcGFnZXNfYWxsb2NzX2ZpbGUoKSAtIENyZWF0ZXMgdGhlIGZpbGUgJiMzNDtucl9wYWdlc19hbGxvY3MmIzM0Oy4KJiM0MzsgKgomIzQzOyAqIFRoZSAmIzM0O25yX3BhZ2VzX2FsbG9jcyYjMzQ7IGZpbGUgd2lsbCBiZSB1c2VkIHRvIHdyaXRlIHRoZSBudW1iZXIgb2YgYWxsb2NhdGlvbnMKJiM0MzsgKiB0aGF0IHdpbGwgYmUgcGVyZm9ybWVkLiBXaGVuIHRoZSBhbGxvY2F0aW9ucyBhcmUgcGVyZm9ybWVkLCBhIG5ldyBmaWxlIGZvcgomIzQzOyAqIGVhY2ggYWxsb2NhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgaW4gQG1pZ3JhdGVkaXIuCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgY3JlYXRlX25yX3BhZ2VzX2FsbG9jc19maWxlKHN0cnVjdCBkZW50cnkgKm1pZ3JhdGVkaXIsCiYjNDM7CQkJCQkgICAgICBpbnQgbm9kZV9pZHgsIGludCB6b25lX2lkeCwKJiM0MzsJCQkJCSAgICAgIGludCBvcmRlciwgaW50IG10eXBlKQomIzQzO3sKJiM0MzsJc3RydWN0IHJlcV9hbGxvYyAqcmVxOwomIzQzOwlzdHJ1Y3QgZGVudHJ5ICpucl9wYWdlczsKJiM0MzsKJiM0MzsJcmVxID0ga21lbV9jYWNoZV9hbGxvYyhyZXFfYWxsb2NfY2FjaGUsIEdGUF9LRVJORUwpOwomIzQzOwlpZiAoIXJlcSkgewomIzQzOwkJcHJfZXJyKCYjMzQ7RmFpbGVkIHRvIGNyZWF0ZSBucl9wYWdlc19hbGxvY3NfaW5mbyYjMzQ7KTsKJiM0MzsJCXJldHVybiAtRU5PTUVNOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJlcS0mZ3Q7bm9kZV9pZHggPSBub2RlX2lkeDsKJiM0MzsJcmVxLSZndDt6b25lX2lkeCA9IHpvbmVfaWR4OwomIzQzOwlyZXEtJmd0O29yZGVyID0gb3JkZXI7CiYjNDM7CXJlcS0mZ3Q7bWlncmF0ZV90eXBlID0gbXR5cGU7CiYjNDM7CXJlcS0mZ3Q7cGFyZW50ZGlyID0gbWlncmF0ZWRpcjsKJiM0MzsKJiM0MzsJbnJfcGFnZXMgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCYjMzQ7bnJfcGFnZXNfYWxsb2NzJiMzNDssIDA2NDQsIG1pZ3JhdGVkaXIsIHJlcSwKJiM0MzsJCQkJICAgICAgICZhbXA7cmVxX3BhZ2VfYWxsb2NfZm9wcyk7CiYjNDM7CWlmIChJU19FUlIobnJfcGFnZXMpKQomIzQzOwkJcmV0dXJuIFBUUl9FUlIobnJfcGFnZXMpOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogY3JlYXRlX21pZ3JhdGVfdHlwZV9zdWJkaXJzKCkgLSBDcmVhdGVzIGEgZGlyZWN0b3J5IGZvciBlYWNoIG1pZ3JhdGUgdHlwZQomIzQzOyAqIGluc2lkZSB0aGUgb3JkZXIgZGlyZWN0b3J5LiBPbmNlIHRoZSBtaWdyYXRlIHR5cGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQsIGl0CiYjNDM7ICogY3JlYXRlcyB0aGUgJiMzNDtucl9hbGxvY3MmIzM0OyBmaWxlIGFuZCB0aGUgJiMzNDtmcmVlJiMzNDsgZmlsZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGludCBjcmVhdGVfbWlncmF0ZV90eXBlX3N1YmRpcnMoc3RydWN0IGRlbnRyeSAqb3JkZXJkaXIsCiYjNDM7CQkJCQkgICAgICBpbnQgbm9kZV9pZHgsIGludCB6b25lX2lkeCwKJiM0MzsJCQkJCSAgICAgIGludCBvcmRlcikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBkZW50cnkgKm1pZ3JhdGVkaXI7CiYjNDM7CWNoYXIgZGlybmFtZVsyNF07CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWZvciAoaW50IG10eXBlID0gMDsgbXR5cGUgJmx0OyBNSUdSQVRFX1RZUEVTOyBtdHlwZSYjNDM7JiM0MzspIHsKJiM0MzsjaWZkZWYgQ09ORklHX0NNQQomIzQzOwkJaWYgKG10eXBlID09IE1JR1JBVEVfQ01BKSAvKiBDTUEgYWxsb2NzIGFyZSBub3Qgc3VwcG9ydGVkIHlldCovCiYjNDM7CQkJY29udGludWU7CiYjNDM7I2VuZGlmCiYjNDM7I2lmZGVmIENPTkZJR19NRU1PUllfSVNPTEFUSU9OCiYjNDM7CQlpZiAobXR5cGUgPT0gTUlHUkFURV9JU09MQVRFKSAvKiBjYW4mIzM5O3QgYWxsb2NhdGUgZnJvbSBoZXJlICovCiYjNDM7CQkJY29udGludWU7CiYjNDM7I2VuZGlmCiYjNDM7CQlzbnByaW50ZihkaXJuYW1lLCBzaXplb2YoZGlybmFtZSksICYjMzQ7bWlncmF0ZS0lcyYjMzQ7LAomIzQzOwkJCSBtaWdyYXRldHlwZV9uYW1lc1ttdHlwZV0pOwomIzQzOwkJbWlncmF0ZWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihkaXJuYW1lLCBvcmRlcmRpcik7CiYjNDM7CQlpZiAoSVNfRVJSKG1pZ3JhdGVkaXIpKQomIzQzOwkJCXJldHVybiBQVFJfRVJSKG1pZ3JhdGVkaXIpOwomIzQzOwomIzQzOwkJcmV0ID0gY3JlYXRlX25yX3BhZ2VzX2FsbG9jc19maWxlKG1pZ3JhdGVkaXIsIG5vZGVfaWR4LAomIzQzOwkJCQkJCSAgem9uZV9pZHgsIG9yZGVyLCBtdHlwZSk7CiYjNDM7CQlpZiAocmV0KQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGNyZWF0ZV9wYWdlX29yZGVyc19zdWJkaXJzKCkgLSBDcmVhdGVzIGEgZGlyZWN0b3J5IGZvciBlYWNoIHBhZ2Ugb3JkZXIgaW5zaWRlCiYjNDM7ICogdGhlIHpvbmUgZGlyZWN0b3J5LiBPbmNlIHRoYXQgdGhlIHBhZ2Ugb3JkZXIgZGlyZWN0b3J5IGlzIGNyZWF0ZWQsIGl0IGNyZWF0ZXMKJiM0MzsgKiBhIGRpcmVjdG9yeSBmb3IgZWFjaCBtaWdyYXRlIHR5cGUuCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgY3JlYXRlX3BhZ2Vfb3JkZXJzX3N1YmRpcnMoc3RydWN0IGRlbnRyeSAqem9uZWRpciwKJiM0MzsJCQkJCSAgICAgaW50IG5vZGVfaWR4LCBpbnQgem9uZV9pZHgsCiYjNDM7CQkJCQkgICAgIHN0cnVjdCB6b25lICp6b25lKQomIzQzO3sKJiM0MzsJc3RydWN0IGRlbnRyeSAqb3JkZXJkaXI7CiYjNDM7CWNoYXIgZGlybmFtZVsxMl07CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWZvciAoaW50IG9yZGVyID0gMDsgb3JkZXIgJmx0OyBOUl9QQUdFX09SREVSUzsgb3JkZXImIzQzOyYjNDM7KSB7CiYjNDM7CQlzbnByaW50ZihkaXJuYW1lLCBzaXplb2YoZGlybmFtZSksICYjMzQ7b3JkZXItJWQmIzM0Oywgb3JkZXIpOwomIzQzOwkJb3JkZXJkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoZGlybmFtZSwgem9uZWRpcik7CiYjNDM7CQlpZiAoSVNfRVJSKG9yZGVyZGlyKSkKJiM0MzsJCQlyZXR1cm4gUFRSX0VSUihvcmRlcmRpcik7CiYjNDM7CiYjNDM7CQlyZXQgPSBjcmVhdGVfbWlncmF0ZV90eXBlX3N1YmRpcnMob3JkZXJkaXIsIG5vZGVfaWR4LCB6b25lX2lkeCwKJiM0MzsJCQkJCQkgIG9yZGVyKTsKJiM0MzsJCWlmIChyZXQpCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogY3JlYXRlX3pvbmVzX3N1YmRpcnMoKSAtIENyZWF0ZXMgYSBkaXJlY3RvcnkgZm9yIGVhY2ggcG9wdWxhdGVkIHpvbmUgaW4gdGhlCiYjNDM7ICogbm9kZS4gT25jZSB0aGF0IHRoZSB6b25lIGRpcmVjdG9yeSBpcyBjcmVhdGVkLCBpdCBjcmVhdGVzIGEgZGlyZWN0b3J5IGZvcgomIzQzOyAqIGVhY2ggb3JkZXIgc3VwcG9ydGVkLgomIzQzOyAqCiYjNDM7ICogTm90ZTogWk9ORV9ERVZJQ0UgcGFnZXMgd29uJiMzOTt0IGJlIGFsbG9jYXRlZCB1c2luZyB0aGlzIGRyaXZlci4gVGhlIG1haW4gcmVhc29uCiYjNDM7ICogaXMgYmVjYXVzZSB0aGV5IGFyZSBub3QgbWFuYWdlZCBieSB0aGUgQnVkZHkgQWxsb2NhdG9yIG9yIENNQSBhbGxvY2F0b3IuCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgY3JlYXRlX3pvbmVzX3N1YmRpcnMoc3RydWN0IGRlbnRyeSAqbm9kZWRpciwgaW50IG5vZGVfaWR4LAomIzQzOwkJCQkgICAgICAgc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdGEpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZGVudHJ5ICp6b25lZGlyOwomIzQzOwlzdHJ1Y3Qgem9uZSAqem9uZTsKJiM0MzsJc3RydWN0IHpvbmUgKm5vZGVfem9uZXMgPSBwZ2RhdGEtJmd0O25vZGVfem9uZXM7CiYjNDM7CWludCB6b25lX2lkeDsKJiM0MzsJY2hhciBkaXJuYW1lWzI0XTsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJZm9yICh6b25lID0gbm9kZV96b25lcywgem9uZV9pZHggPSAwOyB6b25lIC0gbm9kZV96b25lcyAmbHQ7IE1BWF9OUl9aT05FUzsKJiM0MzsJICAgICAmIzQzOyYjNDM7em9uZSwgJiM0MzsmIzQzO3pvbmVfaWR4KSB7CiYjNDM7CQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwomIzQzOwkJLyogWk9ORV9ERVZJQ0UgcGFnZXMgd29uJiMzOTt0IGJlIGFsbG9jYXRlZCB1c2luZyB0aGlzIGRyaXZlci4gKi8KJiM0MzsJCWlmICh6b25lX2lzX3pvbmVfZGV2aWNlKHpvbmUpKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwomIzQzOwkJc25wcmludGYoZGlybmFtZSwgc2l6ZW9mKGRpcm5hbWUpLCAmIzM0O3pvbmUtJXMmIzM0Oywgem9uZS0mZ3Q7bmFtZSk7CiYjNDM7CQl6b25lZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKGRpcm5hbWUsIG5vZGVkaXIpOwomIzQzOwkJaWYgKElTX0VSUih6b25lZGlyKSkKJiM0MzsJCQlyZXR1cm4gUFRSX0VSUih6b25lZGlyKTsKJiM0MzsKJiM0MzsJCXJldCA9IGNyZWF0ZV9wYWdlX29yZGVyc19zdWJkaXJzKHpvbmVkaXIsIG5vZGVfaWR4LCB6b25lX2lkeCwKJiM0MzsJCQkJCQkgem9uZSk7CiYjNDM7CQlpZiAocmV0KQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGNyZWF0ZV9ub2Rlc19zdWJkaXJzKCkgLSBDcmVhdGVzIGEgZGlyZWN0b3J5IGZvciBlYWNoIG9ubGluZSBub2RlIGluIHRoZQomIzQzOyAqIHN5c3RlbS4gT25jZSB0aGF0IHRoZSBub2RlIGRpcmVjdG9yeSBpcyBjcmVhdGVkLCBpdCBjcmVhdGVzIGEgZGlyZWN0b3J5IGZvcgomIzQzOyAqIGVhY2ggem9uZSBpbiB0aGUgbm9kZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGludCBjcmVhdGVfbm9kZXNfc3ViZGlycyhzdHJ1Y3QgZGVudHJ5ICptbWRpcikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBkZW50cnkgKm5vZGVkaXI7CiYjNDM7CWludCBub2RlX2lkeDsKJiM0MzsJY2hhciBkaXJuYW1lWzEyXTsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZV9pZHgpIHsKJiM0MzsJCXN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXRhID0gTk9ERV9EQVRBKG5vZGVfaWR4KTsKJiM0MzsKJiM0MzsJCXNucHJpbnRmKGRpcm5hbWUsIHNpemVvZihkaXJuYW1lKSwgJiMzNDtub2RlLSVkJiMzNDssIG5vZGVfaWR4KTsKJiM0MzsJCW5vZGVkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoZGlybmFtZSwgbW1kaXIpOwomIzQzOwkJaWYgKElTX0VSUihub2RlZGlyKSkKJiM0MzsJCQlyZXR1cm4gUFRSX0VSUihub2RlZGlyKTsKJiM0MzsKJiM0MzsJCXJldCA9IGNyZWF0ZV96b25lc19zdWJkaXJzKG5vZGVkaXIsIG5vZGVfaWR4LCBwZ2RhdGEpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IF9faW5pdCBwYWdlX2FsbG9jX2hvZ2dlcl9kZWJ1Z2ZzX2luaXQodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBkZW50cnkgKmZyZWVfZmlsZTsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJcmVxX2FsbG9jX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoCiYjNDM7CQkmIzM0O3JlcV9hbGxvY19jYWNoZSYjMzQ7LCBzaXplb2Yoc3RydWN0IHJlcV9hbGxvYyksIDAsCiYjNDM7CQlTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOwomIzQzOwlpZiAoIXJlcV9hbGxvY19jYWNoZSkgewomIzQzOwkJcHJfZXJyKCYjMzQ7VGhlIHJlcV9hbGxvY19jYWNoZSBjb3VsZG4mIzM5O3QgYmUgY3JlYXRlZCYjMzQ7KTsKJiM0MzsJCXJldCA9IC1FTk9NRU07CiYjNDM7CQlnb3RvIGVycm9yX2V4aXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcGFnZV9hbGxvY19jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKAomIzQzOwkJJiMzNDtwYWdlX2FsbG9jX2NhY2hlJiMzNDssIHNpemVvZihzdHJ1Y3QgcGFnZV9hbGxvYyksIDAsCiYjNDM7CQlTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOwomIzQzOwlpZiAoIXBhZ2VfYWxsb2NfY2FjaGUpIHsKJiM0MzsJCXByX2VycigmIzM0O1RoZSBwYWdlX2FsbG9jX2NhY2hlIGNvdWxkbiYjMzk7dCBiZSBjcmVhdGVkJiMzNDspOwomIzQzOwkJcmV0ID0gLUVOT01FTTsKJiM0MzsJCWdvdG8gY2xlYW5fcmVxX2FsbG9jX2NhY2hlOwomIzQzOwl9CiYjNDM7CiYjNDM7CW1tZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCYjMzQ7bW0mIzM0OywgTlVMTCk7CiYjNDM7CWlmIChJU19FUlIobW1kaXIpKSB7CiYjNDM7CQlwcl9lcnIoJiMzNDtVbmFibGUgdG8gY3JlYXRlIG1tIGRpcmVjdG9yeSYjMzQ7KTsKJiM0MzsJCXJldCA9IFBUUl9FUlIobW1kaXIpOwomIzQzOwkJZ290byBjbGVhbl9wYWdlX2FsbG9jX2NhY2hlOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9ub2Rlc19zdWJkaXJzKG1tZGlyKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCWdvdG8gY2xlYW5fZGlyOwomIzQzOwomIzQzOwlmcmVlX2ZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCYjMzQ7ZnJlZSYjMzQ7LCAwNjQ0LCBtbWRpciwgTlVMTCwKJiM0MzsJCQkJCSZhbXA7ZnJlZV9wYWdlX2FsbG9jX2ZvcHMpOwomIzQzOwlpZiAoSVNfRVJSKGZyZWVfZmlsZSkpIHsKJiM0MzsJCXJldCA9IFBUUl9FUlIoZnJlZV9maWxlKTsKJiM0MzsJCWdvdG8gY2xlYW5fZGlyOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2NsZWFuX2RpcjoKJiM0MzsJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKG1tZGlyKTsKJiM0MzsKJiM0MztjbGVhbl9wYWdlX2FsbG9jX2NhY2hlOgomIzQzOwlrbWVtX2NhY2hlX2Rlc3Ryb3kocGFnZV9hbGxvY19jYWNoZSk7CiYjNDM7CiYjNDM7Y2xlYW5fcmVxX2FsbG9jX2NhY2hlOgomIzQzOwlrbWVtX2NhY2hlX2Rlc3Ryb3kocmVxX2FsbG9jX2NhY2hlKTsKJiM0MzsKJiM0MztlcnJvcl9leGl0OgomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBfX2V4aXQgcGFnZV9hbGxvY19ob2dnZXJfZGVidWdmc19leGl0KHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgcGFnZV9hbGxvYyAqcGE7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaWR4OwomIzQzOwomIzQzOwl4YV9mb3JfZWFjaCgmYW1wO2FsbG9jc194YSwgaWR4LCBwYSkgewomIzQzOwkJX19mcmVlX3BhZ2VzKHBhLSZndDtwYWdlLCBwYS0mZ3Q7cmVxX2FsbG9jLSZndDtvcmRlcik7CiYjNDM7CQl4YV9lcmFzZSgmYW1wO2FsbG9jc194YSwgaWR4KTsKJiM0MzsJfQomIzQzOwomIzQzOwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUobW1kaXIpOwomIzQzOwlrbWVtX2NhY2hlX2Rlc3Ryb3kocmVxX2FsbG9jX2NhY2hlKTsKJiM0MzsJa21lbV9jYWNoZV9kZXN0cm95KHBhZ2VfYWxsb2NfY2FjaGUpOwomIzQzO30KJiM0MzsKJiM0Mzttb2R1bGVfaW5pdChwYWdlX2FsbG9jX2hvZ2dlcl9kZWJ1Z2ZzX2luaXQpOwomIzQzO21vZHVsZV9leGl0KHBhZ2VfYWxsb2NfaG9nZ2VyX2RlYnVnZnNfZXhpdCk7CiYjNDM7CiYjNDM7TU9EVUxFX0FVVEhPUigmIzM0O0p1YW4gWWVzY2FzJiMzNDspOwomIzQzO01PRFVMRV9ERVNDUklQVElPTigmIzM0O01vZHVsZSB0byBhbGxvYyBwYWdlcyB0byBnZW5lcmF0ZSBtZW1vcnkgcHJlc3N1cmUmIzM0Oyk7CiYjNDM7TU9EVUxFX0xJQ0VOU0UoJiMzNDtHUEwmIzM0Oyk7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI0IDEyOjE2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg0MjcKCQkJCQkJCW91dHB1dDogMjAKCQkJCQkJCXRob3VnaHRzOiAzODQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSAmIzM0O1BhZ2UgQWxsb2MgSG9nZ2VyJiMzNDsgRGVidWdmcyBJbnRlcmZhY2UgZm9yIEZ1enppbmcqKgoKT2theSwgc28gdGhlcmUmIzM5O3MgdGhpcyBuZXcgcGF0Y2gsIGBwYWdlX2FsbG9jX2hvZ2dlci5jYCwgdGhhdCBpbnRyb2R1Y2VzIGEgZGVidWdmcyBpbnRlcmZhY2UsIHNwZWNpZmljYWxseSB1bmRlciBgL3N5cy9rZXJuZWwvZGVidWcvbW0vYC4gIFRoZSBnb2FsIGhlcmUgaXMgdG8gY3JlYXRlIGFydGlmaWNpYWwgbWVtb3J5IHByZXNzdXJlIGFuZCB0ZXN0IHRoaW5ncyBsaWtlIG1lbW9yeSByZWNsYWltLCB0aGUgT3V0LW9mLU1lbW9yeSAoT09NKSBraWxsZXIsIGFuZCBwYWdlIG1pZ3JhdGlvbi4gIFRoZSBpbXBvcnRhbnQgdGhpbmcgaXMsIGl0JiMzOTtzIGNvbmZpZ3VyYWJsZSB2aWEgYENPTkZJR19QQUdFQUxMT0NfSE9HR0VSYCBhbmQgcmVsaWVzIG9uIGBERUJVR19GU2AuCgpNeSBpbml0aWFsIHRob3VnaHQgaXMsIGlzIHRoaXMgZnV6emFibGU/ICBBYnNvbHV0ZWx5LiBJdCBnaXZlcyB1cyBhIHdheSB0byBhbGxvY2F0ZSBtZW1vcnkgd2l0aCBhIHZhcmlldHkgb2YgYEdGUGAgZmxhZ3MgYW5kIGFsbG9jYXRpb24gb3JkZXJzLCB3aGljaCBjb3VsZCBiZSBhIGdvbGRtaW5lIGZvciB0cmlnZ2VyaW5nIGludGVyZXN0aW5nIG1lbW9yeSBtYW5hZ2VtZW50IGJ1Z3Mgb3IgaGl0dGluZyB0aG9zZSBlZGdlIGNhc2VzIHRoYXQgbGVhZCB0byBPT00gY29uZGl0aW9ucy4gIEl0IHNlZW1zIHRvIGJlIGEgc3RyYWlnaHRmb3J3YXJkIGludGVyZmFjZSB0aGF0IGVzc2VudGlhbGx5IGp1c3QgY2FsbHMgYGFsbG9jX3BhZ2VzX25vZGVfbm9wcm9mYCBhbmQgYF9fZnJlZV9wYWdlc2AsIHNvIGl0JiMzOTtzIGEgdGVzdGluZyBhbmQgZGVidWdnaW5nIHRvb2wuIEJ1dCB0aGF0JiMzOTtzIGV4YWN0bHkgd2h5IGZ1enppbmcgaXQgY291bGQgYmUgc28gdmFsdWFibGUsIHRlc3RpbmcgdGhlIHBhZ2UgYWxsb2NhdG9yIGFuZCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLgoKTm93LCBzeXprYWxsZXIsIGJlaW5nIHRoZSBmdXp6aW5nIGJlaGVtb3RoIHRoYXQgaXQgaXMsIHdpbGwgbGlrZWx5IGdvIGFmdGVyIGFueSByZWFjaGFibGUgZGVidWdmcyBpbnRlcmZhY2VzLiBTbyBsZXQmIzM5O3MgdGhpbms6IGlzIGl0IHJlYWNoYWJsZT8gRGVidWdmcyBpcyB0eXBpY2FsbHkgbW91bnRlZCwgYW5kLCBjcml0aWNhbGx5LCBzeXprYWxsZXIgcnVucyBhcyByb290LiBCaW5nby4gIFNvIGl0JiMzOTtzIGRlZmluaXRlbHkgYWNjZXNzaWJsZS4KCkxldCYjMzk7cyBxdWlja2x5IHJldmlldyB0aGUgY29yZSBmdW5jdGlvbnMgaW4gYHBhZ2VfYWxsb2NfaG9nZ2VyLmNgOiBgcmVxX3BhZ2VfYWxsb2Nfd3JpdGVgLCBgZnJlZV9wYWdlX2FsbG9jX3dyaXRlYCwgYG1ha2VfYWxsb2NgLCBhbmQgYGZyZWVfYWxsb2NfaGVscGVyYC4gIFNwZWNpZmljYWxseSwgYHJlcV9wYWdlX2FsbG9jX3dyaXRlYCBhbmQgYGZyZWVfcGFnZV9hbGxvY193cml0ZWAgc2VlbSB0byBiZSB0aGUgcHJpbWFyeSB0YXJnZXRzLCB0aG9zZSBhcmUgdGhlIGVudHJ5IHBvaW50cy4KCkkgd2lsbCB1c2UgbXkgZXhpc3RpbmcgdG9vbHMgdG8gdmVyaWZ5IHRoYXQgdGhpcyBpcyBpbmRlZWQgdGhlIGNhc2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjQgMTI6MTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7UEFHRUFMTE9DX0hPR0dFUiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnLmRlYnVnPTMwMD1jb25maWcgUEVSX1ZNQV9MT0NLX1NUQVRTXG4tLVxubW0vS2NvbmZpZy5kZWJ1Zy0zMTItXG5tbS9LY29uZmlnLmRlYnVnOjMxMzpjb25maWcgUEFHRUFMTE9DX0hPR0dFUlxubW0vS2NvbmZpZy5kZWJ1Zy0zMTQtXHRib29sIFwmIzM0O0FsbG9jIHBhZ2VzIGZyb20gZGlmZmVyZW50IG5vZGVzLCB6b25lcywgbWlncmF0ZSB0eXBlcyBhbmQgb3JkZXJzXCYjMzQ7XG4tLVxubW0vTWFrZWZpbGU9MTM1PW9iai0kKENPTkZJR19EQU1PTikgJiM0Mzs9IGRhbW9uL1xubW0vTWFrZWZpbGU6MTM2Om9iai0kKENPTkZJR19QQUdFQUxMT0NfSE9HR0VSKSAmIzQzOz0gcGFnZV9hbGxvY19ob2dnZXIub1xubW0vTWFrZWZpbGUtMTM3LW9iai0kKENPTkZJR19IQVJERU5FRF9VU0VSQ09QWSkgJiM0Mzs9IHVzZXJjb3B5Lm9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yNCAxMjoxNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5NDEyCgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogOTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYW5hbHlzaXMgb2YgdGhlIHNpdHVhdGlvbjoKCioqSW52ZXN0aWdhdGluZyB0aGUgUEFHRUFMTE9DX0hPR0dFUiBDb25maWd1cmF0aW9uKioKCk9rYXksIHNvIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggYSBzeXN0ZW0gY29uZmlndXJlZCB3aXRoIGBQQUdFQUxMT0NfSE9HR0VSYC4gTXkgcHJpbWFyeSB0YXJnZXRzIGFyZSB0aGUgZnVuY3Rpb25zIGByZXFfcGFnZV9hbGxvY193cml0ZWAsIGBmcmVlX3BhZ2VfYWxsb2Nfd3JpdGVgLCBgbWFrZV9hbGxvY2AsIGFuZCBgZnJlZV9hbGxvY19oZWxwZXJgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBjb25maWcgaW50ZXJhY3RzIHdpdGggdGhvc2UgY29yZSBhbGxvY2F0aW9uIHJvdXRpbmVzLgoKQmVmb3JlIGRpdmluZyBkZWVwLCBsZXQmIzM5O3MganVzdCBtYWtlIHN1cmUgdGhlcmUgaXNuJiMzOTt0IHNvbWUgb2J2aW91cyBvdGhlciBwbGFjZSBJIG5lZWQgdG8gY29uc2lkZXIgLSBsaWtlIGFuIGluaXQgZnVuY3Rpb24gb3IgYSBwcmUtZGVmaW5lZCBzZXQgb2YgY29uc3RhbnRzLgoKUmlnaHQsIGxldCBtZSBqdXN0IHF1aWNrbHkgZ2xhbmNlIGF0IGBwYWdlX2FsbG9jX3JlYWRgLiBBaCwgaXQganVzdCByZXR1cm5zIHplcm8uIFRoYXQmIzM5O3MgZ29vZCB0byBrbm93LCBidXQgbGlrZWx5IHdvbiYjMzk7dCBnaXZlIG1lIGFueSBjbHVlcy4gU28sIGl0IGxvb2tzIGxpa2UgbXkgYXR0ZW50aW9uIHNob3VsZCBiZSBwcmltYXJpbHkgb24gYHJlcV9wYWdlX2FsbG9jX3dyaXRlYCBhbmQgYG1ha2VfYWxsb2NgIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBiZWhhdmlvciB1bmRlciB0aGlzIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uIEkgbmVlZCB0byBkaWcgaW50byB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiB0aG9zZSB0d28gZnVuY3Rpb25zLiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3MgYWN0dWFsbHkgZ29pbmcgb24gaW4gdGhvc2UgaW1wbGVtZW50YXRpb25zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI0IDEyOjE2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vcGFnZV9hbGxvY19ob2dnZXIuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIxMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDIxMDpcdFx0c3RydWN0IGRlbnRyeSAqbmV3X2FsbG9jX2RlbnRyeTtcbiAyMTE6XHRcdGludCByZXQ7XG4gMjEyOlx0XG4gMjEzOlx0XHRwYWdlID0gYWxsb2NfcGFnZXNfbm9kZV9ub3Byb2YocmVxLVx1MDAzZW5vZGVfaWR4LCBmbGFncywgcmVxLVx1MDAzZW9yZGVyKTtcbiAyMTQ6XHRcdGlmIChwYWdlKSB7XG4gMjE1Olx0XHRcdHBhID0ga21lbV9jYWNoZV9hbGxvYyhwYWdlX2FsbG9jX2NhY2hlLCBHRlBfS0VSTkVMKTtcbiAyMTY6XHRcdFx0aWYgKCFwYSkge1xuIDIxNzpcdFx0XHRcdHJldCA9IC1FTk9NRU07XG4gMjE4Olx0XHRcdFx0Z290byBmcmVlX3BhZ2VzO1xuIDIxOTpcdFx0XHR9XG4gMjIwOlx0XG4gMjIxOlx0XHRcdCphbGxvY19pZCA9IGF0b21pY19sb25nX2luY19yZXR1cm4oXHUwMDI2YWxsb2NzX2ZpbGVfc2VxKTtcbiAyMjI6XHRcdFx0cmV0ID0geGFfaW5zZXJ0KFx1MDAyNmFsbG9jc194YSwgKmFsbG9jX2lkLCBwYSwgR0ZQX0tFUk5FTCk7XG4gMjIzOlx0XHRcdGlmIChyZXQpXG4gMjI0Olx0XHRcdFx0Z290byBmcmVlX3BhZ2VfYWxsb2M7XG4gMjI1Olx0XG4gMjI2Olx0XHRcdHNucHJpbnRmKG5ld19hbGxvY19uYW1lLCBzaXplb2YobmV3X2FsbG9jX25hbWUpLCBcJiMzNDslbHVcJiMzNDssXG4gMjI3Olx0XHRcdFx0ICphbGxvY19pZCk7XG4gMjI4Olx0XG4gMjI5Olx0XHRcdG5ld19hbGxvY19kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKFxuIDIzMDpcdFx0XHRcdG5ld19hbGxvY19uYW1lLCAwNjQ0LCByZXEtXHUwMDNlcGFyZW50ZGlyLFxuIDIzMTpcdFx0XHRcdHBhLCBcdTAwMjZwYWdlX2FsbG9jX2ZvcHMpO1xuIDIzMjpcdFx0XHRpZiAoSVNfRVJSKG5ld19hbGxvY19kZW50cnkpKSB7XG4gMjMzOlx0XHRcdFx0cmV0ID0gUFRSX0VSUihuZXdfYWxsb2NfZGVudHJ5KTtcbiAyMzQ6XHRcdFx0XHRnb3RvIGVyYXNlX3hhX2VudHJ5O1xuIDIzNTpcdFx0XHR9XG4gMjM2Olx0XG4gMjM3Olx0XHRcdHBhLVx1MDAzZXJlcV9hbGxvYyA9IHJlcTtcbiAyMzg6XHRcdFx0cGEtXHUwMDNlcGFnZSA9IHBhZ2U7XG4gMjM5Olx0XHRcdHBhLVx1MDAzZWFsbG9jX2RlbnRyeSA9IG5ld19hbGxvY19kZW50cnk7XG4gMjQwOlx0XHR9IGVsc2Uge1xuIDI0MTpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiAyNDI6XHRcdH1cbiAyNDM6XHRcbiAyNDQ6XHRcdHJldHVybiAwO1xuIDI0NTpcdFxuIDI0NjpcdGVyYXNlX3hhX2VudHJ5OlxuIDI0NzpcdFx0eGFfZXJhc2UoXHUwMDI2YWxsb2NzX3hhLCAqYWxsb2NfaWQpO1xuIDI0ODpcdFxuIDI0OTpcdGZyZWVfcGFnZV9hbGxvYzpcbiAyNTA6XHRcdGttZW1fY2FjaGVfZnJlZShwYWdlX2FsbG9jX2NhY2hlLCBwYSk7XG4gMjUxOlx0XG4gMjUyOlx0ZnJlZV9wYWdlczpcbiAyNTM6XHRcdF9fZnJlZV9wYWdlcyhwYWdlLCBwYS1cdTAwM2VyZXFfYWxsb2MtXHUwMDNlb3JkZXIpO1xuIDI1NDpcdFxuIDI1NTpcdFx0cmV0dXJuIHJldDtcbiAyNTY6XHR9XG4gMjU3Olx0XG4gMjU4Olx0c3RhdGljIGludCBmcmVlX2FsbG9jX2hlbHBlcih1bnNpZ25lZCBsb25nIGFsbG9jX2lkKVxuIDI1OTpcdHtcbiAyNjA6XHRcdHN0cnVjdCBwYWdlX2FsbG9jICpwYTtcbiAyNjE6XHRcbiAyNjI6XHRcdHBhID0geGFfZXJhc2UoXHUwMDI2YWxsb2NzX3hhLCBhbGxvY19pZCk7XG4gMjYzOlx0XHRpZiAoIXBhKSB7XG4gMjY0Olx0XHRcdHByX2VycihcJiMzNDtUaGUgYWxsb2NfaWQgJWx1IHdhcyBub3QgZm91bmQhXCYjMzQ7LCBhbGxvY19pZCk7XG4gMjY1Olx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDI2NjpcdFx0fVxuIDI2NzpcdFxuIDI2ODpcdFx0X19mcmVlX3BhZ2VzKHBhLVx1MDAzZXBhZ2UsIHBhLVx1MDAzZXJlcV9hbGxvYy1cdTAwM2VvcmRlcik7XG4gMjY5Olx0XHRkZWJ1Z2ZzX3JlbW92ZShwYS1cdTAwM2VhbGxvY19kZW50cnkpO1xuIDI3MDpcdFx0a21lbV9jYWNoZV9mcmVlKHBhZ2VfYWxsb2NfY2FjaGUsIHBhKTtcbiAyNzE6XHRcbiAyNzI6XHRcdHJldHVybiAwO1xuIDI3MzpcdH1cbiAyNzQ6XHRcbiAyNzU6XHQvKipcbiAyNzY6XHQgKiByZXFfcGFnZV9hbGxvY193cml0ZSgpIC0gQWxsb2NhdGVzIHRoZSBwYWdlcyBvbiB0aGUgcmVxdWVzdGVkIG5vZGUsIHpvbmUsXG4gMjc3Olx0ICogb3JkZXIgYW5kIG1pZ3JhdGUgdHlwZS4gT25jZSB0aGUgYWxsb2NhdGlvbiBpcyBwZXJmb3JtZWQsIGEgZmlsZSBpcyBjcmVhdGVkXG4gMjc4Olx0ICogdG8gZnJlZSB0aGUgYWxsb2NhdGlvbiBsYXRlci5cbiAyNzk6XHQgKi9cbiAyODA6XHRzdGF0aWMgc3NpemVfdCByZXFfcGFnZV9hbGxvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsXG4gMjgxOlx0XHRcdFx0XHQgICAgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcylcbiAyODI6XHR7XG4gMjgzOlx0XHRzdHJ1Y3QgcmVxX2FsbG9jICpyZXEgPSBmaWxlLVx1MDAzZXByaXZhdGVfZGF0YTtcbiAyODQ6XHRcdHVuc2lnbmVkIGxvbmcgYWxsb2NfaWQ7XG4gMjg1Olx0XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzX2FsbG9jcztcbiAyODY6XHRcdHVuc2lnbmVkIGxvbmcgKmFsbG9jc19pZHM7XG4gMjg3Olx0XHRnZnBfdCBmbGFncyA9IDA7XG4gMjg4Olx0XHRpbnQgcmV0O1xuIDI4OTpcdFx0aW50IGk7XG4gMjkwOlx0XG4gMjkxOlx0XHRyZXQgPSBrc3RydG91bF9mcm9tX3VzZXIodWJ1ZiwgY250LCAxMCwgXHUwMDI2bnJfcGFnZXNfYWxsb2NzKTtcbiAyOTI6XHRcdGlmIChyZXQpXG4gMjkzOlx0XHRcdHJldHVybiByZXQ7XG4gMjk0Olx0XG4gMjk1Olx0XHRhbGxvY3NfaWRzID0ga21hbGxvY19hcnJheShucl9wYWdlc19hbGxvY3MsIHNpemVvZih1bnNpZ25lZCBsb25nKSxcbiAyOTY6XHRcdFx0XHRcdFx0R0ZQX0tFUk5FTCk7XG4gMjk3Olx0XHRpZiAoIWFsbG9jc19pZHMpXG4gMjk4Olx0XHRcdHJldHVybiAtRU5PTUVNO1xuIDI5OTpcdFxuIDMwMDpcdFx0c2V0X3pvbmVfdG9fYWxsb2NfZnJvbShyZXEtXHUwMDNlem9uZV9pZHgsIFx1MDAyNmZsYWdzKTtcbiAzMDE6XHRcdHNldF9taWdyYXRlX3R5cGVfdG9fYWxsb2NfZnJvbShyZXEtXHUwMDNlbWlncmF0ZV90eXBlLCBcdTAwMjZmbGFncyk7XG4gMzAyOlx0XG4gMzAzOlx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlc19hbGxvY3M7IGkmIzQzOyYjNDM7KSB7XG4gMzA0Olx0XHRcdHJldCA9IG1ha2VfYWxsb2MocmVxLCBmbGFncywgXHUwMDI2YWxsb2NfaWQpO1xuIDMwNTpcdFx0XHRpZiAocmV0KVxuIDMwNjpcdFx0XHRcdGdvdG8gZnJlZV9hbGxvY3M7XG4gMzA3Olx0XG4gMzA4Olx0XHRcdGFsbG9jc19pZHNbaV0gPSBhbGxvY19pZDtcbiAzMDk6XHRcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yNCAxMjoxNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTI1NgoJCQkJCQkJb3V0cHV0OiAxNDAKCQkJCQkJCXRob3VnaHRzOiAxNTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgUGFnZSBBbGxvY2F0b3IgVGVzdGluZyBDb2RlKioKCk9rYXksIHNvIHRoZSBjb2RlIGlzIGZ1bmN0aW9uYWwg4oCTIGdvb2Qgc3RhcnQhIEl0JiMzOTtzIGRlc2lnbmVkIHRvIHRlc3QgdGhlIHBhZ2UgYWxsb2NhdG9yLCBzcGVjaWZpY2FsbHkgYnkgcHJvdmlkaW5nIGEgZGVidWdmcyBpbnRlcmZhY2UuIFRoaXMgYWxsb3dzIGZvciBjb250cm9sbGVkIGFsbG9jYXRpb24gYW5kIGZyZWVpbmcgb2YgcGFnZXMsIHdpdGggc3BlY2lmaWMgcGFyYW1ldGVycy4gSG1tLCB0aGlzIGlzIGludGVyZXN0aW5nLi4uIEkgY2FuIHNlZSB0aGUgaW1tZWRpYXRlIGFwcGxpY2F0aW9uIGhlcmU6IGl0IGxvb2tzIGxpa2UgaXQmIzM5O2QgYmUgcHJldHR5IGRhcm4gdXNlZnVsIGZvciBmdXp6aW5nIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uIFRoYXQmIzM5O3MgYSB2YWx1YWJsZSBjYXBhYmlsaXR5IHRvIGhhdmUuIEkmIzM5O20gZ29pbmcgdG8gZmxhZyB0aGlzIGFzIHNvbWV0aGluZyBXb3J0aEZ1enppbmcuCgpJIG5lZWQgdG8gZm9jdXMgb24gYSBmZXcga2V5IHN5bWJvbHMgaGVyZTogYHJlcV9wYWdlX2FsbG9jX3dyaXRlYCwgYGZyZWVfcGFnZV9hbGxvY193cml0ZWAsIGBtYWtlX2FsbG9jYCwgYW5kIGBmcmVlX2FsbG9jX2hlbHBlcmAuIFRob3NlIGFyZSB0aGUgZW50cnkgcG9pbnRzIGFuZCBjb3JlIGZ1bmN0aW9ucyB0aGF0IEkmIzM5O2xsIG5lZWQgdG8gdW5kZXJzdGFuZCBpbiBkZXRhaWwgdG8gZnVsbHkgbGV2ZXJhZ2UgdGhpcyBmb3IgdGVzdGluZy4KCkFuZCBvZiBjb3Vyc2UsIEkgc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHRoZSBgUEFHRUFMTE9DX0hPR0dFUmAgY29uZmlnIGlzIGVuYWJsZWQgdG8gdXNlIHRoZSBkZWJ1Z2dpbmcgdG9vbC4KCkFscmlnaHQsIGxldCBtZSBqdXN0IGRvdWJsZS1jaGVjaywgYmVjYXVzZSBJJiMzOTttIGEgYml0IG9ic2Vzc2l2ZSBhYm91dCBiZWluZyB0aG9yb3VnaC4gQWgsIHllcywgdGhlIHBhdGNoIGlzIGEgbmV3IGZpbGUsIGBtbS9wYWdlX2FsbG9jX2hvZ2dlci5jYCwgd2hpY2ggbWFrZXMgc2Vuc2UuIEl0JiMzOTtzIGFkZGluZyB0aGF0IGRlYnVnZnMgaW50ZXJmYWNlLCB3aGljaCBjb25maXJtcyBteSBpbml0aWFsIGltcHJlc3Npb24uIFRoZSBmdW5jdGlvbmFsaXR5IGlzIGRlZmluaXRlbHkgdGhlcmUsIGFuZCBpdCYjMzk7cyByZWFjaGFibGUgdmlhIGRlYnVnZnMuCgpHcmVhdC4gTG9va3MgbGlrZSBJJiMzOTt2ZSBnb3QgZXZlcnl0aGluZyBJIG5lZWQuIFRpbWUgdG8gc2V0LXJlc3VsdHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjQgMTI6MTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1BBR0VBTExPQ19IT0dHRVImIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtyZXFfcGFnZV9hbGxvY193cml0ZSYjMzQ7LAogICAgJiMzNDtmcmVlX3BhZ2VfYWxsb2Nfd3JpdGUmIzM0OywKICAgICYjMzQ7bWFrZV9hbGxvYyYjMzQ7LAogICAgJiMzNDtmcmVlX2FsbG9jX2hlbHBlciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGRlYnVnZnMgaW50ZXJmYWNlIGZvciBhbGxvY2F0aW5nIHBhZ2VzIGZyb20gc3BlY2lmaWMgbm9kZXMsIHpvbmVzLCBtaWdyYXRlIHR5cGVzLCBhbmQgb3JkZXJzLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCB0ZXN0aW5nL2RlYnVnZ2luZyB0b29sIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgbWVtb3J5IHByZXNzdXJlIGFuZCB0ZXN0IHRoZSBjb3JlIHBhZ2UgYWxsb2NhdG9yIGFuZCBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uIEZ1enppbmcgaXQgaXMgdmFsdWFibGUgdG8gdW5jb3ZlciBwb3RlbnRpYWwgYnVncyBpbiBtZW1vcnkgbWFuYWdlbWVudCBvciBPT00gaGFuZGxpbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1BBR0VBTExPQ19IT0dHRVImIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtyZXFfcGFnZV9hbGxvY193cml0ZSYjMzQ7LAogICAgJiMzNDtmcmVlX3BhZ2VfYWxsb2Nfd3JpdGUmIzM0OywKICAgICYjMzQ7bWFrZV9hbGxvYyYjMzQ7LAogICAgJiMzNDtmcmVlX2FsbG9jX2hlbHBlciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGRlYnVnZnMgaW50ZXJmYWNlIGZvciBhbGxvY2F0aW5nIHBhZ2VzIGZyb20gc3BlY2lmaWMgbm9kZXMsIHpvbmVzLCBtaWdyYXRlIHR5cGVzLCBhbmQgb3JkZXJzLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCB0ZXN0aW5nL2RlYnVnZ2luZyB0b29sIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgbWVtb3J5IHByZXNzdXJlIGFuZCB0ZXN0IHRoZSBjb3JlIHBhZ2UgYWxsb2NhdG9yIGFuZCBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uIEZ1enppbmcgaXQgaXMgdmFsdWFibGUgdG8gdW5jb3ZlciBwb3RlbnRpYWwgYnVncyBpbiBtZW1vcnkgbWFuYWdlbWVudCBvciBPT00gaGFuZGxpbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wNy0yNFQxMjoxNjoyMS4yOTI1NzE4NDVaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMjE2MzA5Mjc0NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJQQUdFQUxMT0NfSE9HR0VSXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwicmVxX3BhZ2VfYWxsb2Nfd3JpdGVcIixcbiAgICBcImZyZWVfcGFnZV9hbGxvY193cml0ZVwiLFxuICAgIFwibWFrZV9hbGxvY1wiLFxuICAgIFwiZnJlZV9hbGxvY19oZWxwZXJcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGRlYnVnZnMgaW50ZXJmYWNlIGZvciBhbGxvY2F0aW5nIHBhZ2VzIGZyb20gc3BlY2lmaWMgbm9kZXMsIHpvbmVzLCBtaWdyYXRlIHR5cGVzLCBhbmQgb3JkZXJzLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCB0ZXN0aW5nL2RlYnVnZ2luZyB0b29sIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgbWVtb3J5IHByZXNzdXJlIGFuZCB0ZXN0IHRoZSBjb3JlIHBhZ2UgYWxsb2NhdG9yIGFuZCBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uIEZ1enppbmcgaXQgaXMgdmFsdWFibGUgdG8gdW5jb3ZlciBwb3RlbnRpYWwgYnVncyBpbiBtZW1vcnkgbWFuYWdlbWVudCBvciBPT00gaGFuZGxpbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI0VDEyOjE2OjIxLjI5MjU3ODExNFoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjUxNTA5ODI1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgOGFiOTBiNTZmNzFiYjFkMTA3Mjc3NTdiOGY2OWM0OTFlYzg1NzZhMFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgRnJpIEp1bCAyNCAxMjoxNjoxOSAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9tbS9LY29uZmlnLmRlYnVnIGIvbW0vS2NvbmZpZy5kZWJ1Z1xcbmluZGV4IDc2MzhkNzViMjdkYjhjLi5jOGZjZWNkY2E2YWNhOSAxMDA2NDRcXG4tLS0gYS9tbS9LY29uZmlnLmRlYnVnXFxuKysrIGIvbW0vS2NvbmZpZy5kZWJ1Z1xcbkBAIC0zMDksMyArMzA5LDE1IEBAIGNvbmZpZyBQRVJfVk1BX0xPQ0tfU1RBVFNcXG4gXFx0ICBvdmVyaGVhZCBpbiB0aGUgcGFnZSBmYXVsdCBwYXRoLlxcbiBcXG4gXFx0ICBJZiBpbiBkb3VidCwgc2F5IE4uXFxuK1xcbitjb25maWcgUEFHRUFMTE9DX0hPR0dFUlxcbitcXHRib29sIFxcXCJBbGxvYyBwYWdlcyBmcm9tIGRpZmZlcmVudCBub2Rlcywgem9uZXMsIG1pZ3JhdGUgdHlwZXMgYW5kIG9yZGVyc1xcXCJcXG4rXFx0ZGVwZW5kcyBvbiBERUJVR19GU1xcbitcXHRoZWxwXFxuK1xcdCAgU2F5IFkgdG8gYWxsb2MgcGFnZXMgZnJvbSBkaWZmZXJlbnQgbm9kZXMsIHpvbmVzLCBtaWdyYXRlIHR5cGUgYW5kXFxuK1xcdCAgb3JkZXJzIHVzaW5nIHRoZSBkZWJ1ZyBmcyBmaWxlc3lzdGVtLiBUaGlzIGhlbHBzIHRvIGdlbmVyYXRlIG1lbW9yeVxcbitcXHQgIHByZXNzdXJlIGVhc2lseS4gVGhpcyBpcyB1c2VmdWwgdG8gZGVidWcgbWVtb3J5IHJlY2xhaW1zIGlzc3VlcyxcXG4rXFx0ICBPT00gdHJpZ2dlcnMsIHBhZ2UgbWlncmF0aW9uIGlzc3VlcywgZXRjLlxcbitcXG4rXFx0ICBJZiBpbiBkb3VidCwgc2F5IE4uXFxuK1xcbmRpZmYgLS1naXQgYS9tbS9NYWtlZmlsZSBiL21tL01ha2VmaWxlXFxuaW5kZXggMmQwNTcwYTE2ZTViZWIuLmI0OGYyYWM2ZWU4MDg5IDEwMDY0NFxcbi0tLSBhL21tL01ha2VmaWxlXFxuKysrIGIvbW0vTWFrZWZpbGVcXG5AQCAtMTMzLDYgKzEzMyw3IEBAIG9iai0kKENPTkZJR19JRExFX1BBR0VfVFJBQ0tJTkcpICs9IHBhZ2VfaWRsZS5vXFxuIG9iai0kKENPTkZJR19ERUJVR19QQUdFQUxMT0MpICs9IGRlYnVnX3BhZ2VfYWxsb2Mub1xcbiBvYmotJChDT05GSUdfREVCVUdfUEFHRV9SRUYpICs9IGRlYnVnX3BhZ2VfcmVmLm9cXG4gb2JqLSQoQ09ORklHX0RBTU9OKSArPSBkYW1vbi9cXG4rb2JqLSQoQ09ORklHX1BBR0VBTExPQ19IT0dHRVIpICs9IHBhZ2VfYWxsb2NfaG9nZ2VyLm9cXG4gb2JqLSQoQ09ORklHX0hBUkRFTkVEX1VTRVJDT1BZKSArPSB1c2VyY29weS5vXFxuIG9iai0kKENPTkZJR19QRVJDUFVfU1RBVFMpICs9IHBlcmNwdS1zdGF0cy5vXFxuIG9iai0kKENPTkZJR19aT05FX0RFVklDRSkgKz0gbWVtcmVtYXAub1xcbmRpZmYgLS1naXQgYS9tbS9wYWdlX2FsbG9jX2hvZ2dlci5jIGIvbW0vcGFnZV9hbGxvY19ob2dnZXIuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLmY1NTRiYmI0YWZhNzMwXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL21tL3BhZ2VfYWxsb2NfaG9nZ2VyLmNcXG5AQCAtMCwwICsxLDYxMSBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBQYWdlIGFsbG9jYXRvciBEZWJ1Z0ZTIEludGVyZmFjZVxcbisgKiBBdXRob3I6IEp1YW4gWWVzY2FzIFxcdTAwM2NqeWVzY2FzQGdvb2dsZS5jb21cXHUwMDNlXFxuKyAqXFxuKyAqIFRoaXMgbW9kdWxlIGFsbG93cyB0byBtYWtlIHBhZ2UgYWxsb2NzIHBlciBub2RlLCB6b25lLCBtaWdyYXRlIHR5cGVcXG4rICogYW5kIG9yZGVyIHVzaW5nIHRoZSBEZWJ1Z0ZTIGZpbGVzeXN0ZW0uXFxuKyAqXFxuKyAqIFdoZW4gdGhpcyBtb2R1bGUgaXMgaW5zdGFsbGVkIGFuZCB0aGUgZGVidWdmcyBpcyBtb3VudGVkLCB0aGUgXFxcIm1tXFxcIiBkaXJlY3RvcnlcXG4rIFxcXCIgd2lsbCBiZSBjcmVhdGVkIGluIFxcdTAwM2NkZWJ1Z2ZzIG1vdW50IHBvaW50XFx1MDAzZS9tbVxcXCIgZGlyZWN0b3J5LiBVbmRlciB0aGlzIGRpcmVjdG9yeSxcXG4rICogdGhlcmUgd2lsbCBiZSBzdWJkaXJzIHRvIHNlbGVjdCB0aGUgbm9kZXMsIHpvbmVzLCBvcmRlcnMgYW5kIG1pZ3JhdGUgdHlwZS5cXG4rICpcXG4rICogRm9yIGV4YW1wbGU6XFxuKyAqXFxuKyAqICAgICAgL3N5cy9rZXJuZWwvZGVidWcvbW0vXFxuKyAqICAgICAgfC0tIGZyZWVcXG4rICogICAgICBgLS0gbm9kZS0wXFxuKyAqICAgICAgICAgfC0tIHpvbmUtRE1BXFxuKyAqICAgICAgICAgfCAgIHwtLSBvcmRlci0wXFxuKyAqICAgICAgICAgfCAgIHwgICB8LS0gbWlncmF0ZS1IaWdoQXRvbWljXFxuKyAqICAgICAgICAgfCAgIHwgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xcbisgKiAgICAgICAgIHwgICB8ICAgfC0tIG1pZ3JhdGUtTW92YWJsZVxcbisgKiAgICAgICAgIHwgICB8ICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcXG4rICogICAgICAgICB8ICAgfCAgIHwtLSBtaWdyYXRlLVJlY2xhaW1hYmxlXFxuKyAqICAgICAgICAgfCAgIHwgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xcbisgKiAgICAgICAgIHwgICB8ICAgYC0tIG1pZ3JhdGUtVW5tb3ZhYmxlXFxuKyAqICAgICAgICAgfCAgIHwgICAgICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xcbisgKiAgICAgICAgIHwgICB8LS0gLi4uXFxuKyAqICAgICAgICAgfCAgIHxcXG4rICogICAgICAgICB8ICAgYC0tIG9yZGVyLTlcXG4rICogICAgICAgICB8ICAgICAgIHwtLSBtaWdyYXRlLUhpZ2hBdG9taWNcXG4rICogICAgICAgICB8ICAgICAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXFxuKyAqICAgICAgICAgfCAgICAgICB8LS0gbWlncmF0ZS1Nb3ZhYmxlXFxuKyAqICAgICAgICAgfCAgICAgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xcbisgKiAgICAgICAgIHwgICAgICAgfC0tIG1pZ3JhdGUtUmVjbGFpbWFibGVcXG4rICogICAgICAgICB8ICAgICAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXFxuKyAqICAgICAgICAgfCAgICAgICBgLS0gbWlncmF0ZS1Vbm1vdmFibGVcXG4rICogICAgICAgICB8ICAgICAgICAgICBgLS0gbnJfcGFnZXNfYWxsb2NzXFxuKyAqICAgICAgICAgYC0tIHpvbmUtTm9ybWFsXFxuKyAqICAgICAgICAgICAgIHwtLSBvcmRlci0wXFxuKyAqICAgICAgICAgICAgIHwgICB8LS0gbWlncmF0ZS1IaWdoQXRvbWljXFxuKyAqICAgICAgICAgICAgIHwgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xcbisgKiAgICAgICAgICAgICB8ICAgfC0tIG1pZ3JhdGUtTW92YWJsZVxcbisgKiAgICAgICAgICAgICB8ICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcXG4rICogICAgICAgICAgICAgfCAgIHwtLSBtaWdyYXRlLVJlY2xhaW1hYmxlXFxuKyAqICAgICAgICAgICAgIHwgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xcbisgKiAgICAgICAgICAgICB8ICAgYC0tIG1pZ3JhdGUtVW5tb3ZhYmxlXFxuKyAqICAgICAgICAgICAgIHwgICAgICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xcbisgKiAgICAgICAgICAgICB8LS0gLi4uLlxcbisgKiAgICAgICAgICAgICB8XFxuKyAqICAgICAgICAgICAgIGAtLSBvcmRlci05XFxuKyAqICAgICAgICAgICAgICAgICB8LS0gbWlncmF0ZS1IaWdoQXRvbWljXFxuKyAqICAgICAgICAgICAgICAgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xcbisgKiAgICAgICAgICAgICAgICAgfC0tIG1pZ3JhdGUtTW92YWJsZVxcbisgKiAgICAgICAgICAgICAgICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcXG4rICogICAgICAgICAgICAgICAgIHwtLSBtaWdyYXRlLVJlY2xhaW1hYmxlXFxuKyAqICAgICAgICAgICAgICAgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xcbisgKiAgICAgICAgICAgICAgICAgYC0tIG1pZ3JhdGUtVW5tb3ZhYmxlXFxuKyAqICAgICAgICAgICAgICAgICAgICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xcbisgKlxcbisgKiBVc2FnZTpcXG4rICpcXG4rICogMS4gVG8gdHJpZ2dlciB0aGUgYWxsb2NhdGlvbiwgbmF2aWdhdGUgdG8gdGhlIGRlYnVnZnMgcGF0aCBjb3JyZXNwb25kaW5nXFxuKyAqICAgIHRvIHlvdXIgdGFyZ2V0IG5vZGUsIG1lbW9yeSB6b25lLCBhbGxvY2F0aW9uIG9yZGVyLCBhbmQgbWlncmF0aW9uIHR5cGUsXFxuKyAqICAgIHRoZW4gd3JpdGUgdGhlIHJlcXVlc3RlZCBhbGxvY2F0aW9uIGNvdW50IHRvIG5yX3BhZ2VzX2FsbG9jcy5cXG4rICpcXG4rICogICAgRm9yIGV4YW1wbGUsIHRvIG1ha2UgMyBhbGxvY3Mgb2Ygb3JkZXIgOSwgTWlncmF0ZSBUeXBlIE1vdmFibGUsXFxuKyAqICAgIFpvbmUgTm9ybWFsIGFuZCBOb2RlIDAsIHJ1bjpcXG4rICpcXG4rICogICAgJCBlY2hvIDMgXFx1MDAzZSAvc3lzL2tlcm5lbC9kZWJ1Zy9tbS9ub2RlLTAvem9uZS1Ob3JtYWwvb3JkZXItOS9taWdyYXRlLU1vdmFibGUvbnJfcGFnZXNfYWxsb2NzXFxuKyAqXFxuKyAqIDIuIEZvciBlYWNoIGFsbG9jYXRpb24gY3JlYXRlZCwgYSBjb3JyZXNwb25kaW5nIGZpbGUgbmFtZWQgc2VxdWVudGlhbGx5XFxuKyAqICAgICgxLCAyLCBuKSB3aWxsIGFwcGVhciBpbiB0aGF0IGRpcmVjdG9yeS5cXG4rICpcXG4rICogICAgJCBscyAvc3lzL2tlcm5lbC9kZWJ1Zy9tbS9ub2RlLTAvem9uZS1Ob3JtYWwvb3JkZXItOS9taWdyYXRlLU1vdmFibGUvXFxuKyAqICAgIDEgICAyICAgMyAgbnJfcGFnZXNfYWxsb2NzXFxuKyAqXFxuKyAqIDMuIFRvIGZyZWUgdGhlIGFsbG9jYXRpb24sIHdyaXRlIHRoZSBhbGxvY2F0aW9uIGZpbGUgbmFtZSBpbiAvc3lzL2tlcm5lbC9kZWJ1Zy9tbS9mcmVlLlxcbisgKiAgICBGb3IgZXhhbXBsZSwgdG8gcmVsZWFzZSB0aGUgMm5kIGFsbG9jYXRpb24gcnVuOlxcbisgKlxcbisgKiAgICAkIGVjaG8gMiBcXHUwMDNlIC9zeXMva2VybmVsL2RlYnVnL21tL2ZyZWVcXG4rICovXFxuK1xcbisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FIFxcXCI6IFxcXCIgZm10XFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYXRvbWljLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9lcnJuby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvZGVidWdmcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvZ2ZwLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9nZnBfdHlwZXMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2hpZ2htZW0uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2tlcm5lbC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbW16b25lLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9tb2R1bGUuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L25vZGVtYXNrLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9wcmludGsuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3hhcnJheS5oXFx1MDAzZVxcbitcXG4rc3RydWN0IGRlbnRyeSAqbW1kaXI7XFxuK1xcbisvKipcXG4rICogYXRvbWljX2xvbmdfdCBhbGxvY3NfZmlsZV9zZXEgLSBSZXByZXNlbnRzIHRoZSBuYW1pbmcgc2VxdWVuY2UgdXNlZCBmb3JcXG4rICogYWxsb2NhdGlvbiBmaWxlcy5cXG4rICovXFxuK2F0b21pY19sb25nX3QgYWxsb2NzX2ZpbGVfc2VxID0gQVRPTUlDX0lOSVQoMCk7XFxuK1xcbisvKipcXG4rICogYWxsb2NzX3hhIC0gUmVwcmVzZW50IHRoZSB4YXJyYXkgdGhhdCBjb250YWlucyB0aGUgYWN0dWFsIGFsbG9jYXRpb25zIHBlcmZvcm1cXG4rICogYnkgdGhpcyBkcml2ZXIuXFxuKyAqL1xcbitzdGF0aWMgREVGSU5FX1hBUlJBWShhbGxvY3NfeGEpO1xcbitcXG4rLyoqXFxuKyAqIHN0cnVjdCByZXFfYWxsb2MgLSBSZXByZXNlbnRzIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvblxcbisgKiBAbm9kZV9pZHg6IFRoZSBOb2RlIGluZGV4IHRvIGFsbG9jYXRlIGZyb20uXFxuKyAqIEB6b25lX2lkeDogVGhlIFpvbmUgaW5kZXggdG8gYWxsb2NhdGUgZnJvbS5cXG4rICogQG9yZGVyOiBUaGUgT3JkZXIgb2YgcGFnZXMgdG8gYWxsb2NhdGUuXFxuKyAqIEBtaWdyYXRlX3R5cGU6IFRoZSBNaWdyYXRlIHR5cGUgdG8gYWxsb2NhdGUgZnJvbS5cXG4rICogQHBhcmVudGRpcjogVGhlIHBhcmVudCBkaXIgd2hlcmUgdGhlIGZpbGUgcmVwcmVzZW50aW5nIHRoZSBhbGxvYyB3YXMgY3JlYXRlZC5cXG4rICovXFxuK3N0cnVjdCByZXFfYWxsb2Mge1xcbitcXHRpbnQgbm9kZV9pZHg7XFxuK1xcdGludCB6b25lX2lkeDtcXG4rXFx0aW50IG9yZGVyO1xcbitcXHRpbnQgbWlncmF0ZV90eXBlO1xcbitcXHRzdHJ1Y3QgZGVudHJ5ICpwYXJlbnRkaXI7XFxuK307XFxuK1xcbisvKlxcbisgKiBzdHJ1Y3QgcGFnZV9hbGxvYyAtIFJlcHJlc2VudHMgdGhlIHBhZ2UgYWxsb2NhdGlvbi5cXG4rICogQHBhZ2U6IFRoZSBwb2ludGVyIHRvIHRoZSBwYWdlKHMpIGFsbG9jYXRlZC5cXG4rICogQHJlcV9hbGxvYzogVGhlIGRldGFpbHMgb2YgdGhlIGFsbG9jYXRpb24uXFxuKyAqIEBhbGxvY19kZW50cnk6IFRoZSBwb2ludGVyIHRvIHRoZSBmaWxlIHRoYXQgcmVwcmVzZW50cyB0aGUgYWxsb2NhdGlvbi5cXG4rICovXFxuK3N0cnVjdCBwYWdlX2FsbG9jIHtcXG4rXFx0c3RydWN0IHBhZ2UgKnBhZ2U7XFxuK1xcdHN0cnVjdCByZXFfYWxsb2MgKnJlcV9hbGxvYztcXG4rXFx0c3RydWN0IGRlbnRyeSAqYWxsb2NfZGVudHJ5O1xcbit9O1xcbitcXG4rc3RydWN0IGttZW1fY2FjaGUgKnJlcV9hbGxvY19jYWNoZTtcXG4rc3RydWN0IGttZW1fY2FjaGUgKnBhZ2VfYWxsb2NfY2FjaGU7XFxuK1xcbitpbmxpbmUgdm9pZCBzZXRfem9uZV90b19hbGxvY19mcm9tKGludCB6b25lX2lkeCwgZ2ZwX3QgKmZsYWdzX3B0cilcXG4re1xcbitcXHRzd2l0Y2ggKHpvbmVfaWR4KSB7XFxuKyNpZmRlZiBDT05GSUdfWk9ORV9ETUFcXG4rXFx0Y2FzZSBaT05FX0RNQTpcXG4rXFx0XFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9ETUE7XFxuK1xcdFxcdGJyZWFrO1xcbisjZW5kaWZcXG4rI2lmZGVmIENPTkZJR19aT05FX0RNQTMyXFxuK1xcdGNhc2UgWk9ORV9ETUEzMjpcXG4rXFx0XFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9ETUEzMjtcXG4rXFx0XFx0YnJlYWs7XFxuKyNlbmRpZlxcbisjaWZkZWYgQ09ORklHX0hJR0hNRU1cXG4rXFx0Y2FzZSBaT05FX0hJR0hNRU06XFxuK1xcdFxcdCpmbGFnc19wdHIgfD0gX19HRlBfSElHSE1FTTtcXG4rXFx0XFx0YnJlYWs7XFxuKyNlbmRpZlxcbitcXHRjYXNlIFpPTkVfTU9WQUJMRTpcXG4rXFx0XFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9NT1ZBQkxFO1xcbitcXHRcXHRicmVhaztcXG4rXFx0Y2FzZSBaT05FX05PUk1BTDpcXG4rXFx0ZGVmYXVsdDpcXG4rXFx0XFx0KmZsYWdzX3B0ciB8PSAwO1xcbitcXHRcXHRicmVhaztcXG4rXFx0fVxcbit9XFxuK1xcbitpbmxpbmUgdm9pZCBzZXRfbWlncmF0ZV90eXBlX3RvX2FsbG9jX2Zyb20oaW50IG1pZ3JhdGVfdHlwZSwgZ2ZwX3QgKmZsYWdzX3B0cilcXG4re1xcbitcXHRzd2l0Y2ggKG1pZ3JhdGVfdHlwZSkge1xcbitcXHRjYXNlIE1JR1JBVEVfVU5NT1ZBQkxFOlxcbitcXHRcXHQqZmxhZ3NfcHRyIFxcdTAwMjY9IH4oX19HRlBfUkVDTEFJTUFCTEUgfCBfX0dGUF9NT1ZBQkxFKTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgTUlHUkFURV9SRUNMQUlNQUJMRTpcXG4rXFx0XFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9SRUNMQUlNQUJMRTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgTUlHUkFURV9ISUdIQVRPTUlDOlxcbitcXHRcXHQqZmxhZ3NfcHRyIHw9IF9fR0ZQX0hJR0g7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRjYXNlIE1JR1JBVEVfTU9WQUJMRTogZGVmYXVsdDpcXG4rXFx0XFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9NT1ZBQkxFO1xcbitcXHRcXHRicmVhaztcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgc3NpemVfdCBwYWdlX2FsbG9jX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1YnVmLFxcbitcXHRcXHRcXHRcXHQgICAgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKVxcbit7XFxuK1xcdC8qICBXaGljaCBpbmZvcm1hdGlvbiBzaG91bGQgYmUgcHJpbnQgYWJvdXQgdGhlIHBhZ2Ugb3IgYWxsb2NhdGlvbj8gKi9cXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBhZ2VfYWxsb2NfZm9wcyA9IHtcXG4rXFx0Lm93bmVyID0gVEhJU19NT0RVTEUsXFxuK1xcdC5vcGVuID0gc2ltcGxlX29wZW4sXFxuK1xcdC5yZWFkID0gcGFnZV9hbGxvY19yZWFkLFxcbit9O1xcbitcXG4rc3RhdGljIGludCBtYWtlX2FsbG9jKHN0cnVjdCByZXFfYWxsb2MgKnJlcSxcXG4rXFx0XFx0XFx0ICAgIGdmcF90IGZsYWdzLCB1bnNpZ25lZCBsb25nICphbGxvY19pZClcXG4re1xcbitcXHRzdHJ1Y3QgcGFnZV9hbGxvYyAqcGE7XFxuK1xcdHN0cnVjdCBwYWdlICpwYWdlO1xcbitcXHRjaGFyIG5ld19hbGxvY19uYW1lWzEyXTtcXG4rXFx0c3RydWN0IGRlbnRyeSAqbmV3X2FsbG9jX2RlbnRyeTtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHBhZ2UgPSBhbGxvY19wYWdlc19ub2RlX25vcHJvZihyZXEtXFx1MDAzZW5vZGVfaWR4LCBmbGFncywgcmVxLVxcdTAwM2VvcmRlcik7XFxuK1xcdGlmIChwYWdlKSB7XFxuK1xcdFxcdHBhID0ga21lbV9jYWNoZV9hbGxvYyhwYWdlX2FsbG9jX2NhY2hlLCBHRlBfS0VSTkVMKTtcXG4rXFx0XFx0aWYgKCFwYSkge1xcbitcXHRcXHRcXHRyZXQgPSAtRU5PTUVNO1xcbitcXHRcXHRcXHRnb3RvIGZyZWVfcGFnZXM7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdCphbGxvY19pZCA9IGF0b21pY19sb25nX2luY19yZXR1cm4oXFx1MDAyNmFsbG9jc19maWxlX3NlcSk7XFxuK1xcdFxcdHJldCA9IHhhX2luc2VydChcXHUwMDI2YWxsb2NzX3hhLCAqYWxsb2NfaWQsIHBhLCBHRlBfS0VSTkVMKTtcXG4rXFx0XFx0aWYgKHJldClcXG4rXFx0XFx0XFx0Z290byBmcmVlX3BhZ2VfYWxsb2M7XFxuK1xcbitcXHRcXHRzbnByaW50ZihuZXdfYWxsb2NfbmFtZSwgc2l6ZW9mKG5ld19hbGxvY19uYW1lKSwgXFxcIiVsdVxcXCIsXFxuK1xcdFxcdFxcdCAqYWxsb2NfaWQpO1xcbitcXG4rXFx0XFx0bmV3X2FsbG9jX2RlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoXFxuK1xcdFxcdFxcdG5ld19hbGxvY19uYW1lLCAwNjQ0LCByZXEtXFx1MDAzZXBhcmVudGRpcixcXG4rXFx0XFx0XFx0cGEsIFxcdTAwMjZwYWdlX2FsbG9jX2ZvcHMpO1xcbitcXHRcXHRpZiAoSVNfRVJSKG5ld19hbGxvY19kZW50cnkpKSB7XFxuK1xcdFxcdFxcdHJldCA9IFBUUl9FUlIobmV3X2FsbG9jX2RlbnRyeSk7XFxuK1xcdFxcdFxcdGdvdG8gZXJhc2VfeGFfZW50cnk7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdHBhLVxcdTAwM2VyZXFfYWxsb2MgPSByZXE7XFxuK1xcdFxcdHBhLVxcdTAwM2VwYWdlID0gcGFnZTtcXG4rXFx0XFx0cGEtXFx1MDAzZWFsbG9jX2RlbnRyeSA9IG5ld19hbGxvY19kZW50cnk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rXFxuK2VyYXNlX3hhX2VudHJ5OlxcbitcXHR4YV9lcmFzZShcXHUwMDI2YWxsb2NzX3hhLCAqYWxsb2NfaWQpO1xcbitcXG4rZnJlZV9wYWdlX2FsbG9jOlxcbitcXHRrbWVtX2NhY2hlX2ZyZWUocGFnZV9hbGxvY19jYWNoZSwgcGEpO1xcbitcXG4rZnJlZV9wYWdlczpcXG4rXFx0X19mcmVlX3BhZ2VzKHBhZ2UsIHBhLVxcdTAwM2VyZXFfYWxsb2MtXFx1MDAzZW9yZGVyKTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgZnJlZV9hbGxvY19oZWxwZXIodW5zaWduZWQgbG9uZyBhbGxvY19pZClcXG4re1xcbitcXHRzdHJ1Y3QgcGFnZV9hbGxvYyAqcGE7XFxuK1xcbitcXHRwYSA9IHhhX2VyYXNlKFxcdTAwMjZhbGxvY3NfeGEsIGFsbG9jX2lkKTtcXG4rXFx0aWYgKCFwYSkge1xcbitcXHRcXHRwcl9lcnIoXFxcIlRoZSBhbGxvY19pZCAlbHUgd2FzIG5vdCBmb3VuZCFcXFwiLCBhbGxvY19pZCk7XFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHR9XFxuK1xcbitcXHRfX2ZyZWVfcGFnZXMocGEtXFx1MDAzZXBhZ2UsIHBhLVxcdTAwM2VyZXFfYWxsb2MtXFx1MDAzZW9yZGVyKTtcXG4rXFx0ZGVidWdmc19yZW1vdmUocGEtXFx1MDAzZWFsbG9jX2RlbnRyeSk7XFxuK1xcdGttZW1fY2FjaGVfZnJlZShwYWdlX2FsbG9jX2NhY2hlLCBwYSk7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJlcV9wYWdlX2FsbG9jX3dyaXRlKCkgLSBBbGxvY2F0ZXMgdGhlIHBhZ2VzIG9uIHRoZSByZXF1ZXN0ZWQgbm9kZSwgem9uZSxcXG4rICogb3JkZXIgYW5kIG1pZ3JhdGUgdHlwZS4gT25jZSB0aGUgYWxsb2NhdGlvbiBpcyBwZXJmb3JtZWQsIGEgZmlsZSBpcyBjcmVhdGVkXFxuKyAqIHRvIGZyZWUgdGhlIGFsbG9jYXRpb24gbGF0ZXIuXFxuKyAqL1xcbitzdGF0aWMgc3NpemVfdCByZXFfcGFnZV9hbGxvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsXFxuK1xcdFxcdFxcdFxcdCAgICAgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKVxcbit7XFxuK1xcdHN0cnVjdCByZXFfYWxsb2MgKnJlcSA9IGZpbGUtXFx1MDAzZXByaXZhdGVfZGF0YTtcXG4rXFx0dW5zaWduZWQgbG9uZyBhbGxvY19pZDtcXG4rXFx0dW5zaWduZWQgbG9uZyBucl9wYWdlc19hbGxvY3M7XFxuK1xcdHVuc2lnbmVkIGxvbmcgKmFsbG9jc19pZHM7XFxuK1xcdGdmcF90IGZsYWdzID0gMDtcXG4rXFx0aW50IHJldDtcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRyZXQgPSBrc3RydG91bF9mcm9tX3VzZXIodWJ1ZiwgY250LCAxMCwgXFx1MDAyNm5yX3BhZ2VzX2FsbG9jcyk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRhbGxvY3NfaWRzID0ga21hbGxvY19hcnJheShucl9wYWdlc19hbGxvY3MsIHNpemVvZih1bnNpZ25lZCBsb25nKSxcXG4rXFx0XFx0XFx0XFx0XFx0R0ZQX0tFUk5FTCk7XFxuK1xcdGlmICghYWxsb2NzX2lkcylcXG4rXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcbitcXHRzZXRfem9uZV90b19hbGxvY19mcm9tKHJlcS1cXHUwMDNlem9uZV9pZHgsIFxcdTAwMjZmbGFncyk7XFxuK1xcdHNldF9taWdyYXRlX3R5cGVfdG9fYWxsb2NfZnJvbShyZXEtXFx1MDAzZW1pZ3JhdGVfdHlwZSwgXFx1MDAyNmZsYWdzKTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9wYWdlc19hbGxvY3M7IGkrKykge1xcbitcXHRcXHRyZXQgPSBtYWtlX2FsbG9jKHJlcSwgZmxhZ3MsIFxcdTAwMjZhbGxvY19pZCk7XFxuK1xcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdGdvdG8gZnJlZV9hbGxvY3M7XFxuK1xcbitcXHRcXHRhbGxvY3NfaWRzW2ldID0gYWxsb2NfaWQ7XFxuK1xcdH1cXG4rXFxuK1xcdGtmcmVlKGFsbG9jc19pZHMpO1xcbitcXG4rXFx0cmV0dXJuIGNudDtcXG4rXFxuK2ZyZWVfYWxsb2NzOlxcbitcXHQvKiBGcmVlIGFsbCB0aGUgcGFnZXMgcHJldmlvdXNseSBhbGxvY2F0ZWQuICovXFxuK1xcdGZvciAoaW50IGogPSAwOyBqIFxcdTAwM2MgaTsgaisrKSB7XFxuK1xcdFxcdGludCByZXQyID0gZnJlZV9hbGxvY19oZWxwZXIoYWxsb2NzX2lkc1tqXSk7XFxuK1xcbitcXHRcXHRpZiAocmV0MilcXG4rXFx0XFx0XFx0cHJfZXJyKFxcXCJVbmFibGUgdG8gZnJlZSBwYWdlcyBhc3NvY2lhdGVkIHdpdGggZmlsZSAlbHVcXFwiLFxcbitcXHRcXHRcXHQgICAgICAgYWxsb2NzX2lkc1tqXSk7XFxuK1xcdH1cXG4rXFxuK1xcdGtmcmVlKGFsbG9jc19pZHMpO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVxX3BhZ2VfYWxsb2NfZm9wcyA9IHtcXG4rXFx0Lm93bmVyID0gVEhJU19NT0RVTEUsXFxuK1xcdC5vcGVuID0gc2ltcGxlX29wZW4sXFxuK1xcdC53cml0ZSA9IHJlcV9wYWdlX2FsbG9jX3dyaXRlLFxcbit9O1xcbitcXG4rLyoqXFxuKyAqIGZyZWVfcGFnZV9hbGxvY193cml0ZSgpIC0gZnJlZSB0aGUgcHJldmlvdXNseSBhbGxvY2F0ZWQgcGFnZXMuXFxuKyAqIEBmaWxlOiBGaWxlIHdoZXJlIHRoZSB1c2VyIGlzIHdyaXRpbmcuXFxuKyAqIEB1YnVmOiBDb250YWlucyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0aGUgdXNlciB3YW50cyB0byBkZWxldGUgYW5kIGhhdmUgdGhlXFxuKyAqICAgICAgIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmaWxlIGZyZWVkLlxcbisgKiBAY250OiBTaXplIG9mIEB1YnVmLlxcbisgKiBAcHBvczogQ3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZmlsZS5cXG4rICovXFxuK3N0YXRpYyBzc2l6ZV90IGZyZWVfcGFnZV9hbGxvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsIHNpemVfdCBjbnQsXFxuK1xcdFxcdFxcdFxcdCAgICAgIGxvZmZfdCAqcHBvcylcXG4re1xcbitcXHRpbnQgcmV0O1xcbitcXHR1bnNpZ25lZCBsb25nIGFsbG9jX2lkO1xcbitcXG4rXFx0cmV0ID0ga3N0cnRvdWxfZnJvbV91c2VyKHVidWYsIGNudCwgMTAsIFxcdTAwMjZhbGxvY19pZCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBmcmVlX2FsbG9jX2hlbHBlcihhbGxvY19pZCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXR1cm4gY250O1xcbit9XFxuK1xcbitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmcmVlX3BhZ2VfYWxsb2NfZm9wcyA9IHtcXG4rXFx0Lm93bmVyID0gVEhJU19NT0RVTEUsXFxuK1xcdC53cml0ZSA9IGZyZWVfcGFnZV9hbGxvY193cml0ZSxcXG4rfTtcXG4rXFxuKy8qKlxcbisgKiBjcmVhdGVfbnJfcGFnZXNfYWxsb2NzX2ZpbGUoKSAtIENyZWF0ZXMgdGhlIGZpbGUgXFxcIm5yX3BhZ2VzX2FsbG9jc1xcXCIuXFxuKyAqXFxuKyAqIFRoZSBcXFwibnJfcGFnZXNfYWxsb2NzXFxcIiBmaWxlIHdpbGwgYmUgdXNlZCB0byB3cml0ZSB0aGUgbnVtYmVyIG9mIGFsbG9jYXRpb25zXFxuKyAqIHRoYXQgd2lsbCBiZSBwZXJmb3JtZWQuIFdoZW4gdGhlIGFsbG9jYXRpb25zIGFyZSBwZXJmb3JtZWQsIGEgbmV3IGZpbGUgZm9yXFxuKyAqIGVhY2ggYWxsb2NhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgaW4gQG1pZ3JhdGVkaXIuXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBjcmVhdGVfbnJfcGFnZXNfYWxsb2NzX2ZpbGUoc3RydWN0IGRlbnRyeSAqbWlncmF0ZWRpcixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgaW50IG5vZGVfaWR4LCBpbnQgem9uZV9pZHgsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIGludCBvcmRlciwgaW50IG10eXBlKVxcbit7XFxuK1xcdHN0cnVjdCByZXFfYWxsb2MgKnJlcTtcXG4rXFx0c3RydWN0IGRlbnRyeSAqbnJfcGFnZXM7XFxuK1xcbitcXHRyZXEgPSBrbWVtX2NhY2hlX2FsbG9jKHJlcV9hbGxvY19jYWNoZSwgR0ZQX0tFUk5FTCk7XFxuK1xcdGlmICghcmVxKSB7XFxuK1xcdFxcdHByX2VycihcXFwiRmFpbGVkIHRvIGNyZWF0ZSBucl9wYWdlc19hbGxvY3NfaW5mb1xcXCIpO1xcbitcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFx0fVxcbitcXG4rXFx0cmVxLVxcdTAwM2Vub2RlX2lkeCA9IG5vZGVfaWR4O1xcbitcXHRyZXEtXFx1MDAzZXpvbmVfaWR4ID0gem9uZV9pZHg7XFxuK1xcdHJlcS1cXHUwMDNlb3JkZXIgPSBvcmRlcjtcXG4rXFx0cmVxLVxcdTAwM2VtaWdyYXRlX3R5cGUgPSBtdHlwZTtcXG4rXFx0cmVxLVxcdTAwM2VwYXJlbnRkaXIgPSBtaWdyYXRlZGlyO1xcbitcXG4rXFx0bnJfcGFnZXMgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKFxcXCJucl9wYWdlc19hbGxvY3NcXFwiLCAwNjQ0LCBtaWdyYXRlZGlyLCByZXEsXFxuK1xcdFxcdFxcdFxcdCAgICAgICBcXHUwMDI2cmVxX3BhZ2VfYWxsb2NfZm9wcyk7XFxuK1xcdGlmIChJU19FUlIobnJfcGFnZXMpKVxcbitcXHRcXHRyZXR1cm4gUFRSX0VSUihucl9wYWdlcyk7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGNyZWF0ZV9taWdyYXRlX3R5cGVfc3ViZGlycygpIC0gQ3JlYXRlcyBhIGRpcmVjdG9yeSBmb3IgZWFjaCBtaWdyYXRlIHR5cGVcXG4rICogaW5zaWRlIHRoZSBvcmRlciBkaXJlY3RvcnkuIE9uY2UgdGhlIG1pZ3JhdGUgdHlwZSBkaXJlY3RvcnkgaXMgY3JlYXRlZCwgaXRcXG4rICogY3JlYXRlcyB0aGUgXFxcIm5yX2FsbG9jc1xcXCIgZmlsZSBhbmQgdGhlIFxcXCJmcmVlXFxcIiBmaWxlLlxcbisgKi9cXG4rc3RhdGljIGlubGluZSBpbnQgY3JlYXRlX21pZ3JhdGVfdHlwZV9zdWJkaXJzKHN0cnVjdCBkZW50cnkgKm9yZGVyZGlyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBpbnQgbm9kZV9pZHgsIGludCB6b25lX2lkeCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgaW50IG9yZGVyKVxcbit7XFxuK1xcdHN0cnVjdCBkZW50cnkgKm1pZ3JhdGVkaXI7XFxuK1xcdGNoYXIgZGlybmFtZVsyNF07XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRmb3IgKGludCBtdHlwZSA9IDA7IG10eXBlIFxcdTAwM2MgTUlHUkFURV9UWVBFUzsgbXR5cGUrKykge1xcbisjaWZkZWYgQ09ORklHX0NNQVxcbitcXHRcXHRpZiAobXR5cGUgPT0gTUlHUkFURV9DTUEpIC8qIENNQSBhbGxvY3MgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0Ki9cXG4rXFx0XFx0XFx0Y29udGludWU7XFxuKyNlbmRpZlxcbisjaWZkZWYgQ09ORklHX01FTU9SWV9JU09MQVRJT05cXG4rXFx0XFx0aWYgKG10eXBlID09IE1JR1JBVEVfSVNPTEFURSkgLyogY2FuJ3QgYWxsb2NhdGUgZnJvbSBoZXJlICovXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbisjZW5kaWZcXG4rXFx0XFx0c25wcmludGYoZGlybmFtZSwgc2l6ZW9mKGRpcm5hbWUpLCBcXFwibWlncmF0ZS0lc1xcXCIsXFxuK1xcdFxcdFxcdCBtaWdyYXRldHlwZV9uYW1lc1ttdHlwZV0pO1xcbitcXHRcXHRtaWdyYXRlZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKGRpcm5hbWUsIG9yZGVyZGlyKTtcXG4rXFx0XFx0aWYgKElTX0VSUihtaWdyYXRlZGlyKSlcXG4rXFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIobWlncmF0ZWRpcik7XFxuK1xcbitcXHRcXHRyZXQgPSBjcmVhdGVfbnJfcGFnZXNfYWxsb2NzX2ZpbGUobWlncmF0ZWRpciwgbm9kZV9pZHgsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgem9uZV9pZHgsIG9yZGVyLCBtdHlwZSk7XFxuK1xcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKipcXG4rICogY3JlYXRlX3BhZ2Vfb3JkZXJzX3N1YmRpcnMoKSAtIENyZWF0ZXMgYSBkaXJlY3RvcnkgZm9yIGVhY2ggcGFnZSBvcmRlciBpbnNpZGVcXG4rICogdGhlIHpvbmUgZGlyZWN0b3J5LiBPbmNlIHRoYXQgdGhlIHBhZ2Ugb3JkZXIgZGlyZWN0b3J5IGlzIGNyZWF0ZWQsIGl0IGNyZWF0ZXNcXG4rICogYSBkaXJlY3RvcnkgZm9yIGVhY2ggbWlncmF0ZSB0eXBlLlxcbisgKi9cXG4rc3RhdGljIGlubGluZSBpbnQgY3JlYXRlX3BhZ2Vfb3JkZXJzX3N1YmRpcnMoc3RydWN0IGRlbnRyeSAqem9uZWRpcixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICBpbnQgbm9kZV9pZHgsIGludCB6b25lX2lkeCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3Qgem9uZSAqem9uZSlcXG4re1xcbitcXHRzdHJ1Y3QgZGVudHJ5ICpvcmRlcmRpcjtcXG4rXFx0Y2hhciBkaXJuYW1lWzEyXTtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdGZvciAoaW50IG9yZGVyID0gMDsgb3JkZXIgXFx1MDAzYyBOUl9QQUdFX09SREVSUzsgb3JkZXIrKykge1xcbitcXHRcXHRzbnByaW50ZihkaXJuYW1lLCBzaXplb2YoZGlybmFtZSksIFxcXCJvcmRlci0lZFxcXCIsIG9yZGVyKTtcXG4rXFx0XFx0b3JkZXJkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoZGlybmFtZSwgem9uZWRpcik7XFxuK1xcdFxcdGlmIChJU19FUlIob3JkZXJkaXIpKVxcbitcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUihvcmRlcmRpcik7XFxuK1xcbitcXHRcXHRyZXQgPSBjcmVhdGVfbWlncmF0ZV90eXBlX3N1YmRpcnMob3JkZXJkaXIsIG5vZGVfaWR4LCB6b25lX2lkeCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICBvcmRlcik7XFxuK1xcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKipcXG4rICogY3JlYXRlX3pvbmVzX3N1YmRpcnMoKSAtIENyZWF0ZXMgYSBkaXJlY3RvcnkgZm9yIGVhY2ggcG9wdWxhdGVkIHpvbmUgaW4gdGhlXFxuKyAqIG5vZGUuIE9uY2UgdGhhdCB0aGUgem9uZSBkaXJlY3RvcnkgaXMgY3JlYXRlZCwgaXQgY3JlYXRlcyBhIGRpcmVjdG9yeSBmb3JcXG4rICogZWFjaCBvcmRlciBzdXBwb3J0ZWQuXFxuKyAqXFxuKyAqIE5vdGU6IFpPTkVfREVWSUNFIHBhZ2VzIHdvbid0IGJlIGFsbG9jYXRlZCB1c2luZyB0aGlzIGRyaXZlci4gVGhlIG1haW4gcmVhc29uXFxuKyAqIGlzIGJlY2F1c2UgdGhleSBhcmUgbm90IG1hbmFnZWQgYnkgdGhlIEJ1ZGR5IEFsbG9jYXRvciBvciBDTUEgYWxsb2NhdG9yLlxcbisgKi9cXG4rc3RhdGljIGlubGluZSBpbnQgY3JlYXRlX3pvbmVzX3N1YmRpcnMoc3RydWN0IGRlbnRyeSAqbm9kZWRpciwgaW50IG5vZGVfaWR4LFxcbitcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdGEpXFxuK3tcXG4rXFx0c3RydWN0IGRlbnRyeSAqem9uZWRpcjtcXG4rXFx0c3RydWN0IHpvbmUgKnpvbmU7XFxuK1xcdHN0cnVjdCB6b25lICpub2RlX3pvbmVzID0gcGdkYXRhLVxcdTAwM2Vub2RlX3pvbmVzO1xcbitcXHRpbnQgem9uZV9pZHg7XFxuK1xcdGNoYXIgZGlybmFtZVsyNF07XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRmb3IgKHpvbmUgPSBub2RlX3pvbmVzLCB6b25lX2lkeCA9IDA7IHpvbmUgLSBub2RlX3pvbmVzIFxcdTAwM2MgTUFYX05SX1pPTkVTO1xcbitcXHQgICAgICsrem9uZSwgKyt6b25lX2lkeCkge1xcbitcXHRcXHRpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFxuK1xcdFxcdC8qIFpPTkVfREVWSUNFIHBhZ2VzIHdvbid0IGJlIGFsbG9jYXRlZCB1c2luZyB0aGlzIGRyaXZlci4gKi9cXG4rXFx0XFx0aWYgKHpvbmVfaXNfem9uZV9kZXZpY2Uoem9uZSkpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4rXFx0XFx0c25wcmludGYoZGlybmFtZSwgc2l6ZW9mKGRpcm5hbWUpLCBcXFwiem9uZS0lc1xcXCIsIHpvbmUtXFx1MDAzZW5hbWUpO1xcbitcXHRcXHR6b25lZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKGRpcm5hbWUsIG5vZGVkaXIpO1xcbitcXHRcXHRpZiAoSVNfRVJSKHpvbmVkaXIpKVxcbitcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUih6b25lZGlyKTtcXG4rXFxuK1xcdFxcdHJldCA9IGNyZWF0ZV9wYWdlX29yZGVyc19zdWJkaXJzKHpvbmVkaXIsIG5vZGVfaWR4LCB6b25lX2lkeCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0IHpvbmUpO1xcbitcXHRcXHRpZiAocmV0KVxcbitcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGNyZWF0ZV9ub2Rlc19zdWJkaXJzKCkgLSBDcmVhdGVzIGEgZGlyZWN0b3J5IGZvciBlYWNoIG9ubGluZSBub2RlIGluIHRoZVxcbisgKiBzeXN0ZW0uIE9uY2UgdGhhdCB0aGUgbm9kZSBkaXJlY3RvcnkgaXMgY3JlYXRlZCwgaXQgY3JlYXRlcyBhIGRpcmVjdG9yeSBmb3JcXG4rICogZWFjaCB6b25lIGluIHRoZSBub2RlLlxcbisgKi9cXG4rc3RhdGljIGlubGluZSBpbnQgY3JlYXRlX25vZGVzX3N1YmRpcnMoc3RydWN0IGRlbnRyeSAqbW1kaXIpXFxuK3tcXG4rXFx0c3RydWN0IGRlbnRyeSAqbm9kZWRpcjtcXG4rXFx0aW50IG5vZGVfaWR4O1xcbitcXHRjaGFyIGRpcm5hbWVbMTJdO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0Zm9yX2VhY2hfb25saW5lX25vZGUobm9kZV9pZHgpIHtcXG4rXFx0XFx0c3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdGEgPSBOT0RFX0RBVEEobm9kZV9pZHgpO1xcbitcXG4rXFx0XFx0c25wcmludGYoZGlybmFtZSwgc2l6ZW9mKGRpcm5hbWUpLCBcXFwibm9kZS0lZFxcXCIsIG5vZGVfaWR4KTtcXG4rXFx0XFx0bm9kZWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihkaXJuYW1lLCBtbWRpcik7XFxuK1xcdFxcdGlmIChJU19FUlIobm9kZWRpcikpXFxuK1xcdFxcdFxcdHJldHVybiBQVFJfRVJSKG5vZGVkaXIpO1xcbitcXG4rXFx0XFx0cmV0ID0gY3JlYXRlX3pvbmVzX3N1YmRpcnMobm9kZWRpciwgbm9kZV9pZHgsIHBnZGF0YSk7XFxuK1xcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IF9faW5pdCBwYWdlX2FsbG9jX2hvZ2dlcl9kZWJ1Z2ZzX2luaXQodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgZGVudHJ5ICpmcmVlX2ZpbGU7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRyZXFfYWxsb2NfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZShcXG4rXFx0XFx0XFxcInJlcV9hbGxvY19jYWNoZVxcXCIsIHNpemVvZihzdHJ1Y3QgcmVxX2FsbG9jKSwgMCxcXG4rXFx0XFx0U0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTtcXG4rXFx0aWYgKCFyZXFfYWxsb2NfY2FjaGUpIHtcXG4rXFx0XFx0cHJfZXJyKFxcXCJUaGUgcmVxX2FsbG9jX2NhY2hlIGNvdWxkbid0IGJlIGNyZWF0ZWRcXFwiKTtcXG4rXFx0XFx0cmV0ID0gLUVOT01FTTtcXG4rXFx0XFx0Z290byBlcnJvcl9leGl0O1xcbitcXHR9XFxuK1xcbitcXHRwYWdlX2FsbG9jX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoXFxuK1xcdFxcdFxcXCJwYWdlX2FsbG9jX2NhY2hlXFxcIiwgc2l6ZW9mKHN0cnVjdCBwYWdlX2FsbG9jKSwgMCxcXG4rXFx0XFx0U0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTtcXG4rXFx0aWYgKCFwYWdlX2FsbG9jX2NhY2hlKSB7XFxuK1xcdFxcdHByX2VycihcXFwiVGhlIHBhZ2VfYWxsb2NfY2FjaGUgY291bGRuJ3QgYmUgY3JlYXRlZFxcXCIpO1xcbitcXHRcXHRyZXQgPSAtRU5PTUVNO1xcbitcXHRcXHRnb3RvIGNsZWFuX3JlcV9hbGxvY19jYWNoZTtcXG4rXFx0fVxcbitcXG4rXFx0bW1kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoXFxcIm1tXFxcIiwgTlVMTCk7XFxuK1xcdGlmIChJU19FUlIobW1kaXIpKSB7XFxuK1xcdFxcdHByX2VycihcXFwiVW5hYmxlIHRvIGNyZWF0ZSBtbSBkaXJlY3RvcnlcXFwiKTtcXG4rXFx0XFx0cmV0ID0gUFRSX0VSUihtbWRpcik7XFxuK1xcdFxcdGdvdG8gY2xlYW5fcGFnZV9hbGxvY19jYWNoZTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gY3JlYXRlX25vZGVzX3N1YmRpcnMobW1kaXIpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRnb3RvIGNsZWFuX2RpcjtcXG4rXFxuK1xcdGZyZWVfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoXFxcImZyZWVcXFwiLCAwNjQ0LCBtbWRpciwgTlVMTCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx1MDAyNmZyZWVfcGFnZV9hbGxvY19mb3BzKTtcXG4rXFx0aWYgKElTX0VSUihmcmVlX2ZpbGUpKSB7XFxuK1xcdFxcdHJldCA9IFBUUl9FUlIoZnJlZV9maWxlKTtcXG4rXFx0XFx0Z290byBjbGVhbl9kaXI7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbitcXG4rY2xlYW5fZGlyOlxcbitcXHRkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUobW1kaXIpO1xcbitcXG4rY2xlYW5fcGFnZV9hbGxvY19jYWNoZTpcXG4rXFx0a21lbV9jYWNoZV9kZXN0cm95KHBhZ2VfYWxsb2NfY2FjaGUpO1xcbitcXG4rY2xlYW5fcmVxX2FsbG9jX2NhY2hlOlxcbitcXHRrbWVtX2NhY2hlX2Rlc3Ryb3kocmVxX2FsbG9jX2NhY2hlKTtcXG4rXFxuK2Vycm9yX2V4aXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIF9fZXhpdCBwYWdlX2FsbG9jX2hvZ2dlcl9kZWJ1Z2ZzX2V4aXQodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgcGFnZV9hbGxvYyAqcGE7XFxuK1xcdHVuc2lnbmVkIGxvbmcgaWR4O1xcbitcXG4rXFx0eGFfZm9yX2VhY2goXFx1MDAyNmFsbG9jc194YSwgaWR4LCBwYSkge1xcbitcXHRcXHRfX2ZyZWVfcGFnZXMocGEtXFx1MDAzZXBhZ2UsIHBhLVxcdTAwM2VyZXFfYWxsb2MtXFx1MDAzZW9yZGVyKTtcXG4rXFx0XFx0eGFfZXJhc2UoXFx1MDAyNmFsbG9jc194YSwgaWR4KTtcXG4rXFx0fVxcbitcXG4rXFx0ZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKG1tZGlyKTtcXG4rXFx0a21lbV9jYWNoZV9kZXN0cm95KHJlcV9hbGxvY19jYWNoZSk7XFxuK1xcdGttZW1fY2FjaGVfZGVzdHJveShwYWdlX2FsbG9jX2NhY2hlKTtcXG4rfVxcbitcXG4rbW9kdWxlX2luaXQocGFnZV9hbGxvY19ob2dnZXJfZGVidWdmc19pbml0KTtcXG4rbW9kdWxlX2V4aXQocGFnZV9hbGxvY19ob2dnZXJfZGVidWdmc19leGl0KTtcXG4rXFxuK01PRFVMRV9BVVRIT1IoXFxcIkp1YW4gWWVzY2FzXFxcIik7XFxuK01PRFVMRV9ERVNDUklQVElPTihcXFwiTW9kdWxlIHRvIGFsbG9jIHBhZ2VzIHRvIGdlbmVyYXRlIG1lbW9yeSBwcmVzc3VyZVxcXCIpO1xcbitNT0RVTEVfTElDRU5TRShcXFwiR1BMXFxcIik7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI0VDEyOjE2OjIxLjk0NDk2MTk5OFoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjIxNTEwNjkzNzIyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlBBR0VBTExPQ19IT0dHRVJcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJyZXFfcGFnZV9hbGxvY193cml0ZVwiLFxuICAgIFwiZnJlZV9wYWdlX2FsbG9jX3dyaXRlXCIsXG4gICAgXCJtYWtlX2FsbG9jXCIsXG4gICAgXCJmcmVlX2FsbG9jX2hlbHBlclwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZGVidWdmcyBpbnRlcmZhY2UgZm9yIGFsbG9jYXRpbmcgcGFnZXMgZnJvbSBzcGVjaWZpYyBub2Rlcywgem9uZXMsIG1pZ3JhdGUgdHlwZXMsIGFuZCBvcmRlcnMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIHRlc3RpbmcvZGVidWdnaW5nIHRvb2wgdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBtZW1vcnkgcHJlc3N1cmUgYW5kIHRlc3QgdGhlIGNvcmUgcGFnZSBhbGxvY2F0b3IgYW5kIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS4gRnV6emluZyBpdCBpcyB2YWx1YWJsZSB0byB1bmNvdmVyIHBvdGVudGlhbCBidWdzIGluIG1lbW9yeSBtYW5hZ2VtZW50IG9yIE9PTSBoYW5kbGluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdFxuICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LFxuICAgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA4YWI5MGI1NmY3MWJiMWQxMDcyNzc1N2I4ZjY5YzQ5MWVjODU3NmEwXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBKdWwgMjQgMTI6MTY6MTkgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9LY29uZmlnLmRlYnVnIGIvbW0vS2NvbmZpZy5kZWJ1Z1xuaW5kZXggNzYzOGQ3NWIyN2RiOGMuLmM4ZmNlY2RjYTZhY2E5IDEwMDY0NFxuLS0tIGEvbW0vS2NvbmZpZy5kZWJ1Z1xuKysrIGIvbW0vS2NvbmZpZy5kZWJ1Z1xuQEAgLTMwOSwzICszMDksMTUgQEAgY29uZmlnIFBFUl9WTUFfTE9DS19TVEFUU1xuIFx0ICBvdmVyaGVhZCBpbiB0aGUgcGFnZSBmYXVsdCBwYXRoLlxuIFxuIFx0ICBJZiBpbiBkb3VidCwgc2F5IE4uXG4rXG4rY29uZmlnIFBBR0VBTExPQ19IT0dHRVJcbitcdGJvb2wgXCJBbGxvYyBwYWdlcyBmcm9tIGRpZmZlcmVudCBub2Rlcywgem9uZXMsIG1pZ3JhdGUgdHlwZXMgYW5kIG9yZGVyc1wiXG4rXHRkZXBlbmRzIG9uIERFQlVHX0ZTXG4rXHRoZWxwXG4rXHQgIFNheSBZIHRvIGFsbG9jIHBhZ2VzIGZyb20gZGlmZmVyZW50IG5vZGVzLCB6b25lcywgbWlncmF0ZSB0eXBlIGFuZFxuK1x0ICBvcmRlcnMgdXNpbmcgdGhlIGRlYnVnIGZzIGZpbGVzeXN0ZW0uIFRoaXMgaGVscHMgdG8gZ2VuZXJhdGUgbWVtb3J5XG4rXHQgIHByZXNzdXJlIGVhc2lseS4gVGhpcyBpcyB1c2VmdWwgdG8gZGVidWcgbWVtb3J5IHJlY2xhaW1zIGlzc3VlcyxcbitcdCAgT09NIHRyaWdnZXJzLCBwYWdlIG1pZ3JhdGlvbiBpc3N1ZXMsIGV0Yy5cbitcbitcdCAgSWYgaW4gZG91YnQsIHNheSBOLlxuK1xuZGlmZiAtLWdpdCBhL21tL01ha2VmaWxlIGIvbW0vTWFrZWZpbGVcbmluZGV4IDJkMDU3MGExNmU1YmViLi5iNDhmMmFjNmVlODA4OSAxMDA2NDRcbi0tLSBhL21tL01ha2VmaWxlXG4rKysgYi9tbS9NYWtlZmlsZVxuQEAgLTEzMyw2ICsxMzMsNyBAQCBvYmotJChDT05GSUdfSURMRV9QQUdFX1RSQUNLSU5HKSArPSBwYWdlX2lkbGUub1xuIG9iai0kKENPTkZJR19ERUJVR19QQUdFQUxMT0MpICs9IGRlYnVnX3BhZ2VfYWxsb2Mub1xuIG9iai0kKENPTkZJR19ERUJVR19QQUdFX1JFRikgKz0gZGVidWdfcGFnZV9yZWYub1xuIG9iai0kKENPTkZJR19EQU1PTikgKz0gZGFtb24vXG4rb2JqLSQoQ09ORklHX1BBR0VBTExPQ19IT0dHRVIpICs9IHBhZ2VfYWxsb2NfaG9nZ2VyLm9cbiBvYmotJChDT05GSUdfSEFSREVORURfVVNFUkNPUFkpICs9IHVzZXJjb3B5Lm9cbiBvYmotJChDT05GSUdfUEVSQ1BVX1NUQVRTKSArPSBwZXJjcHUtc3RhdHMub1xuIG9iai0kKENPTkZJR19aT05FX0RFVklDRSkgKz0gbWVtcmVtYXAub1xuZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2NfaG9nZ2VyLmMgYi9tbS9wYWdlX2FsbG9jX2hvZ2dlci5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLmY1NTRiYmI0YWZhNzMwXG4tLS0gL2Rldi9udWxsXG4rKysgYi9tbS9wYWdlX2FsbG9jX2hvZ2dlci5jXG5AQCAtMCwwICsxLDYxMSBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBQYWdlIGFsbG9jYXRvciBEZWJ1Z0ZTIEludGVyZmFjZVxuKyAqIEF1dGhvcjogSnVhbiBZZXNjYXMgXHUwMDNjanllc2Nhc0Bnb29nbGUuY29tXHUwMDNlXG4rICpcbisgKiBUaGlzIG1vZHVsZSBhbGxvd3MgdG8gbWFrZSBwYWdlIGFsbG9jcyBwZXIgbm9kZSwgem9uZSwgbWlncmF0ZSB0eXBlXG4rICogYW5kIG9yZGVyIHVzaW5nIHRoZSBEZWJ1Z0ZTIGZpbGVzeXN0ZW0uXG4rICpcbisgKiBXaGVuIHRoaXMgbW9kdWxlIGlzIGluc3RhbGxlZCBhbmQgdGhlIGRlYnVnZnMgaXMgbW91bnRlZCwgdGhlIFwibW1cIiBkaXJlY3RvcnlcbisgXCIgd2lsbCBiZSBjcmVhdGVkIGluIFx1MDAzY2RlYnVnZnMgbW91bnQgcG9pbnRcdTAwM2UvbW1cIiBkaXJlY3RvcnkuIFVuZGVyIHRoaXMgZGlyZWN0b3J5LFxuKyAqIHRoZXJlIHdpbGwgYmUgc3ViZGlycyB0byBzZWxlY3QgdGhlIG5vZGVzLCB6b25lcywgb3JkZXJzIGFuZCBtaWdyYXRlIHR5cGUuXG4rICpcbisgKiBGb3IgZXhhbXBsZTpcbisgKlxuKyAqICAgICAgL3N5cy9rZXJuZWwvZGVidWcvbW0vXG4rICogICAgICB8LS0gZnJlZVxuKyAqICAgICAgYC0tIG5vZGUtMFxuKyAqICAgICAgICAgfC0tIHpvbmUtRE1BXG4rICogICAgICAgICB8ICAgfC0tIG9yZGVyLTBcbisgKiAgICAgICAgIHwgICB8ICAgfC0tIG1pZ3JhdGUtSGlnaEF0b21pY1xuKyAqICAgICAgICAgfCAgIHwgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuKyAqICAgICAgICAgfCAgIHwgICB8LS0gbWlncmF0ZS1Nb3ZhYmxlXG4rICogICAgICAgICB8ICAgfCAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXG4rICogICAgICAgICB8ICAgfCAgIHwtLSBtaWdyYXRlLVJlY2xhaW1hYmxlXG4rICogICAgICAgICB8ICAgfCAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXG4rICogICAgICAgICB8ICAgfCAgIGAtLSBtaWdyYXRlLVVubW92YWJsZVxuKyAqICAgICAgICAgfCAgIHwgICAgICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuKyAqICAgICAgICAgfCAgIHwtLSAuLi5cbisgKiAgICAgICAgIHwgICB8XG4rICogICAgICAgICB8ICAgYC0tIG9yZGVyLTlcbisgKiAgICAgICAgIHwgICAgICAgfC0tIG1pZ3JhdGUtSGlnaEF0b21pY1xuKyAqICAgICAgICAgfCAgICAgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuKyAqICAgICAgICAgfCAgICAgICB8LS0gbWlncmF0ZS1Nb3ZhYmxlXG4rICogICAgICAgICB8ICAgICAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXG4rICogICAgICAgICB8ICAgICAgIHwtLSBtaWdyYXRlLVJlY2xhaW1hYmxlXG4rICogICAgICAgICB8ICAgICAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXG4rICogICAgICAgICB8ICAgICAgIGAtLSBtaWdyYXRlLVVubW92YWJsZVxuKyAqICAgICAgICAgfCAgICAgICAgICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuKyAqICAgICAgICAgYC0tIHpvbmUtTm9ybWFsXG4rICogICAgICAgICAgICAgfC0tIG9yZGVyLTBcbisgKiAgICAgICAgICAgICB8ICAgfC0tIG1pZ3JhdGUtSGlnaEF0b21pY1xuKyAqICAgICAgICAgICAgIHwgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuKyAqICAgICAgICAgICAgIHwgICB8LS0gbWlncmF0ZS1Nb3ZhYmxlXG4rICogICAgICAgICAgICAgfCAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXG4rICogICAgICAgICAgICAgfCAgIHwtLSBtaWdyYXRlLVJlY2xhaW1hYmxlXG4rICogICAgICAgICAgICAgfCAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXG4rICogICAgICAgICAgICAgfCAgIGAtLSBtaWdyYXRlLVVubW92YWJsZVxuKyAqICAgICAgICAgICAgIHwgICAgICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuKyAqICAgICAgICAgICAgIHwtLSAuLi4uXG4rICogICAgICAgICAgICAgfFxuKyAqICAgICAgICAgICAgIGAtLSBvcmRlci05XG4rICogICAgICAgICAgICAgICAgIHwtLSBtaWdyYXRlLUhpZ2hBdG9taWNcbisgKiAgICAgICAgICAgICAgICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcbisgKiAgICAgICAgICAgICAgICAgfC0tIG1pZ3JhdGUtTW92YWJsZVxuKyAqICAgICAgICAgICAgICAgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuKyAqICAgICAgICAgICAgICAgICB8LS0gbWlncmF0ZS1SZWNsYWltYWJsZVxuKyAqICAgICAgICAgICAgICAgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuKyAqICAgICAgICAgICAgICAgICBgLS0gbWlncmF0ZS1Vbm1vdmFibGVcbisgKiAgICAgICAgICAgICAgICAgICAgIGAtLSBucl9wYWdlc19hbGxvY3NcbisgKlxuKyAqIFVzYWdlOlxuKyAqXG4rICogMS4gVG8gdHJpZ2dlciB0aGUgYWxsb2NhdGlvbiwgbmF2aWdhdGUgdG8gdGhlIGRlYnVnZnMgcGF0aCBjb3JyZXNwb25kaW5nXG4rICogICAgdG8geW91ciB0YXJnZXQgbm9kZSwgbWVtb3J5IHpvbmUsIGFsbG9jYXRpb24gb3JkZXIsIGFuZCBtaWdyYXRpb24gdHlwZSxcbisgKiAgICB0aGVuIHdyaXRlIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvbiBjb3VudCB0byBucl9wYWdlc19hbGxvY3MuXG4rICpcbisgKiAgICBGb3IgZXhhbXBsZSwgdG8gbWFrZSAzIGFsbG9jcyBvZiBvcmRlciA5LCBNaWdyYXRlIFR5cGUgTW92YWJsZSxcbisgKiAgICBab25lIE5vcm1hbCBhbmQgTm9kZSAwLCBydW46XG4rICpcbisgKiAgICAkIGVjaG8gMyBcdTAwM2UgL3N5cy9rZXJuZWwvZGVidWcvbW0vbm9kZS0wL3pvbmUtTm9ybWFsL29yZGVyLTkvbWlncmF0ZS1Nb3ZhYmxlL25yX3BhZ2VzX2FsbG9jc1xuKyAqXG4rICogMi4gRm9yIGVhY2ggYWxsb2NhdGlvbiBjcmVhdGVkLCBhIGNvcnJlc3BvbmRpbmcgZmlsZSBuYW1lZCBzZXF1ZW50aWFsbHlcbisgKiAgICAoMSwgMiwgbikgd2lsbCBhcHBlYXIgaW4gdGhhdCBkaXJlY3RvcnkuXG4rICpcbisgKiAgICAkIGxzIC9zeXMva2VybmVsL2RlYnVnL21tL25vZGUtMC96b25lLU5vcm1hbC9vcmRlci05L21pZ3JhdGUtTW92YWJsZS9cbisgKiAgICAxICAgMiAgIDMgIG5yX3BhZ2VzX2FsbG9jc1xuKyAqXG4rICogMy4gVG8gZnJlZSB0aGUgYWxsb2NhdGlvbiwgd3JpdGUgdGhlIGFsbG9jYXRpb24gZmlsZSBuYW1lIGluIC9zeXMva2VybmVsL2RlYnVnL21tL2ZyZWUuXG4rICogICAgRm9yIGV4YW1wbGUsIHRvIHJlbGVhc2UgdGhlIDJuZCBhbGxvY2F0aW9uIHJ1bjpcbisgKlxuKyAqICAgICQgZWNobyAyIFx1MDAzZSAvc3lzL2tlcm5lbC9kZWJ1Zy9tbS9mcmVlXG4rICovXG4rXG4rI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSBcIjogXCIgZm10XG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYXRvbWljLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9lcnJuby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZGVidWdmcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZ2ZwLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9nZnBfdHlwZXMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2hpZ2htZW0uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbW16b25lLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L25vZGVtYXNrLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9wcmludGsuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3hhcnJheS5oXHUwMDNlXG4rXG4rc3RydWN0IGRlbnRyeSAqbW1kaXI7XG4rXG4rLyoqXG4rICogYXRvbWljX2xvbmdfdCBhbGxvY3NfZmlsZV9zZXEgLSBSZXByZXNlbnRzIHRoZSBuYW1pbmcgc2VxdWVuY2UgdXNlZCBmb3JcbisgKiBhbGxvY2F0aW9uIGZpbGVzLlxuKyAqL1xuK2F0b21pY19sb25nX3QgYWxsb2NzX2ZpbGVfc2VxID0gQVRPTUlDX0lOSVQoMCk7XG4rXG4rLyoqXG4rICogYWxsb2NzX3hhIC0gUmVwcmVzZW50IHRoZSB4YXJyYXkgdGhhdCBjb250YWlucyB0aGUgYWN0dWFsIGFsbG9jYXRpb25zIHBlcmZvcm1cbisgKiBieSB0aGlzIGRyaXZlci5cbisgKi9cbitzdGF0aWMgREVGSU5FX1hBUlJBWShhbGxvY3NfeGEpO1xuK1xuKy8qKlxuKyAqIHN0cnVjdCByZXFfYWxsb2MgLSBSZXByZXNlbnRzIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvblxuKyAqIEBub2RlX2lkeDogVGhlIE5vZGUgaW5kZXggdG8gYWxsb2NhdGUgZnJvbS5cbisgKiBAem9uZV9pZHg6IFRoZSBab25lIGluZGV4IHRvIGFsbG9jYXRlIGZyb20uXG4rICogQG9yZGVyOiBUaGUgT3JkZXIgb2YgcGFnZXMgdG8gYWxsb2NhdGUuXG4rICogQG1pZ3JhdGVfdHlwZTogVGhlIE1pZ3JhdGUgdHlwZSB0byBhbGxvY2F0ZSBmcm9tLlxuKyAqIEBwYXJlbnRkaXI6IFRoZSBwYXJlbnQgZGlyIHdoZXJlIHRoZSBmaWxlIHJlcHJlc2VudGluZyB0aGUgYWxsb2Mgd2FzIGNyZWF0ZWQuXG4rICovXG4rc3RydWN0IHJlcV9hbGxvYyB7XG4rXHRpbnQgbm9kZV9pZHg7XG4rXHRpbnQgem9uZV9pZHg7XG4rXHRpbnQgb3JkZXI7XG4rXHRpbnQgbWlncmF0ZV90eXBlO1xuK1x0c3RydWN0IGRlbnRyeSAqcGFyZW50ZGlyO1xuK307XG4rXG4rLypcbisgKiBzdHJ1Y3QgcGFnZV9hbGxvYyAtIFJlcHJlc2VudHMgdGhlIHBhZ2UgYWxsb2NhdGlvbi5cbisgKiBAcGFnZTogVGhlIHBvaW50ZXIgdG8gdGhlIHBhZ2UocykgYWxsb2NhdGVkLlxuKyAqIEByZXFfYWxsb2M6IFRoZSBkZXRhaWxzIG9mIHRoZSBhbGxvY2F0aW9uLlxuKyAqIEBhbGxvY19kZW50cnk6IFRoZSBwb2ludGVyIHRvIHRoZSBmaWxlIHRoYXQgcmVwcmVzZW50cyB0aGUgYWxsb2NhdGlvbi5cbisgKi9cbitzdHJ1Y3QgcGFnZV9hbGxvYyB7XG4rXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbitcdHN0cnVjdCByZXFfYWxsb2MgKnJlcV9hbGxvYztcbitcdHN0cnVjdCBkZW50cnkgKmFsbG9jX2RlbnRyeTtcbit9O1xuK1xuK3N0cnVjdCBrbWVtX2NhY2hlICpyZXFfYWxsb2NfY2FjaGU7XG4rc3RydWN0IGttZW1fY2FjaGUgKnBhZ2VfYWxsb2NfY2FjaGU7XG4rXG4raW5saW5lIHZvaWQgc2V0X3pvbmVfdG9fYWxsb2NfZnJvbShpbnQgem9uZV9pZHgsIGdmcF90ICpmbGFnc19wdHIpXG4re1xuK1x0c3dpdGNoICh6b25lX2lkeCkge1xuKyNpZmRlZiBDT05GSUdfWk9ORV9ETUFcbitcdGNhc2UgWk9ORV9ETUE6XG4rXHRcdCpmbGFnc19wdHIgfD0gX19HRlBfRE1BO1xuK1x0XHRicmVhaztcbisjZW5kaWZcbisjaWZkZWYgQ09ORklHX1pPTkVfRE1BMzJcbitcdGNhc2UgWk9ORV9ETUEzMjpcbitcdFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9ETUEzMjtcbitcdFx0YnJlYWs7XG4rI2VuZGlmXG4rI2lmZGVmIENPTkZJR19ISUdITUVNXG4rXHRjYXNlIFpPTkVfSElHSE1FTTpcbitcdFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9ISUdITUVNO1xuK1x0XHRicmVhaztcbisjZW5kaWZcbitcdGNhc2UgWk9ORV9NT1ZBQkxFOlxuK1x0XHQqZmxhZ3NfcHRyIHw9IF9fR0ZQX01PVkFCTEU7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBaT05FX05PUk1BTDpcbitcdGRlZmF1bHQ6XG4rXHRcdCpmbGFnc19wdHIgfD0gMDtcbitcdFx0YnJlYWs7XG4rXHR9XG4rfVxuK1xuK2lubGluZSB2b2lkIHNldF9taWdyYXRlX3R5cGVfdG9fYWxsb2NfZnJvbShpbnQgbWlncmF0ZV90eXBlLCBnZnBfdCAqZmxhZ3NfcHRyKVxuK3tcbitcdHN3aXRjaCAobWlncmF0ZV90eXBlKSB7XG4rXHRjYXNlIE1JR1JBVEVfVU5NT1ZBQkxFOlxuK1x0XHQqZmxhZ3NfcHRyIFx1MDAyNj0gfihfX0dGUF9SRUNMQUlNQUJMRSB8IF9fR0ZQX01PVkFCTEUpO1xuK1x0XHRicmVhaztcbitcdGNhc2UgTUlHUkFURV9SRUNMQUlNQUJMRTpcbitcdFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9SRUNMQUlNQUJMRTtcbitcdFx0YnJlYWs7XG4rXHRjYXNlIE1JR1JBVEVfSElHSEFUT01JQzpcbitcdFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9ISUdIO1xuK1x0XHRicmVhaztcbitcdGNhc2UgTUlHUkFURV9NT1ZBQkxFOiBkZWZhdWx0OlxuK1x0XHQqZmxhZ3NfcHRyIHw9IF9fR0ZQX01PVkFCTEU7XG4rXHRcdGJyZWFrO1xuK1x0fVxuK31cbitcbitzdGF0aWMgc3NpemVfdCBwYWdlX2FsbG9jX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1YnVmLFxuK1x0XHRcdFx0ICAgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcylcbit7XG4rXHQvKiAgV2hpY2ggaW5mb3JtYXRpb24gc2hvdWxkIGJlIHByaW50IGFib3V0IHRoZSBwYWdlIG9yIGFsbG9jYXRpb24/ICovXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcGFnZV9hbGxvY19mb3BzID0ge1xuK1x0Lm93bmVyID0gVEhJU19NT0RVTEUsXG4rXHQub3BlbiA9IHNpbXBsZV9vcGVuLFxuK1x0LnJlYWQgPSBwYWdlX2FsbG9jX3JlYWQsXG4rfTtcbitcbitzdGF0aWMgaW50IG1ha2VfYWxsb2Moc3RydWN0IHJlcV9hbGxvYyAqcmVxLFxuK1x0XHRcdCAgICBnZnBfdCBmbGFncywgdW5zaWduZWQgbG9uZyAqYWxsb2NfaWQpXG4re1xuK1x0c3RydWN0IHBhZ2VfYWxsb2MgKnBhO1xuK1x0c3RydWN0IHBhZ2UgKnBhZ2U7XG4rXHRjaGFyIG5ld19hbGxvY19uYW1lWzEyXTtcbitcdHN0cnVjdCBkZW50cnkgKm5ld19hbGxvY19kZW50cnk7XG4rXHRpbnQgcmV0O1xuK1xuK1x0cGFnZSA9IGFsbG9jX3BhZ2VzX25vZGVfbm9wcm9mKHJlcS1cdTAwM2Vub2RlX2lkeCwgZmxhZ3MsIHJlcS1cdTAwM2VvcmRlcik7XG4rXHRpZiAocGFnZSkge1xuK1x0XHRwYSA9IGttZW1fY2FjaGVfYWxsb2MocGFnZV9hbGxvY19jYWNoZSwgR0ZQX0tFUk5FTCk7XG4rXHRcdGlmICghcGEpIHtcbitcdFx0XHRyZXQgPSAtRU5PTUVNO1xuK1x0XHRcdGdvdG8gZnJlZV9wYWdlcztcbitcdFx0fVxuK1xuK1x0XHQqYWxsb2NfaWQgPSBhdG9taWNfbG9uZ19pbmNfcmV0dXJuKFx1MDAyNmFsbG9jc19maWxlX3NlcSk7XG4rXHRcdHJldCA9IHhhX2luc2VydChcdTAwMjZhbGxvY3NfeGEsICphbGxvY19pZCwgcGEsIEdGUF9LRVJORUwpO1xuK1x0XHRpZiAocmV0KVxuK1x0XHRcdGdvdG8gZnJlZV9wYWdlX2FsbG9jO1xuK1xuK1x0XHRzbnByaW50ZihuZXdfYWxsb2NfbmFtZSwgc2l6ZW9mKG5ld19hbGxvY19uYW1lKSwgXCIlbHVcIixcbitcdFx0XHQgKmFsbG9jX2lkKTtcbitcbitcdFx0bmV3X2FsbG9jX2RlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoXG4rXHRcdFx0bmV3X2FsbG9jX25hbWUsIDA2NDQsIHJlcS1cdTAwM2VwYXJlbnRkaXIsXG4rXHRcdFx0cGEsIFx1MDAyNnBhZ2VfYWxsb2NfZm9wcyk7XG4rXHRcdGlmIChJU19FUlIobmV3X2FsbG9jX2RlbnRyeSkpIHtcbitcdFx0XHRyZXQgPSBQVFJfRVJSKG5ld19hbGxvY19kZW50cnkpO1xuK1x0XHRcdGdvdG8gZXJhc2VfeGFfZW50cnk7XG4rXHRcdH1cbitcbitcdFx0cGEtXHUwMDNlcmVxX2FsbG9jID0gcmVxO1xuK1x0XHRwYS1cdTAwM2VwYWdlID0gcGFnZTtcbitcdFx0cGEtXHUwMDNlYWxsb2NfZGVudHJ5ID0gbmV3X2FsbG9jX2RlbnRyeTtcbitcdH0gZWxzZSB7XG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rXG4rZXJhc2VfeGFfZW50cnk6XG4rXHR4YV9lcmFzZShcdTAwMjZhbGxvY3NfeGEsICphbGxvY19pZCk7XG4rXG4rZnJlZV9wYWdlX2FsbG9jOlxuK1x0a21lbV9jYWNoZV9mcmVlKHBhZ2VfYWxsb2NfY2FjaGUsIHBhKTtcbitcbitmcmVlX3BhZ2VzOlxuK1x0X19mcmVlX3BhZ2VzKHBhZ2UsIHBhLVx1MDAzZXJlcV9hbGxvYy1cdTAwM2VvcmRlcik7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50IGZyZWVfYWxsb2NfaGVscGVyKHVuc2lnbmVkIGxvbmcgYWxsb2NfaWQpXG4re1xuK1x0c3RydWN0IHBhZ2VfYWxsb2MgKnBhO1xuK1xuK1x0cGEgPSB4YV9lcmFzZShcdTAwMjZhbGxvY3NfeGEsIGFsbG9jX2lkKTtcbitcdGlmICghcGEpIHtcbitcdFx0cHJfZXJyKFwiVGhlIGFsbG9jX2lkICVsdSB3YXMgbm90IGZvdW5kIVwiLCBhbGxvY19pZCk7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0X19mcmVlX3BhZ2VzKHBhLVx1MDAzZXBhZ2UsIHBhLVx1MDAzZXJlcV9hbGxvYy1cdTAwM2VvcmRlcik7XG4rXHRkZWJ1Z2ZzX3JlbW92ZShwYS1cdTAwM2VhbGxvY19kZW50cnkpO1xuK1x0a21lbV9jYWNoZV9mcmVlKHBhZ2VfYWxsb2NfY2FjaGUsIHBhKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbisvKipcbisgKiByZXFfcGFnZV9hbGxvY193cml0ZSgpIC0gQWxsb2NhdGVzIHRoZSBwYWdlcyBvbiB0aGUgcmVxdWVzdGVkIG5vZGUsIHpvbmUsXG4rICogb3JkZXIgYW5kIG1pZ3JhdGUgdHlwZS4gT25jZSB0aGUgYWxsb2NhdGlvbiBpcyBwZXJmb3JtZWQsIGEgZmlsZSBpcyBjcmVhdGVkXG4rICogdG8gZnJlZSB0aGUgYWxsb2NhdGlvbiBsYXRlci5cbisgKi9cbitzdGF0aWMgc3NpemVfdCByZXFfcGFnZV9hbGxvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsXG4rXHRcdFx0XHQgICAgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcylcbit7XG4rXHRzdHJ1Y3QgcmVxX2FsbG9jICpyZXEgPSBmaWxlLVx1MDAzZXByaXZhdGVfZGF0YTtcbitcdHVuc2lnbmVkIGxvbmcgYWxsb2NfaWQ7XG4rXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzX2FsbG9jcztcbitcdHVuc2lnbmVkIGxvbmcgKmFsbG9jc19pZHM7XG4rXHRnZnBfdCBmbGFncyA9IDA7XG4rXHRpbnQgcmV0O1xuK1x0aW50IGk7XG4rXG4rXHRyZXQgPSBrc3RydG91bF9mcm9tX3VzZXIodWJ1ZiwgY250LCAxMCwgXHUwMDI2bnJfcGFnZXNfYWxsb2NzKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRhbGxvY3NfaWRzID0ga21hbGxvY19hcnJheShucl9wYWdlc19hbGxvY3MsIHNpemVvZih1bnNpZ25lZCBsb25nKSxcbitcdFx0XHRcdFx0R0ZQX0tFUk5FTCk7XG4rXHRpZiAoIWFsbG9jc19pZHMpXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0c2V0X3pvbmVfdG9fYWxsb2NfZnJvbShyZXEtXHUwMDNlem9uZV9pZHgsIFx1MDAyNmZsYWdzKTtcbitcdHNldF9taWdyYXRlX3R5cGVfdG9fYWxsb2NfZnJvbShyZXEtXHUwMDNlbWlncmF0ZV90eXBlLCBcdTAwMjZmbGFncyk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlc19hbGxvY3M7IGkrKykge1xuK1x0XHRyZXQgPSBtYWtlX2FsbG9jKHJlcSwgZmxhZ3MsIFx1MDAyNmFsbG9jX2lkKTtcbitcdFx0aWYgKHJldClcbitcdFx0XHRnb3RvIGZyZWVfYWxsb2NzO1xuK1xuK1x0XHRhbGxvY3NfaWRzW2ldID0gYWxsb2NfaWQ7XG4rXHR9XG4rXG4rXHRrZnJlZShhbGxvY3NfaWRzKTtcbitcbitcdHJldHVybiBjbnQ7XG4rXG4rZnJlZV9hbGxvY3M6XG4rXHQvKiBGcmVlIGFsbCB0aGUgcGFnZXMgcHJldmlvdXNseSBhbGxvY2F0ZWQuICovXG4rXHRmb3IgKGludCBqID0gMDsgaiBcdTAwM2MgaTsgaisrKSB7XG4rXHRcdGludCByZXQyID0gZnJlZV9hbGxvY19oZWxwZXIoYWxsb2NzX2lkc1tqXSk7XG4rXG4rXHRcdGlmIChyZXQyKVxuK1x0XHRcdHByX2VycihcIlVuYWJsZSB0byBmcmVlIHBhZ2VzIGFzc29jaWF0ZWQgd2l0aCBmaWxlICVsdVwiLFxuK1x0XHRcdCAgICAgICBhbGxvY3NfaWRzW2pdKTtcbitcdH1cbitcbitcdGtmcmVlKGFsbG9jc19pZHMpO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVxX3BhZ2VfYWxsb2NfZm9wcyA9IHtcbitcdC5vd25lciA9IFRISVNfTU9EVUxFLFxuK1x0Lm9wZW4gPSBzaW1wbGVfb3BlbixcbitcdC53cml0ZSA9IHJlcV9wYWdlX2FsbG9jX3dyaXRlLFxuK307XG4rXG4rLyoqXG4rICogZnJlZV9wYWdlX2FsbG9jX3dyaXRlKCkgLSBmcmVlIHRoZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBwYWdlcy5cbisgKiBAZmlsZTogRmlsZSB3aGVyZSB0aGUgdXNlciBpcyB3cml0aW5nLlxuKyAqIEB1YnVmOiBDb250YWlucyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0aGUgdXNlciB3YW50cyB0byBkZWxldGUgYW5kIGhhdmUgdGhlXG4rICogICAgICAgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZpbGUgZnJlZWQuXG4rICogQGNudDogU2l6ZSBvZiBAdWJ1Zi5cbisgKiBAcHBvczogQ3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZmlsZS5cbisgKi9cbitzdGF0aWMgc3NpemVfdCBmcmVlX3BhZ2VfYWxsb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsXG4rXHRcdFx0XHQgICAgICBjb25zdCBjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IGNudCxcbitcdFx0XHRcdCAgICAgIGxvZmZfdCAqcHBvcylcbit7XG4rXHRpbnQgcmV0O1xuK1x0dW5zaWduZWQgbG9uZyBhbGxvY19pZDtcbitcbitcdHJldCA9IGtzdHJ0b3VsX2Zyb21fdXNlcih1YnVmLCBjbnQsIDEwLCBcdTAwMjZhbGxvY19pZCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gZnJlZV9hbGxvY19oZWxwZXIoYWxsb2NfaWQpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldHVybiBjbnQ7XG4rfVxuK1xuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZyZWVfcGFnZV9hbGxvY19mb3BzID0ge1xuK1x0Lm93bmVyID0gVEhJU19NT0RVTEUsXG4rXHQud3JpdGUgPSBmcmVlX3BhZ2VfYWxsb2Nfd3JpdGUsXG4rfTtcbitcbisvKipcbisgKiBjcmVhdGVfbnJfcGFnZXNfYWxsb2NzX2ZpbGUoKSAtIENyZWF0ZXMgdGhlIGZpbGUgXCJucl9wYWdlc19hbGxvY3NcIi5cbisgKlxuKyAqIFRoZSBcIm5yX3BhZ2VzX2FsbG9jc1wiIGZpbGUgd2lsbCBiZSB1c2VkIHRvIHdyaXRlIHRoZSBudW1iZXIgb2YgYWxsb2NhdGlvbnNcbisgKiB0aGF0IHdpbGwgYmUgcGVyZm9ybWVkLiBXaGVuIHRoZSBhbGxvY2F0aW9ucyBhcmUgcGVyZm9ybWVkLCBhIG5ldyBmaWxlIGZvclxuKyAqIGVhY2ggYWxsb2NhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgaW4gQG1pZ3JhdGVkaXIuXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgY3JlYXRlX25yX3BhZ2VzX2FsbG9jc19maWxlKHN0cnVjdCBkZW50cnkgKm1pZ3JhdGVkaXIsXG4rXHRcdFx0XHRcdCAgICAgIGludCBub2RlX2lkeCwgaW50IHpvbmVfaWR4LFxuK1x0XHRcdFx0XHQgICAgICBpbnQgb3JkZXIsIGludCBtdHlwZSlcbit7XG4rXHRzdHJ1Y3QgcmVxX2FsbG9jICpyZXE7XG4rXHRzdHJ1Y3QgZGVudHJ5ICpucl9wYWdlcztcbitcbitcdHJlcSA9IGttZW1fY2FjaGVfYWxsb2MocmVxX2FsbG9jX2NhY2hlLCBHRlBfS0VSTkVMKTtcbitcdGlmICghcmVxKSB7XG4rXHRcdHByX2VycihcIkZhaWxlZCB0byBjcmVhdGUgbnJfcGFnZXNfYWxsb2NzX2luZm9cIik7XG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1x0fVxuK1xuK1x0cmVxLVx1MDAzZW5vZGVfaWR4ID0gbm9kZV9pZHg7XG4rXHRyZXEtXHUwMDNlem9uZV9pZHggPSB6b25lX2lkeDtcbitcdHJlcS1cdTAwM2VvcmRlciA9IG9yZGVyO1xuK1x0cmVxLVx1MDAzZW1pZ3JhdGVfdHlwZSA9IG10eXBlO1xuK1x0cmVxLVx1MDAzZXBhcmVudGRpciA9IG1pZ3JhdGVkaXI7XG4rXG4rXHRucl9wYWdlcyA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoXCJucl9wYWdlc19hbGxvY3NcIiwgMDY0NCwgbWlncmF0ZWRpciwgcmVxLFxuK1x0XHRcdFx0ICAgICAgIFx1MDAyNnJlcV9wYWdlX2FsbG9jX2ZvcHMpO1xuK1x0aWYgKElTX0VSUihucl9wYWdlcykpXG4rXHRcdHJldHVybiBQVFJfRVJSKG5yX3BhZ2VzKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbisvKipcbisgKiBjcmVhdGVfbWlncmF0ZV90eXBlX3N1YmRpcnMoKSAtIENyZWF0ZXMgYSBkaXJlY3RvcnkgZm9yIGVhY2ggbWlncmF0ZSB0eXBlXG4rICogaW5zaWRlIHRoZSBvcmRlciBkaXJlY3RvcnkuIE9uY2UgdGhlIG1pZ3JhdGUgdHlwZSBkaXJlY3RvcnkgaXMgY3JlYXRlZCwgaXRcbisgKiBjcmVhdGVzIHRoZSBcIm5yX2FsbG9jc1wiIGZpbGUgYW5kIHRoZSBcImZyZWVcIiBmaWxlLlxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgaW50IGNyZWF0ZV9taWdyYXRlX3R5cGVfc3ViZGlycyhzdHJ1Y3QgZGVudHJ5ICpvcmRlcmRpcixcbitcdFx0XHRcdFx0ICAgICAgaW50IG5vZGVfaWR4LCBpbnQgem9uZV9pZHgsXG4rXHRcdFx0XHRcdCAgICAgIGludCBvcmRlcilcbit7XG4rXHRzdHJ1Y3QgZGVudHJ5ICptaWdyYXRlZGlyO1xuK1x0Y2hhciBkaXJuYW1lWzI0XTtcbitcdGludCByZXQ7XG4rXG4rXHRmb3IgKGludCBtdHlwZSA9IDA7IG10eXBlIFx1MDAzYyBNSUdSQVRFX1RZUEVTOyBtdHlwZSsrKSB7XG4rI2lmZGVmIENPTkZJR19DTUFcbitcdFx0aWYgKG10eXBlID09IE1JR1JBVEVfQ01BKSAvKiBDTUEgYWxsb2NzIGFyZSBub3Qgc3VwcG9ydGVkIHlldCovXG4rXHRcdFx0Y29udGludWU7XG4rI2VuZGlmXG4rI2lmZGVmIENPTkZJR19NRU1PUllfSVNPTEFUSU9OXG4rXHRcdGlmIChtdHlwZSA9PSBNSUdSQVRFX0lTT0xBVEUpIC8qIGNhbid0IGFsbG9jYXRlIGZyb20gaGVyZSAqL1xuK1x0XHRcdGNvbnRpbnVlO1xuKyNlbmRpZlxuK1x0XHRzbnByaW50ZihkaXJuYW1lLCBzaXplb2YoZGlybmFtZSksIFwibWlncmF0ZS0lc1wiLFxuK1x0XHRcdCBtaWdyYXRldHlwZV9uYW1lc1ttdHlwZV0pO1xuK1x0XHRtaWdyYXRlZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKGRpcm5hbWUsIG9yZGVyZGlyKTtcbitcdFx0aWYgKElTX0VSUihtaWdyYXRlZGlyKSlcbitcdFx0XHRyZXR1cm4gUFRSX0VSUihtaWdyYXRlZGlyKTtcbitcbitcdFx0cmV0ID0gY3JlYXRlX25yX3BhZ2VzX2FsbG9jc19maWxlKG1pZ3JhdGVkaXIsIG5vZGVfaWR4LFxuK1x0XHRcdFx0XHRcdCAgem9uZV9pZHgsIG9yZGVyLCBtdHlwZSk7XG4rXHRcdGlmIChyZXQpXG4rXHRcdFx0cmV0dXJuIHJldDtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbisvKipcbisgKiBjcmVhdGVfcGFnZV9vcmRlcnNfc3ViZGlycygpIC0gQ3JlYXRlcyBhIGRpcmVjdG9yeSBmb3IgZWFjaCBwYWdlIG9yZGVyIGluc2lkZVxuKyAqIHRoZSB6b25lIGRpcmVjdG9yeS4gT25jZSB0aGF0IHRoZSBwYWdlIG9yZGVyIGRpcmVjdG9yeSBpcyBjcmVhdGVkLCBpdCBjcmVhdGVzXG4rICogYSBkaXJlY3RvcnkgZm9yIGVhY2ggbWlncmF0ZSB0eXBlLlxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgaW50IGNyZWF0ZV9wYWdlX29yZGVyc19zdWJkaXJzKHN0cnVjdCBkZW50cnkgKnpvbmVkaXIsXG4rXHRcdFx0XHRcdCAgICAgaW50IG5vZGVfaWR4LCBpbnQgem9uZV9pZHgsXG4rXHRcdFx0XHRcdCAgICAgc3RydWN0IHpvbmUgKnpvbmUpXG4re1xuK1x0c3RydWN0IGRlbnRyeSAqb3JkZXJkaXI7XG4rXHRjaGFyIGRpcm5hbWVbMTJdO1xuK1x0aW50IHJldDtcbitcbitcdGZvciAoaW50IG9yZGVyID0gMDsgb3JkZXIgXHUwMDNjIE5SX1BBR0VfT1JERVJTOyBvcmRlcisrKSB7XG4rXHRcdHNucHJpbnRmKGRpcm5hbWUsIHNpemVvZihkaXJuYW1lKSwgXCJvcmRlci0lZFwiLCBvcmRlcik7XG4rXHRcdG9yZGVyZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKGRpcm5hbWUsIHpvbmVkaXIpO1xuK1x0XHRpZiAoSVNfRVJSKG9yZGVyZGlyKSlcbitcdFx0XHRyZXR1cm4gUFRSX0VSUihvcmRlcmRpcik7XG4rXG4rXHRcdHJldCA9IGNyZWF0ZV9taWdyYXRlX3R5cGVfc3ViZGlycyhvcmRlcmRpciwgbm9kZV9pZHgsIHpvbmVfaWR4LFxuK1x0XHRcdFx0XHRcdCAgb3JkZXIpO1xuK1x0XHRpZiAocmV0KVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLyoqXG4rICogY3JlYXRlX3pvbmVzX3N1YmRpcnMoKSAtIENyZWF0ZXMgYSBkaXJlY3RvcnkgZm9yIGVhY2ggcG9wdWxhdGVkIHpvbmUgaW4gdGhlXG4rICogbm9kZS4gT25jZSB0aGF0IHRoZSB6b25lIGRpcmVjdG9yeSBpcyBjcmVhdGVkLCBpdCBjcmVhdGVzIGEgZGlyZWN0b3J5IGZvclxuKyAqIGVhY2ggb3JkZXIgc3VwcG9ydGVkLlxuKyAqXG4rICogTm90ZTogWk9ORV9ERVZJQ0UgcGFnZXMgd29uJ3QgYmUgYWxsb2NhdGVkIHVzaW5nIHRoaXMgZHJpdmVyLiBUaGUgbWFpbiByZWFzb25cbisgKiBpcyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBtYW5hZ2VkIGJ5IHRoZSBCdWRkeSBBbGxvY2F0b3Igb3IgQ01BIGFsbG9jYXRvci5cbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBjcmVhdGVfem9uZXNfc3ViZGlycyhzdHJ1Y3QgZGVudHJ5ICpub2RlZGlyLCBpbnQgbm9kZV9pZHgsXG4rXHRcdFx0XHQgICAgICAgc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdGEpXG4re1xuK1x0c3RydWN0IGRlbnRyeSAqem9uZWRpcjtcbitcdHN0cnVjdCB6b25lICp6b25lO1xuK1x0c3RydWN0IHpvbmUgKm5vZGVfem9uZXMgPSBwZ2RhdGEtXHUwMDNlbm9kZV96b25lcztcbitcdGludCB6b25lX2lkeDtcbitcdGNoYXIgZGlybmFtZVsyNF07XG4rXHRpbnQgcmV0O1xuK1xuK1x0Zm9yICh6b25lID0gbm9kZV96b25lcywgem9uZV9pZHggPSAwOyB6b25lIC0gbm9kZV96b25lcyBcdTAwM2MgTUFYX05SX1pPTkVTO1xuK1x0ICAgICArK3pvbmUsICsrem9uZV9pZHgpIHtcbitcdFx0aWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSlcbitcdFx0XHRjb250aW51ZTtcbitcbitcdFx0LyogWk9ORV9ERVZJQ0UgcGFnZXMgd29uJ3QgYmUgYWxsb2NhdGVkIHVzaW5nIHRoaXMgZHJpdmVyLiAqL1xuK1x0XHRpZiAoem9uZV9pc196b25lX2RldmljZSh6b25lKSlcbitcdFx0XHRjb250aW51ZTtcbitcbitcdFx0c25wcmludGYoZGlybmFtZSwgc2l6ZW9mKGRpcm5hbWUpLCBcInpvbmUtJXNcIiwgem9uZS1cdTAwM2VuYW1lKTtcbitcdFx0em9uZWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihkaXJuYW1lLCBub2RlZGlyKTtcbitcdFx0aWYgKElTX0VSUih6b25lZGlyKSlcbitcdFx0XHRyZXR1cm4gUFRSX0VSUih6b25lZGlyKTtcbitcbitcdFx0cmV0ID0gY3JlYXRlX3BhZ2Vfb3JkZXJzX3N1YmRpcnMoem9uZWRpciwgbm9kZV9pZHgsIHpvbmVfaWR4LFxuK1x0XHRcdFx0XHRcdCB6b25lKTtcbitcdFx0aWYgKHJldClcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qKlxuKyAqIGNyZWF0ZV9ub2Rlc19zdWJkaXJzKCkgLSBDcmVhdGVzIGEgZGlyZWN0b3J5IGZvciBlYWNoIG9ubGluZSBub2RlIGluIHRoZVxuKyAqIHN5c3RlbS4gT25jZSB0aGF0IHRoZSBub2RlIGRpcmVjdG9yeSBpcyBjcmVhdGVkLCBpdCBjcmVhdGVzIGEgZGlyZWN0b3J5IGZvclxuKyAqIGVhY2ggem9uZSBpbiB0aGUgbm9kZS5cbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBjcmVhdGVfbm9kZXNfc3ViZGlycyhzdHJ1Y3QgZGVudHJ5ICptbWRpcilcbit7XG4rXHRzdHJ1Y3QgZGVudHJ5ICpub2RlZGlyO1xuK1x0aW50IG5vZGVfaWR4O1xuK1x0Y2hhciBkaXJuYW1lWzEyXTtcbitcdGludCByZXQ7XG4rXG4rXHRmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlX2lkeCkge1xuK1x0XHRzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0YSA9IE5PREVfREFUQShub2RlX2lkeCk7XG4rXG4rXHRcdHNucHJpbnRmKGRpcm5hbWUsIHNpemVvZihkaXJuYW1lKSwgXCJub2RlLSVkXCIsIG5vZGVfaWR4KTtcbitcdFx0bm9kZWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihkaXJuYW1lLCBtbWRpcik7XG4rXHRcdGlmIChJU19FUlIobm9kZWRpcikpXG4rXHRcdFx0cmV0dXJuIFBUUl9FUlIobm9kZWRpcik7XG4rXG4rXHRcdHJldCA9IGNyZWF0ZV96b25lc19zdWJkaXJzKG5vZGVkaXIsIG5vZGVfaWR4LCBwZ2RhdGEpO1xuK1x0XHRpZiAocmV0KVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBfX2luaXQgcGFnZV9hbGxvY19ob2dnZXJfZGVidWdmc19pbml0KHZvaWQpXG4re1xuK1x0c3RydWN0IGRlbnRyeSAqZnJlZV9maWxlO1xuK1x0aW50IHJldDtcbitcbitcdHJlcV9hbGxvY19jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKFxuK1x0XHRcInJlcV9hbGxvY19jYWNoZVwiLCBzaXplb2Yoc3RydWN0IHJlcV9hbGxvYyksIDAsXG4rXHRcdFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7XG4rXHRpZiAoIXJlcV9hbGxvY19jYWNoZSkge1xuK1x0XHRwcl9lcnIoXCJUaGUgcmVxX2FsbG9jX2NhY2hlIGNvdWxkbid0IGJlIGNyZWF0ZWRcIik7XG4rXHRcdHJldCA9IC1FTk9NRU07XG4rXHRcdGdvdG8gZXJyb3JfZXhpdDtcbitcdH1cbitcbitcdHBhZ2VfYWxsb2NfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZShcbitcdFx0XCJwYWdlX2FsbG9jX2NhY2hlXCIsIHNpemVvZihzdHJ1Y3QgcGFnZV9hbGxvYyksIDAsXG4rXHRcdFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7XG4rXHRpZiAoIXBhZ2VfYWxsb2NfY2FjaGUpIHtcbitcdFx0cHJfZXJyKFwiVGhlIHBhZ2VfYWxsb2NfY2FjaGUgY291bGRuJ3QgYmUgY3JlYXRlZFwiKTtcbitcdFx0cmV0ID0gLUVOT01FTTtcbitcdFx0Z290byBjbGVhbl9yZXFfYWxsb2NfY2FjaGU7XG4rXHR9XG4rXG4rXHRtbWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihcIm1tXCIsIE5VTEwpO1xuK1x0aWYgKElTX0VSUihtbWRpcikpIHtcbitcdFx0cHJfZXJyKFwiVW5hYmxlIHRvIGNyZWF0ZSBtbSBkaXJlY3RvcnlcIik7XG4rXHRcdHJldCA9IFBUUl9FUlIobW1kaXIpO1xuK1x0XHRnb3RvIGNsZWFuX3BhZ2VfYWxsb2NfY2FjaGU7XG4rXHR9XG4rXG4rXHRyZXQgPSBjcmVhdGVfbm9kZXNfc3ViZGlycyhtbWRpcik7XG4rXHRpZiAocmV0KVxuK1x0XHRnb3RvIGNsZWFuX2RpcjtcbitcbitcdGZyZWVfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoXCJmcmVlXCIsIDA2NDQsIG1tZGlyLCBOVUxMLFxuK1x0XHRcdFx0XHRcdTAwMjZmcmVlX3BhZ2VfYWxsb2NfZm9wcyk7XG4rXHRpZiAoSVNfRVJSKGZyZWVfZmlsZSkpIHtcbitcdFx0cmV0ID0gUFRSX0VSUihmcmVlX2ZpbGUpO1xuK1x0XHRnb3RvIGNsZWFuX2RpcjtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK1xuK2NsZWFuX2RpcjpcbitcdGRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShtbWRpcik7XG4rXG4rY2xlYW5fcGFnZV9hbGxvY19jYWNoZTpcbitcdGttZW1fY2FjaGVfZGVzdHJveShwYWdlX2FsbG9jX2NhY2hlKTtcbitcbitjbGVhbl9yZXFfYWxsb2NfY2FjaGU6XG4rXHRrbWVtX2NhY2hlX2Rlc3Ryb3kocmVxX2FsbG9jX2NhY2hlKTtcbitcbitlcnJvcl9leGl0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIHZvaWQgX19leGl0IHBhZ2VfYWxsb2NfaG9nZ2VyX2RlYnVnZnNfZXhpdCh2b2lkKVxuK3tcbitcdHN0cnVjdCBwYWdlX2FsbG9jICpwYTtcbitcdHVuc2lnbmVkIGxvbmcgaWR4O1xuK1xuK1x0eGFfZm9yX2VhY2goXHUwMDI2YWxsb2NzX3hhLCBpZHgsIHBhKSB7XG4rXHRcdF9fZnJlZV9wYWdlcyhwYS1cdTAwM2VwYWdlLCBwYS1cdTAwM2VyZXFfYWxsb2MtXHUwMDNlb3JkZXIpO1xuK1x0XHR4YV9lcmFzZShcdTAwMjZhbGxvY3NfeGEsIGlkeCk7XG4rXHR9XG4rXG4rXHRkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUobW1kaXIpO1xuK1x0a21lbV9jYWNoZV9kZXN0cm95KHJlcV9hbGxvY19jYWNoZSk7XG4rXHRrbWVtX2NhY2hlX2Rlc3Ryb3kocGFnZV9hbGxvY19jYWNoZSk7XG4rfVxuK1xuK21vZHVsZV9pbml0KHBhZ2VfYWxsb2NfaG9nZ2VyX2RlYnVnZnNfaW5pdCk7XG4rbW9kdWxlX2V4aXQocGFnZV9hbGxvY19ob2dnZXJfZGVidWdmc19leGl0KTtcbitcbitNT0RVTEVfQVVUSE9SKFwiSnVhbiBZZXNjYXNcIik7XG4rTU9EVUxFX0RFU0NSSVBUSU9OKFwiTW9kdWxlIHRvIGFsbG9jIHBhZ2VzIHRvIGdlbmVyYXRlIG1lbW9yeSBwcmVzc3VyZVwiKTtcbitNT0RVTEVfTElDRU5TRShcIkdQTFwiKTtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI0VDEyOjE2OjIxLjk0NDk2Mzg5OFoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgxOTU5NjU1MjYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBcIlBhZ2UgQWxsb2MgSG9nZ2VyXCIgRGVidWdmcyBJbnRlcmZhY2UgZm9yIEZ1enppbmcqKlxuXG5Pa2F5LCBzbyB0aGVyZSdzIHRoaXMgbmV3IHBhdGNoLCBgcGFnZV9hbGxvY19ob2dnZXIuY2AsIHRoYXQgaW50cm9kdWNlcyBhIGRlYnVnZnMgaW50ZXJmYWNlLCBzcGVjaWZpY2FsbHkgdW5kZXIgYC9zeXMva2VybmVsL2RlYnVnL21tL2AuICBUaGUgZ29hbCBoZXJlIGlzIHRvIGNyZWF0ZSBhcnRpZmljaWFsIG1lbW9yeSBwcmVzc3VyZSBhbmQgdGVzdCB0aGluZ3MgbGlrZSBtZW1vcnkgcmVjbGFpbSwgdGhlIE91dC1vZi1NZW1vcnkgKE9PTSkga2lsbGVyLCBhbmQgcGFnZSBtaWdyYXRpb24uICBUaGUgaW1wb3J0YW50IHRoaW5nIGlzLCBpdCdzIGNvbmZpZ3VyYWJsZSB2aWEgYENPTkZJR19QQUdFQUxMT0NfSE9HR0VSYCBhbmQgcmVsaWVzIG9uIGBERUJVR19GU2AuXG5cbk15IGluaXRpYWwgdGhvdWdodCBpcywgaXMgdGhpcyBmdXp6YWJsZT8gIEFic29sdXRlbHkuIEl0IGdpdmVzIHVzIGEgd2F5IHRvIGFsbG9jYXRlIG1lbW9yeSB3aXRoIGEgdmFyaWV0eSBvZiBgR0ZQYCBmbGFncyBhbmQgYWxsb2NhdGlvbiBvcmRlcnMsIHdoaWNoIGNvdWxkIGJlIGEgZ29sZG1pbmUgZm9yIHRyaWdnZXJpbmcgaW50ZXJlc3RpbmcgbWVtb3J5IG1hbmFnZW1lbnQgYnVncyBvciBoaXR0aW5nIHRob3NlIGVkZ2UgY2FzZXMgdGhhdCBsZWFkIHRvIE9PTSBjb25kaXRpb25zLiAgSXQgc2VlbXMgdG8gYmUgYSBzdHJhaWdodGZvcndhcmQgaW50ZXJmYWNlIHRoYXQgZXNzZW50aWFsbHkganVzdCBjYWxscyBgYWxsb2NfcGFnZXNfbm9kZV9ub3Byb2ZgIGFuZCBgX19mcmVlX3BhZ2VzYCwgc28gaXQncyBhIHRlc3RpbmcgYW5kIGRlYnVnZ2luZyB0b29sLiBCdXQgdGhhdCdzIGV4YWN0bHkgd2h5IGZ1enppbmcgaXQgY291bGQgYmUgc28gdmFsdWFibGUsIHRlc3RpbmcgdGhlIHBhZ2UgYWxsb2NhdG9yIGFuZCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLlxuXG5Ob3csIHN5emthbGxlciwgYmVpbmcgdGhlIGZ1enppbmcgYmVoZW1vdGggdGhhdCBpdCBpcywgd2lsbCBsaWtlbHkgZ28gYWZ0ZXIgYW55IHJlYWNoYWJsZSBkZWJ1Z2ZzIGludGVyZmFjZXMuIFNvIGxldCdzIHRoaW5rOiBpcyBpdCByZWFjaGFibGU/IERlYnVnZnMgaXMgdHlwaWNhbGx5IG1vdW50ZWQsIGFuZCwgY3JpdGljYWxseSwgc3l6a2FsbGVyIHJ1bnMgYXMgcm9vdC4gQmluZ28uICBTbyBpdCdzIGRlZmluaXRlbHkgYWNjZXNzaWJsZS5cblxuTGV0J3MgcXVpY2tseSByZXZpZXcgdGhlIGNvcmUgZnVuY3Rpb25zIGluIGBwYWdlX2FsbG9jX2hvZ2dlci5jYDogYHJlcV9wYWdlX2FsbG9jX3dyaXRlYCwgYGZyZWVfcGFnZV9hbGxvY193cml0ZWAsIGBtYWtlX2FsbG9jYCwgYW5kIGBmcmVlX2FsbG9jX2hlbHBlcmAuICBTcGVjaWZpY2FsbHksIGByZXFfcGFnZV9hbGxvY193cml0ZWAgYW5kIGBmcmVlX3BhZ2VfYWxsb2Nfd3JpdGVgIHNlZW0gdG8gYmUgdGhlIHByaW1hcnkgdGFyZ2V0cywgdGhvc2UgYXJlIHRoZSBlbnRyeSBwb2ludHMuXG5cbkkgd2lsbCB1c2UgbXkgZXhpc3RpbmcgdG9vbHMgdG8gdmVyaWZ5IHRoYXQgdGhpcyBpcyBpbmRlZWQgdGhlIGNhc2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg0MjcsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozODQsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yNFQxMjoxNjozMC4xNDA5MzE1NjVaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjU0MjgwNTE2MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJQQUdFQUxMT0NfSE9HR0VSXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWcuZGVidWc9MzAwPWNvbmZpZyBQRVJfVk1BX0xPQ0tfU1RBVFNcXG4tLVxcbm1tL0tjb25maWcuZGVidWctMzEyLVxcbm1tL0tjb25maWcuZGVidWc6MzEzOmNvbmZpZyBQQUdFQUxMT0NfSE9HR0VSXFxubW0vS2NvbmZpZy5kZWJ1Zy0zMTQtXFx0Ym9vbCBcXFwiQWxsb2MgcGFnZXMgZnJvbSBkaWZmZXJlbnQgbm9kZXMsIHpvbmVzLCBtaWdyYXRlIHR5cGVzIGFuZCBvcmRlcnNcXFwiXFxuLS1cXG5tbS9NYWtlZmlsZT0xMzU9b2JqLSQoQ09ORklHX0RBTU9OKSArPSBkYW1vbi9cXG5tbS9NYWtlZmlsZToxMzY6b2JqLSQoQ09ORklHX1BBR0VBTExPQ19IT0dHRVIpICs9IHBhZ2VfYWxsb2NfaG9nZ2VyLm9cXG5tbS9NYWtlZmlsZS0xMzctb2JqLSQoQ09ORklHX0hBUkRFTkVEX1VTRVJDT1BZKSArPSB1c2VyY29weS5vXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI0VDEyOjE2OjMyLjY4Mzc0MTk3NloiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQxNDY5NjMxMzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhbmFseXNpcyBvZiB0aGUgc2l0dWF0aW9uOlxuXG4qKkludmVzdGlnYXRpbmcgdGhlIFBBR0VBTExPQ19IT0dHRVIgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIHNvIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIHN5c3RlbSBjb25maWd1cmVkIHdpdGggYFBBR0VBTExPQ19IT0dHRVJgLiBNeSBwcmltYXJ5IHRhcmdldHMgYXJlIHRoZSBmdW5jdGlvbnMgYHJlcV9wYWdlX2FsbG9jX3dyaXRlYCwgYGZyZWVfcGFnZV9hbGxvY193cml0ZWAsIGBtYWtlX2FsbG9jYCwgYW5kIGBmcmVlX2FsbG9jX2hlbHBlcmAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGlzIGNvbmZpZyBpbnRlcmFjdHMgd2l0aCB0aG9zZSBjb3JlIGFsbG9jYXRpb24gcm91dGluZXMuXG5cbkJlZm9yZSBkaXZpbmcgZGVlcCwgbGV0J3MganVzdCBtYWtlIHN1cmUgdGhlcmUgaXNuJ3Qgc29tZSBvYnZpb3VzIG90aGVyIHBsYWNlIEkgbmVlZCB0byBjb25zaWRlciAtIGxpa2UgYW4gaW5pdCBmdW5jdGlvbiBvciBhIHByZS1kZWZpbmVkIHNldCBvZiBjb25zdGFudHMuXG5cblJpZ2h0LCBsZXQgbWUganVzdCBxdWlja2x5IGdsYW5jZSBhdCBgcGFnZV9hbGxvY19yZWFkYC4gQWgsIGl0IGp1c3QgcmV0dXJucyB6ZXJvLiBUaGF0J3MgZ29vZCB0byBrbm93LCBidXQgbGlrZWx5IHdvbid0IGdpdmUgbWUgYW55IGNsdWVzLiBTbywgaXQgbG9va3MgbGlrZSBteSBhdHRlbnRpb24gc2hvdWxkIGJlIHByaW1hcmlseSBvbiBgcmVxX3BhZ2VfYWxsb2Nfd3JpdGVgIGFuZCBgbWFrZV9hbGxvY2AgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGJlaGF2aW9yIHVuZGVyIHRoaXMgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4gSSBuZWVkIHRvIGRpZyBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIHRob3NlIHR3byBmdW5jdGlvbnMuIExldCdzIHNlZSB3aGF0J3MgYWN0dWFsbHkgZ29pbmcgb24gaW4gdGhvc2UgaW1wbGVtZW50YXRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NDEyLCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMjRUMTI6MTY6MzYuODMwNzA4MjhaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NzYxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9wYWdlX2FsbG9jX2hvZ2dlci5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIxMCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAyMTA6XFx0XFx0c3RydWN0IGRlbnRyeSAqbmV3X2FsbG9jX2RlbnRyeTtcXG4gMjExOlxcdFxcdGludCByZXQ7XFxuIDIxMjpcXHRcXG4gMjEzOlxcdFxcdHBhZ2UgPSBhbGxvY19wYWdlc19ub2RlX25vcHJvZihyZXEtXFx1MDAzZW5vZGVfaWR4LCBmbGFncywgcmVxLVxcdTAwM2VvcmRlcik7XFxuIDIxNDpcXHRcXHRpZiAocGFnZSkge1xcbiAyMTU6XFx0XFx0XFx0cGEgPSBrbWVtX2NhY2hlX2FsbG9jKHBhZ2VfYWxsb2NfY2FjaGUsIEdGUF9LRVJORUwpO1xcbiAyMTY6XFx0XFx0XFx0aWYgKCFwYSkge1xcbiAyMTc6XFx0XFx0XFx0XFx0cmV0ID0gLUVOT01FTTtcXG4gMjE4OlxcdFxcdFxcdFxcdGdvdG8gZnJlZV9wYWdlcztcXG4gMjE5OlxcdFxcdFxcdH1cXG4gMjIwOlxcdFxcbiAyMjE6XFx0XFx0XFx0KmFsbG9jX2lkID0gYXRvbWljX2xvbmdfaW5jX3JldHVybihcXHUwMDI2YWxsb2NzX2ZpbGVfc2VxKTtcXG4gMjIyOlxcdFxcdFxcdHJldCA9IHhhX2luc2VydChcXHUwMDI2YWxsb2NzX3hhLCAqYWxsb2NfaWQsIHBhLCBHRlBfS0VSTkVMKTtcXG4gMjIzOlxcdFxcdFxcdGlmIChyZXQpXFxuIDIyNDpcXHRcXHRcXHRcXHRnb3RvIGZyZWVfcGFnZV9hbGxvYztcXG4gMjI1OlxcdFxcbiAyMjY6XFx0XFx0XFx0c25wcmludGYobmV3X2FsbG9jX25hbWUsIHNpemVvZihuZXdfYWxsb2NfbmFtZSksIFxcXCIlbHVcXFwiLFxcbiAyMjc6XFx0XFx0XFx0XFx0ICphbGxvY19pZCk7XFxuIDIyODpcXHRcXG4gMjI5OlxcdFxcdFxcdG5ld19hbGxvY19kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKFxcbiAyMzA6XFx0XFx0XFx0XFx0bmV3X2FsbG9jX25hbWUsIDA2NDQsIHJlcS1cXHUwMDNlcGFyZW50ZGlyLFxcbiAyMzE6XFx0XFx0XFx0XFx0cGEsIFxcdTAwMjZwYWdlX2FsbG9jX2ZvcHMpO1xcbiAyMzI6XFx0XFx0XFx0aWYgKElTX0VSUihuZXdfYWxsb2NfZGVudHJ5KSkge1xcbiAyMzM6XFx0XFx0XFx0XFx0cmV0ID0gUFRSX0VSUihuZXdfYWxsb2NfZGVudHJ5KTtcXG4gMjM0OlxcdFxcdFxcdFxcdGdvdG8gZXJhc2VfeGFfZW50cnk7XFxuIDIzNTpcXHRcXHRcXHR9XFxuIDIzNjpcXHRcXG4gMjM3OlxcdFxcdFxcdHBhLVxcdTAwM2VyZXFfYWxsb2MgPSByZXE7XFxuIDIzODpcXHRcXHRcXHRwYS1cXHUwMDNlcGFnZSA9IHBhZ2U7XFxuIDIzOTpcXHRcXHRcXHRwYS1cXHUwMDNlYWxsb2NfZGVudHJ5ID0gbmV3X2FsbG9jX2RlbnRyeTtcXG4gMjQwOlxcdFxcdH0gZWxzZSB7XFxuIDI0MTpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gMjQyOlxcdFxcdH1cXG4gMjQzOlxcdFxcbiAyNDQ6XFx0XFx0cmV0dXJuIDA7XFxuIDI0NTpcXHRcXG4gMjQ2OlxcdGVyYXNlX3hhX2VudHJ5OlxcbiAyNDc6XFx0XFx0eGFfZXJhc2UoXFx1MDAyNmFsbG9jc194YSwgKmFsbG9jX2lkKTtcXG4gMjQ4OlxcdFxcbiAyNDk6XFx0ZnJlZV9wYWdlX2FsbG9jOlxcbiAyNTA6XFx0XFx0a21lbV9jYWNoZV9mcmVlKHBhZ2VfYWxsb2NfY2FjaGUsIHBhKTtcXG4gMjUxOlxcdFxcbiAyNTI6XFx0ZnJlZV9wYWdlczpcXG4gMjUzOlxcdFxcdF9fZnJlZV9wYWdlcyhwYWdlLCBwYS1cXHUwMDNlcmVxX2FsbG9jLVxcdTAwM2VvcmRlcik7XFxuIDI1NDpcXHRcXG4gMjU1OlxcdFxcdHJldHVybiByZXQ7XFxuIDI1NjpcXHR9XFxuIDI1NzpcXHRcXG4gMjU4OlxcdHN0YXRpYyBpbnQgZnJlZV9hbGxvY19oZWxwZXIodW5zaWduZWQgbG9uZyBhbGxvY19pZClcXG4gMjU5OlxcdHtcXG4gMjYwOlxcdFxcdHN0cnVjdCBwYWdlX2FsbG9jICpwYTtcXG4gMjYxOlxcdFxcbiAyNjI6XFx0XFx0cGEgPSB4YV9lcmFzZShcXHUwMDI2YWxsb2NzX3hhLCBhbGxvY19pZCk7XFxuIDI2MzpcXHRcXHRpZiAoIXBhKSB7XFxuIDI2NDpcXHRcXHRcXHRwcl9lcnIoXFxcIlRoZSBhbGxvY19pZCAlbHUgd2FzIG5vdCBmb3VuZCFcXFwiLCBhbGxvY19pZCk7XFxuIDI2NTpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMjY2OlxcdFxcdH1cXG4gMjY3OlxcdFxcbiAyNjg6XFx0XFx0X19mcmVlX3BhZ2VzKHBhLVxcdTAwM2VwYWdlLCBwYS1cXHUwMDNlcmVxX2FsbG9jLVxcdTAwM2VvcmRlcik7XFxuIDI2OTpcXHRcXHRkZWJ1Z2ZzX3JlbW92ZShwYS1cXHUwMDNlYWxsb2NfZGVudHJ5KTtcXG4gMjcwOlxcdFxcdGttZW1fY2FjaGVfZnJlZShwYWdlX2FsbG9jX2NhY2hlLCBwYSk7XFxuIDI3MTpcXHRcXG4gMjcyOlxcdFxcdHJldHVybiAwO1xcbiAyNzM6XFx0fVxcbiAyNzQ6XFx0XFxuIDI3NTpcXHQvKipcXG4gMjc2OlxcdCAqIHJlcV9wYWdlX2FsbG9jX3dyaXRlKCkgLSBBbGxvY2F0ZXMgdGhlIHBhZ2VzIG9uIHRoZSByZXF1ZXN0ZWQgbm9kZSwgem9uZSxcXG4gMjc3OlxcdCAqIG9yZGVyIGFuZCBtaWdyYXRlIHR5cGUuIE9uY2UgdGhlIGFsbG9jYXRpb24gaXMgcGVyZm9ybWVkLCBhIGZpbGUgaXMgY3JlYXRlZFxcbiAyNzg6XFx0ICogdG8gZnJlZSB0aGUgYWxsb2NhdGlvbiBsYXRlci5cXG4gMjc5OlxcdCAqL1xcbiAyODA6XFx0c3RhdGljIHNzaXplX3QgcmVxX3BhZ2VfYWxsb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1YnVmLFxcbiAyODE6XFx0XFx0XFx0XFx0XFx0ICAgICBzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpXFxuIDI4MjpcXHR7XFxuIDI4MzpcXHRcXHRzdHJ1Y3QgcmVxX2FsbG9jICpyZXEgPSBmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxuIDI4NDpcXHRcXHR1bnNpZ25lZCBsb25nIGFsbG9jX2lkO1xcbiAyODU6XFx0XFx0dW5zaWduZWQgbG9uZyBucl9wYWdlc19hbGxvY3M7XFxuIDI4NjpcXHRcXHR1bnNpZ25lZCBsb25nICphbGxvY3NfaWRzO1xcbiAyODc6XFx0XFx0Z2ZwX3QgZmxhZ3MgPSAwO1xcbiAyODg6XFx0XFx0aW50IHJldDtcXG4gMjg5OlxcdFxcdGludCBpO1xcbiAyOTA6XFx0XFxuIDI5MTpcXHRcXHRyZXQgPSBrc3RydG91bF9mcm9tX3VzZXIodWJ1ZiwgY250LCAxMCwgXFx1MDAyNm5yX3BhZ2VzX2FsbG9jcyk7XFxuIDI5MjpcXHRcXHRpZiAocmV0KVxcbiAyOTM6XFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gMjk0OlxcdFxcbiAyOTU6XFx0XFx0YWxsb2NzX2lkcyA9IGttYWxsb2NfYXJyYXkobnJfcGFnZXNfYWxsb2NzLCBzaXplb2YodW5zaWduZWQgbG9uZyksXFxuIDI5NjpcXHRcXHRcXHRcXHRcXHRcXHRHRlBfS0VSTkVMKTtcXG4gMjk3OlxcdFxcdGlmICghYWxsb2NzX2lkcylcXG4gMjk4OlxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbiAyOTk6XFx0XFxuIDMwMDpcXHRcXHRzZXRfem9uZV90b19hbGxvY19mcm9tKHJlcS1cXHUwMDNlem9uZV9pZHgsIFxcdTAwMjZmbGFncyk7XFxuIDMwMTpcXHRcXHRzZXRfbWlncmF0ZV90eXBlX3RvX2FsbG9jX2Zyb20ocmVxLVxcdTAwM2VtaWdyYXRlX3R5cGUsIFxcdTAwMjZmbGFncyk7XFxuIDMwMjpcXHRcXG4gMzAzOlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9wYWdlc19hbGxvY3M7IGkrKykge1xcbiAzMDQ6XFx0XFx0XFx0cmV0ID0gbWFrZV9hbGxvYyhyZXEsIGZsYWdzLCBcXHUwMDI2YWxsb2NfaWQpO1xcbiAzMDU6XFx0XFx0XFx0aWYgKHJldClcXG4gMzA2OlxcdFxcdFxcdFxcdGdvdG8gZnJlZV9hbGxvY3M7XFxuIDMwNzpcXHRcXG4gMzA4OlxcdFxcdFxcdGFsbG9jc19pZHNbaV0gPSBhbGxvY19pZDtcXG4gMzA5OlxcdFxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjRUMTI6MTY6MzYuODMwNzk3NzNaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2NTM4NDkxNzQ5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIFBhZ2UgQWxsb2NhdG9yIFRlc3RpbmcgQ29kZSoqXG5cbk9rYXksIHNvIHRoZSBjb2RlIGlzIGZ1bmN0aW9uYWwg4oCTIGdvb2Qgc3RhcnQhIEl0J3MgZGVzaWduZWQgdG8gdGVzdCB0aGUgcGFnZSBhbGxvY2F0b3IsIHNwZWNpZmljYWxseSBieSBwcm92aWRpbmcgYSBkZWJ1Z2ZzIGludGVyZmFjZS4gVGhpcyBhbGxvd3MgZm9yIGNvbnRyb2xsZWQgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBvZiBwYWdlcywgd2l0aCBzcGVjaWZpYyBwYXJhbWV0ZXJzLiBIbW0sIHRoaXMgaXMgaW50ZXJlc3RpbmcuLi4gSSBjYW4gc2VlIHRoZSBpbW1lZGlhdGUgYXBwbGljYXRpb24gaGVyZTogaXQgbG9va3MgbGlrZSBpdCdkIGJlIHByZXR0eSBkYXJuIHVzZWZ1bCBmb3IgZnV6emluZyB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLiBUaGF0J3MgYSB2YWx1YWJsZSBjYXBhYmlsaXR5IHRvIGhhdmUuIEknbSBnb2luZyB0byBmbGFnIHRoaXMgYXMgc29tZXRoaW5nIFdvcnRoRnV6emluZy5cblxuSSBuZWVkIHRvIGZvY3VzIG9uIGEgZmV3IGtleSBzeW1ib2xzIGhlcmU6IGByZXFfcGFnZV9hbGxvY193cml0ZWAsIGBmcmVlX3BhZ2VfYWxsb2Nfd3JpdGVgLCBgbWFrZV9hbGxvY2AsIGFuZCBgZnJlZV9hbGxvY19oZWxwZXJgLiBUaG9zZSBhcmUgdGhlIGVudHJ5IHBvaW50cyBhbmQgY29yZSBmdW5jdGlvbnMgdGhhdCBJJ2xsIG5lZWQgdG8gdW5kZXJzdGFuZCBpbiBkZXRhaWwgdG8gZnVsbHkgbGV2ZXJhZ2UgdGhpcyBmb3IgdGVzdGluZy5cblxuQW5kIG9mIGNvdXJzZSwgSSBzaG91bGQgbWFrZSBzdXJlIHRoYXQgdGhlIGBQQUdFQUxMT0NfSE9HR0VSYCBjb25maWcgaXMgZW5hYmxlZCB0byB1c2UgdGhlIGRlYnVnZ2luZyB0b29sLlxuXG5BbHJpZ2h0LCBsZXQgbWUganVzdCBkb3VibGUtY2hlY2ssIGJlY2F1c2UgSSdtIGEgYml0IG9ic2Vzc2l2ZSBhYm91dCBiZWluZyB0aG9yb3VnaC4gQWgsIHllcywgdGhlIHBhdGNoIGlzIGEgbmV3IGZpbGUsIGBtbS9wYWdlX2FsbG9jX2hvZ2dlci5jYCwgd2hpY2ggbWFrZXMgc2Vuc2UuIEl0J3MgYWRkaW5nIHRoYXQgZGVidWdmcyBpbnRlcmZhY2UsIHdoaWNoIGNvbmZpcm1zIG15IGluaXRpYWwgaW1wcmVzc2lvbi4gVGhlIGZ1bmN0aW9uYWxpdHkgaXMgZGVmaW5pdGVseSB0aGVyZSwgYW5kIGl0J3MgcmVhY2hhYmxlIHZpYSBkZWJ1Z2ZzLlxuXG5HcmVhdC4gTG9va3MgbGlrZSBJJ3ZlIGdvdCBldmVyeXRoaW5nIEkgbmVlZC4gVGltZSB0byBzZXQtcmVzdWx0cy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTEyNTYsIk91dHB1dFRva2VucyI6MTQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTU4LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMjRUMTI6MTY6NDMuMzY5MjkxNjU5WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NjM1OTc1MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiUEFHRUFMTE9DX0hPR0dFUlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInJlcV9wYWdlX2FsbG9jX3dyaXRlXCIsXG4gICAgXCJmcmVlX3BhZ2VfYWxsb2Nfd3JpdGVcIixcbiAgICBcIm1ha2VfYWxsb2NcIixcbiAgICBcImZyZWVfYWxsb2NfaGVscGVyXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBkZWJ1Z2ZzIGludGVyZmFjZSBmb3IgYWxsb2NhdGluZyBwYWdlcyBmcm9tIHNwZWNpZmljIG5vZGVzLCB6b25lcywgbWlncmF0ZSB0eXBlcywgYW5kIG9yZGVycy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgdGVzdGluZy9kZWJ1Z2dpbmcgdG9vbCB0aGF0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIG1lbW9yeSBwcmVzc3VyZSBhbmQgdGVzdCB0aGUgY29yZSBwYWdlIGFsbG9jYXRvciBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLiBGdXp6aW5nIGl0IGlzIHZhbHVhYmxlIHRvIHVuY292ZXIgcG90ZW50aWFsIGJ1Z3MgaW4gbWVtb3J5IG1hbmFnZW1lbnQgb3IgT09NIGhhbmRsaW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlBBR0VBTExPQ19IT0dHRVJcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJyZXFfcGFnZV9hbGxvY193cml0ZVwiLFxuICAgIFwiZnJlZV9wYWdlX2FsbG9jX3dyaXRlXCIsXG4gICAgXCJtYWtlX2FsbG9jXCIsXG4gICAgXCJmcmVlX2FsbG9jX2hlbHBlclwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZGVidWdmcyBpbnRlcmZhY2UgZm9yIGFsbG9jYXRpbmcgcGFnZXMgZnJvbSBzcGVjaWZpYyBub2Rlcywgem9uZXMsIG1pZ3JhdGUgdHlwZXMsIGFuZCBvcmRlcnMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIHRlc3RpbmcvZGVidWdnaW5nIHRvb2wgdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBtZW1vcnkgcHJlc3N1cmUgYW5kIHRlc3QgdGhlIGNvcmUgcGFnZSBhbGxvY2F0b3IgYW5kIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS4gRnV6emluZyBpdCBpcyB2YWx1YWJsZSB0byB1bmNvdmVyIHBvdGVudGlhbCBidWdzIGluIG1lbW9yeSBtYW5hZ2VtZW50IG9yIE9PTSBoYW5kbGluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },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-workflowb7fjp[0].run-triage(0) Phase: Succeeded StartedAt: 2026-07-24 11:54:07 +0000 UTC FinishedAt: 2026-07-24 12:16:44 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "86f436567f2516a0083b210bedc933544826a2c3", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "PAGEALLOC_HOGGER" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "86f436567f2516a0083b210bedc933544826a2c3", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "PAGEALLOC_HOGGER" ], "series_id": "40d3dcc5-980e-4f8f-b6af-10f9e0689de3" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "req_page_alloc_write", "free_page_alloc_write", "make_alloc", "free_alloc_helper" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI0IDEyOjE2PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1BBR0VBTExPQ19IT0dHRVImIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtyZXFfcGFnZV9hbGxvY193cml0ZSYjMzQ7LAogICAgJiMzNDtmcmVlX3BhZ2VfYWxsb2Nfd3JpdGUmIzM0OywKICAgICYjMzQ7bWFrZV9hbGxvYyYjMzQ7LAogICAgJiMzNDtmcmVlX2FsbG9jX2hlbHBlciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGRlYnVnZnMgaW50ZXJmYWNlIGZvciBhbGxvY2F0aW5nIHBhZ2VzIGZyb20gc3BlY2lmaWMgbm9kZXMsIHpvbmVzLCBtaWdyYXRlIHR5cGVzLCBhbmQgb3JkZXJzLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCB0ZXN0aW5nL2RlYnVnZ2luZyB0b29sIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgbWVtb3J5IHByZXNzdXJlIGFuZCB0ZXN0IHRoZSBjb3JlIHBhZ2UgYWxsb2NhdG9yIGFuZCBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uIEZ1enppbmcgaXQgaXMgdmFsdWFibGUgdG8gdW5jb3ZlciBwb3RlbnRpYWwgYnVncyBpbiBtZW1vcnkgbWFuYWdlbWVudCBvciBPT00gaGFuZGxpbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjQgMTI6MTY8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA4YWI5MGI1NmY3MWJiMWQxMDcyNzc1N2I4ZjY5YzQ5MWVjODU3NmEwXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBKdWwgMjQgMTI6MTY6MTkgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vS2NvbmZpZy5kZWJ1ZyBiL21tL0tjb25maWcuZGVidWdcbmluZGV4IDc2MzhkNzViMjdkYjhjLi5jOGZjZWNkY2E2YWNhOSAxMDA2NDRcbi0tLSBhL21tL0tjb25maWcuZGVidWdcbiYjNDM7JiM0MzsmIzQzOyBiL21tL0tjb25maWcuZGVidWdcbkBAIC0zMDksMyAmIzQzOzMwOSwxNSBAQCBjb25maWcgUEVSX1ZNQV9MT0NLX1NUQVRTXG4gXHQgIG92ZXJoZWFkIGluIHRoZSBwYWdlIGZhdWx0IHBhdGguXG4gXG4gXHQgIElmIGluIGRvdWJ0LCBzYXkgTi5cbiYjNDM7XG4mIzQzO2NvbmZpZyBQQUdFQUxMT0NfSE9HR0VSXG4mIzQzO1x0Ym9vbCBcJiMzNDtBbGxvYyBwYWdlcyBmcm9tIGRpZmZlcmVudCBub2Rlcywgem9uZXMsIG1pZ3JhdGUgdHlwZXMgYW5kIG9yZGVyc1wmIzM0O1xuJiM0MztcdGRlcGVuZHMgb24gREVCVUdfRlNcbiYjNDM7XHRoZWxwXG4mIzQzO1x0ICBTYXkgWSB0byBhbGxvYyBwYWdlcyBmcm9tIGRpZmZlcmVudCBub2Rlcywgem9uZXMsIG1pZ3JhdGUgdHlwZSBhbmRcbiYjNDM7XHQgIG9yZGVycyB1c2luZyB0aGUgZGVidWcgZnMgZmlsZXN5c3RlbS4gVGhpcyBoZWxwcyB0byBnZW5lcmF0ZSBtZW1vcnlcbiYjNDM7XHQgIHByZXNzdXJlIGVhc2lseS4gVGhpcyBpcyB1c2VmdWwgdG8gZGVidWcgbWVtb3J5IHJlY2xhaW1zIGlzc3VlcyxcbiYjNDM7XHQgIE9PTSB0cmlnZ2VycywgcGFnZSBtaWdyYXRpb24gaXNzdWVzLCBldGMuXG4mIzQzO1xuJiM0MztcdCAgSWYgaW4gZG91YnQsIHNheSBOLlxuJiM0MztcbmRpZmYgLS1naXQgYS9tbS9NYWtlZmlsZSBiL21tL01ha2VmaWxlXG5pbmRleCAyZDA1NzBhMTZlNWJlYi4uYjQ4ZjJhYzZlZTgwODkgMTAwNjQ0XG4tLS0gYS9tbS9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvbW0vTWFrZWZpbGVcbkBAIC0xMzMsNiAmIzQzOzEzMyw3IEBAIG9iai0kKENPTkZJR19JRExFX1BBR0VfVFJBQ0tJTkcpICYjNDM7PSBwYWdlX2lkbGUub1xuIG9iai0kKENPTkZJR19ERUJVR19QQUdFQUxMT0MpICYjNDM7PSBkZWJ1Z19wYWdlX2FsbG9jLm9cbiBvYmotJChDT05GSUdfREVCVUdfUEFHRV9SRUYpICYjNDM7PSBkZWJ1Z19wYWdlX3JlZi5vXG4gb2JqLSQoQ09ORklHX0RBTU9OKSAmIzQzOz0gZGFtb24vXG4mIzQzO29iai0kKENPTkZJR19QQUdFQUxMT0NfSE9HR0VSKSAmIzQzOz0gcGFnZV9hbGxvY19ob2dnZXIub1xuIG9iai0kKENPTkZJR19IQVJERU5FRF9VU0VSQ09QWSkgJiM0Mzs9IHVzZXJjb3B5Lm9cbiBvYmotJChDT05GSUdfUEVSQ1BVX1NUQVRTKSAmIzQzOz0gcGVyY3B1LXN0YXRzLm9cbiBvYmotJChDT05GSUdfWk9ORV9ERVZJQ0UpICYjNDM7PSBtZW1yZW1hcC5vXG5kaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvY19ob2dnZXIuYyBiL21tL3BhZ2VfYWxsb2NfaG9nZ2VyLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uZjU1NGJiYjRhZmE3MzBcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL21tL3BhZ2VfYWxsb2NfaG9nZ2VyLmNcbkBAIC0wLDAgJiM0MzsxLDYxMSBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKlxuJiM0MzsgKiBQYWdlIGFsbG9jYXRvciBEZWJ1Z0ZTIEludGVyZmFjZVxuJiM0MzsgKiBBdXRob3I6IEp1YW4gWWVzY2FzIFx1MDAzY2p5ZXNjYXNAZ29vZ2xlLmNvbVx1MDAzZVxuJiM0MzsgKlxuJiM0MzsgKiBUaGlzIG1vZHVsZSBhbGxvd3MgdG8gbWFrZSBwYWdlIGFsbG9jcyBwZXIgbm9kZSwgem9uZSwgbWlncmF0ZSB0eXBlXG4mIzQzOyAqIGFuZCBvcmRlciB1c2luZyB0aGUgRGVidWdGUyBmaWxlc3lzdGVtLlxuJiM0MzsgKlxuJiM0MzsgKiBXaGVuIHRoaXMgbW9kdWxlIGlzIGluc3RhbGxlZCBhbmQgdGhlIGRlYnVnZnMgaXMgbW91bnRlZCwgdGhlIFwmIzM0O21tXCYjMzQ7IGRpcmVjdG9yeVxuJiM0MzsgXCYjMzQ7IHdpbGwgYmUgY3JlYXRlZCBpbiBcdTAwM2NkZWJ1Z2ZzIG1vdW50IHBvaW50XHUwMDNlL21tXCYjMzQ7IGRpcmVjdG9yeS4gVW5kZXIgdGhpcyBkaXJlY3RvcnksXG4mIzQzOyAqIHRoZXJlIHdpbGwgYmUgc3ViZGlycyB0byBzZWxlY3QgdGhlIG5vZGVzLCB6b25lcywgb3JkZXJzIGFuZCBtaWdyYXRlIHR5cGUuXG4mIzQzOyAqXG4mIzQzOyAqIEZvciBleGFtcGxlOlxuJiM0MzsgKlxuJiM0MzsgKiAgICAgIC9zeXMva2VybmVsL2RlYnVnL21tL1xuJiM0MzsgKiAgICAgIHwtLSBmcmVlXG4mIzQzOyAqICAgICAgYC0tIG5vZGUtMFxuJiM0MzsgKiAgICAgICAgIHwtLSB6b25lLURNQVxuJiM0MzsgKiAgICAgICAgIHwgICB8LS0gb3JkZXItMFxuJiM0MzsgKiAgICAgICAgIHwgICB8ICAgfC0tIG1pZ3JhdGUtSGlnaEF0b21pY1xuJiM0MzsgKiAgICAgICAgIHwgICB8ICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcbiYjNDM7ICogICAgICAgICB8ICAgfCAgIHwtLSBtaWdyYXRlLU1vdmFibGVcbiYjNDM7ICogICAgICAgICB8ICAgfCAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXG4mIzQzOyAqICAgICAgICAgfCAgIHwgICB8LS0gbWlncmF0ZS1SZWNsYWltYWJsZVxuJiM0MzsgKiAgICAgICAgIHwgICB8ICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcbiYjNDM7ICogICAgICAgICB8ICAgfCAgIGAtLSBtaWdyYXRlLVVubW92YWJsZVxuJiM0MzsgKiAgICAgICAgIHwgICB8ICAgICAgIGAtLSBucl9wYWdlc19hbGxvY3NcbiYjNDM7ICogICAgICAgICB8ICAgfC0tIC4uLlxuJiM0MzsgKiAgICAgICAgIHwgICB8XG4mIzQzOyAqICAgICAgICAgfCAgIGAtLSBvcmRlci05XG4mIzQzOyAqICAgICAgICAgfCAgICAgICB8LS0gbWlncmF0ZS1IaWdoQXRvbWljXG4mIzQzOyAqICAgICAgICAgfCAgICAgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuJiM0MzsgKiAgICAgICAgIHwgICAgICAgfC0tIG1pZ3JhdGUtTW92YWJsZVxuJiM0MzsgKiAgICAgICAgIHwgICAgICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcbiYjNDM7ICogICAgICAgICB8ICAgICAgIHwtLSBtaWdyYXRlLVJlY2xhaW1hYmxlXG4mIzQzOyAqICAgICAgICAgfCAgICAgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuJiM0MzsgKiAgICAgICAgIHwgICAgICAgYC0tIG1pZ3JhdGUtVW5tb3ZhYmxlXG4mIzQzOyAqICAgICAgICAgfCAgICAgICAgICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuJiM0MzsgKiAgICAgICAgIGAtLSB6b25lLU5vcm1hbFxuJiM0MzsgKiAgICAgICAgICAgICB8LS0gb3JkZXItMFxuJiM0MzsgKiAgICAgICAgICAgICB8ICAgfC0tIG1pZ3JhdGUtSGlnaEF0b21pY1xuJiM0MzsgKiAgICAgICAgICAgICB8ICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcbiYjNDM7ICogICAgICAgICAgICAgfCAgIHwtLSBtaWdyYXRlLU1vdmFibGVcbiYjNDM7ICogICAgICAgICAgICAgfCAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXG4mIzQzOyAqICAgICAgICAgICAgIHwgICB8LS0gbWlncmF0ZS1SZWNsYWltYWJsZVxuJiM0MzsgKiAgICAgICAgICAgICB8ICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcbiYjNDM7ICogICAgICAgICAgICAgfCAgIGAtLSBtaWdyYXRlLVVubW92YWJsZVxuJiM0MzsgKiAgICAgICAgICAgICB8ICAgICAgIGAtLSBucl9wYWdlc19hbGxvY3NcbiYjNDM7ICogICAgICAgICAgICAgfC0tIC4uLi5cbiYjNDM7ICogICAgICAgICAgICAgfFxuJiM0MzsgKiAgICAgICAgICAgICBgLS0gb3JkZXItOVxuJiM0MzsgKiAgICAgICAgICAgICAgICAgfC0tIG1pZ3JhdGUtSGlnaEF0b21pY1xuJiM0MzsgKiAgICAgICAgICAgICAgICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcbiYjNDM7ICogICAgICAgICAgICAgICAgIHwtLSBtaWdyYXRlLU1vdmFibGVcbiYjNDM7ICogICAgICAgICAgICAgICAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXG4mIzQzOyAqICAgICAgICAgICAgICAgICB8LS0gbWlncmF0ZS1SZWNsYWltYWJsZVxuJiM0MzsgKiAgICAgICAgICAgICAgICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcbiYjNDM7ICogICAgICAgICAgICAgICAgIGAtLSBtaWdyYXRlLVVubW92YWJsZVxuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgIGAtLSBucl9wYWdlc19hbGxvY3NcbiYjNDM7ICpcbiYjNDM7ICogVXNhZ2U6XG4mIzQzOyAqXG4mIzQzOyAqIDEuIFRvIHRyaWdnZXIgdGhlIGFsbG9jYXRpb24sIG5hdmlnYXRlIHRvIHRoZSBkZWJ1Z2ZzIHBhdGggY29ycmVzcG9uZGluZ1xuJiM0MzsgKiAgICB0byB5b3VyIHRhcmdldCBub2RlLCBtZW1vcnkgem9uZSwgYWxsb2NhdGlvbiBvcmRlciwgYW5kIG1pZ3JhdGlvbiB0eXBlLFxuJiM0MzsgKiAgICB0aGVuIHdyaXRlIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvbiBjb3VudCB0byBucl9wYWdlc19hbGxvY3MuXG4mIzQzOyAqXG4mIzQzOyAqICAgIEZvciBleGFtcGxlLCB0byBtYWtlIDMgYWxsb2NzIG9mIG9yZGVyIDksIE1pZ3JhdGUgVHlwZSBNb3ZhYmxlLFxuJiM0MzsgKiAgICBab25lIE5vcm1hbCBhbmQgTm9kZSAwLCBydW46XG4mIzQzOyAqXG4mIzQzOyAqICAgICQgZWNobyAzIFx1MDAzZSAvc3lzL2tlcm5lbC9kZWJ1Zy9tbS9ub2RlLTAvem9uZS1Ob3JtYWwvb3JkZXItOS9taWdyYXRlLU1vdmFibGUvbnJfcGFnZXNfYWxsb2NzXG4mIzQzOyAqXG4mIzQzOyAqIDIuIEZvciBlYWNoIGFsbG9jYXRpb24gY3JlYXRlZCwgYSBjb3JyZXNwb25kaW5nIGZpbGUgbmFtZWQgc2VxdWVudGlhbGx5XG4mIzQzOyAqICAgICgxLCAyLCBuKSB3aWxsIGFwcGVhciBpbiB0aGF0IGRpcmVjdG9yeS5cbiYjNDM7ICpcbiYjNDM7ICogICAgJCBscyAvc3lzL2tlcm5lbC9kZWJ1Zy9tbS9ub2RlLTAvem9uZS1Ob3JtYWwvb3JkZXItOS9taWdyYXRlLU1vdmFibGUvXG4mIzQzOyAqICAgIDEgICAyICAgMyAgbnJfcGFnZXNfYWxsb2NzXG4mIzQzOyAqXG4mIzQzOyAqIDMuIFRvIGZyZWUgdGhlIGFsbG9jYXRpb24sIHdyaXRlIHRoZSBhbGxvY2F0aW9uIGZpbGUgbmFtZSBpbiAvc3lzL2tlcm5lbC9kZWJ1Zy9tbS9mcmVlLlxuJiM0MzsgKiAgICBGb3IgZXhhbXBsZSwgdG8gcmVsZWFzZSB0aGUgMm5kIGFsbG9jYXRpb24gcnVuOlxuJiM0MzsgKlxuJiM0MzsgKiAgICAkIGVjaG8gMiBcdTAwM2UgL3N5cy9rZXJuZWwvZGVidWcvbW0vZnJlZVxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgXCYjMzQ7OiBcJiMzNDsgZm10XG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9hdG9taWMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9lcnJuby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2RlYnVnZnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9nZnAuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9nZnBfdHlwZXMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9oaWdobWVtLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgva2VybmVsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbW16b25lLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbW9kdWxlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbm9kZW1hc2suaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9wcmludGsuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgveGFycmF5LmhcdTAwM2VcbiYjNDM7XG4mIzQzO3N0cnVjdCBkZW50cnkgKm1tZGlyO1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGF0b21pY19sb25nX3QgYWxsb2NzX2ZpbGVfc2VxIC0gUmVwcmVzZW50cyB0aGUgbmFtaW5nIHNlcXVlbmNlIHVzZWQgZm9yXG4mIzQzOyAqIGFsbG9jYXRpb24gZmlsZXMuXG4mIzQzOyAqL1xuJiM0MzthdG9taWNfbG9uZ190IGFsbG9jc19maWxlX3NlcSA9IEFUT01JQ19JTklUKDApO1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGFsbG9jc194YSAtIFJlcHJlc2VudCB0aGUgeGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGFjdHVhbCBhbGxvY2F0aW9ucyBwZXJmb3JtXG4mIzQzOyAqIGJ5IHRoaXMgZHJpdmVyLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIERFRklORV9YQVJSQVkoYWxsb2NzX3hhKTtcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBzdHJ1Y3QgcmVxX2FsbG9jIC0gUmVwcmVzZW50cyB0aGUgcmVxdWVzdGVkIGFsbG9jYXRpb25cbiYjNDM7ICogQG5vZGVfaWR4OiBUaGUgTm9kZSBpbmRleCB0byBhbGxvY2F0ZSBmcm9tLlxuJiM0MzsgKiBAem9uZV9pZHg6IFRoZSBab25lIGluZGV4IHRvIGFsbG9jYXRlIGZyb20uXG4mIzQzOyAqIEBvcmRlcjogVGhlIE9yZGVyIG9mIHBhZ2VzIHRvIGFsbG9jYXRlLlxuJiM0MzsgKiBAbWlncmF0ZV90eXBlOiBUaGUgTWlncmF0ZSB0eXBlIHRvIGFsbG9jYXRlIGZyb20uXG4mIzQzOyAqIEBwYXJlbnRkaXI6IFRoZSBwYXJlbnQgZGlyIHdoZXJlIHRoZSBmaWxlIHJlcHJlc2VudGluZyB0aGUgYWxsb2Mgd2FzIGNyZWF0ZWQuXG4mIzQzOyAqL1xuJiM0MztzdHJ1Y3QgcmVxX2FsbG9jIHtcbiYjNDM7XHRpbnQgbm9kZV9pZHg7XG4mIzQzO1x0aW50IHpvbmVfaWR4O1xuJiM0MztcdGludCBvcmRlcjtcbiYjNDM7XHRpbnQgbWlncmF0ZV90eXBlO1xuJiM0MztcdHN0cnVjdCBkZW50cnkgKnBhcmVudGRpcjtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIHN0cnVjdCBwYWdlX2FsbG9jIC0gUmVwcmVzZW50cyB0aGUgcGFnZSBhbGxvY2F0aW9uLlxuJiM0MzsgKiBAcGFnZTogVGhlIHBvaW50ZXIgdG8gdGhlIHBhZ2UocykgYWxsb2NhdGVkLlxuJiM0MzsgKiBAcmVxX2FsbG9jOiBUaGUgZGV0YWlscyBvZiB0aGUgYWxsb2NhdGlvbi5cbiYjNDM7ICogQGFsbG9jX2RlbnRyeTogVGhlIHBvaW50ZXIgdG8gdGhlIGZpbGUgdGhhdCByZXByZXNlbnRzIHRoZSBhbGxvY2F0aW9uLlxuJiM0MzsgKi9cbiYjNDM7c3RydWN0IHBhZ2VfYWxsb2Mge1xuJiM0MztcdHN0cnVjdCBwYWdlICpwYWdlO1xuJiM0MztcdHN0cnVjdCByZXFfYWxsb2MgKnJlcV9hbGxvYztcbiYjNDM7XHRzdHJ1Y3QgZGVudHJ5ICphbGxvY19kZW50cnk7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3Qga21lbV9jYWNoZSAqcmVxX2FsbG9jX2NhY2hlO1xuJiM0MztzdHJ1Y3Qga21lbV9jYWNoZSAqcGFnZV9hbGxvY19jYWNoZTtcbiYjNDM7XG4mIzQzO2lubGluZSB2b2lkIHNldF96b25lX3RvX2FsbG9jX2Zyb20oaW50IHpvbmVfaWR4LCBnZnBfdCAqZmxhZ3NfcHRyKVxuJiM0Mzt7XG4mIzQzO1x0c3dpdGNoICh6b25lX2lkeCkge1xuJiM0MzsjaWZkZWYgQ09ORklHX1pPTkVfRE1BXG4mIzQzO1x0Y2FzZSBaT05FX0RNQTpcbiYjNDM7XHRcdCpmbGFnc19wdHIgfD0gX19HRlBfRE1BO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzOyNlbmRpZlxuJiM0MzsjaWZkZWYgQ09ORklHX1pPTkVfRE1BMzJcbiYjNDM7XHRjYXNlIFpPTkVfRE1BMzI6XG4mIzQzO1x0XHQqZmxhZ3NfcHRyIHw9IF9fR0ZQX0RNQTMyO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzOyNlbmRpZlxuJiM0MzsjaWZkZWYgQ09ORklHX0hJR0hNRU1cbiYjNDM7XHRjYXNlIFpPTkVfSElHSE1FTTpcbiYjNDM7XHRcdCpmbGFnc19wdHIgfD0gX19HRlBfSElHSE1FTTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MzsjZW5kaWZcbiYjNDM7XHRjYXNlIFpPTkVfTU9WQUJMRTpcbiYjNDM7XHRcdCpmbGFnc19wdHIgfD0gX19HRlBfTU9WQUJMRTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGNhc2UgWk9ORV9OT1JNQUw6XG4mIzQzO1x0ZGVmYXVsdDpcbiYjNDM7XHRcdCpmbGFnc19wdHIgfD0gMDtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7aW5saW5lIHZvaWQgc2V0X21pZ3JhdGVfdHlwZV90b19hbGxvY19mcm9tKGludCBtaWdyYXRlX3R5cGUsIGdmcF90ICpmbGFnc19wdHIpXG4mIzQzO3tcbiYjNDM7XHRzd2l0Y2ggKG1pZ3JhdGVfdHlwZSkge1xuJiM0MztcdGNhc2UgTUlHUkFURV9VTk1PVkFCTEU6XG4mIzQzO1x0XHQqZmxhZ3NfcHRyIFx1MDAyNj0gfihfX0dGUF9SRUNMQUlNQUJMRSB8IF9fR0ZQX01PVkFCTEUpO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBNSUdSQVRFX1JFQ0xBSU1BQkxFOlxuJiM0MztcdFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9SRUNMQUlNQUJMRTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGNhc2UgTUlHUkFURV9ISUdIQVRPTUlDOlxuJiM0MztcdFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9ISUdIO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBNSUdSQVRFX01PVkFCTEU6IGRlZmF1bHQ6XG4mIzQzO1x0XHQqZmxhZ3NfcHRyIHw9IF9fR0ZQX01PVkFCTEU7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBzc2l6ZV90IHBhZ2VfYWxsb2NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVidWYsXG4mIzQzO1x0XHRcdFx0ICAgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcylcbiYjNDM7e1xuJiM0MztcdC8qICBXaGljaCBpbmZvcm1hdGlvbiBzaG91bGQgYmUgcHJpbnQgYWJvdXQgdGhlIHBhZ2Ugb3IgYWxsb2NhdGlvbj8gKi9cbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcGFnZV9hbGxvY19mb3BzID0ge1xuJiM0MztcdC5vd25lciA9IFRISVNfTU9EVUxFLFxuJiM0MztcdC5vcGVuID0gc2ltcGxlX29wZW4sXG4mIzQzO1x0LnJlYWQgPSBwYWdlX2FsbG9jX3JlYWQsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IG1ha2VfYWxsb2Moc3RydWN0IHJlcV9hbGxvYyAqcmVxLFxuJiM0MztcdFx0XHQgICAgZ2ZwX3QgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKmFsbG9jX2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHBhZ2VfYWxsb2MgKnBhO1xuJiM0MztcdHN0cnVjdCBwYWdlICpwYWdlO1xuJiM0MztcdGNoYXIgbmV3X2FsbG9jX25hbWVbMTJdO1xuJiM0MztcdHN0cnVjdCBkZW50cnkgKm5ld19hbGxvY19kZW50cnk7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0cGFnZSA9IGFsbG9jX3BhZ2VzX25vZGVfbm9wcm9mKHJlcS1cdTAwM2Vub2RlX2lkeCwgZmxhZ3MsIHJlcS1cdTAwM2VvcmRlcik7XG4mIzQzO1x0aWYgKHBhZ2UpIHtcbiYjNDM7XHRcdHBhID0ga21lbV9jYWNoZV9hbGxvYyhwYWdlX2FsbG9jX2NhY2hlLCBHRlBfS0VSTkVMKTtcbiYjNDM7XHRcdGlmICghcGEpIHtcbiYjNDM7XHRcdFx0cmV0ID0gLUVOT01FTTtcbiYjNDM7XHRcdFx0Z290byBmcmVlX3BhZ2VzO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdCphbGxvY19pZCA9IGF0b21pY19sb25nX2luY19yZXR1cm4oXHUwMDI2YWxsb2NzX2ZpbGVfc2VxKTtcbiYjNDM7XHRcdHJldCA9IHhhX2luc2VydChcdTAwMjZhbGxvY3NfeGEsICphbGxvY19pZCwgcGEsIEdGUF9LRVJORUwpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0Z290byBmcmVlX3BhZ2VfYWxsb2M7XG4mIzQzO1xuJiM0MztcdFx0c25wcmludGYobmV3X2FsbG9jX25hbWUsIHNpemVvZihuZXdfYWxsb2NfbmFtZSksIFwmIzM0OyVsdVwmIzM0OyxcbiYjNDM7XHRcdFx0ICphbGxvY19pZCk7XG4mIzQzO1xuJiM0MztcdFx0bmV3X2FsbG9jX2RlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoXG4mIzQzO1x0XHRcdG5ld19hbGxvY19uYW1lLCAwNjQ0LCByZXEtXHUwMDNlcGFyZW50ZGlyLFxuJiM0MztcdFx0XHRwYSwgXHUwMDI2cGFnZV9hbGxvY19mb3BzKTtcbiYjNDM7XHRcdGlmIChJU19FUlIobmV3X2FsbG9jX2RlbnRyeSkpIHtcbiYjNDM7XHRcdFx0cmV0ID0gUFRSX0VSUihuZXdfYWxsb2NfZGVudHJ5KTtcbiYjNDM7XHRcdFx0Z290byBlcmFzZV94YV9lbnRyeTtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRwYS1cdTAwM2VyZXFfYWxsb2MgPSByZXE7XG4mIzQzO1x0XHRwYS1cdTAwM2VwYWdlID0gcGFnZTtcbiYjNDM7XHRcdHBhLVx1MDAzZWFsbG9jX2RlbnRyeSA9IG5ld19hbGxvY19kZW50cnk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztlcmFzZV94YV9lbnRyeTpcbiYjNDM7XHR4YV9lcmFzZShcdTAwMjZhbGxvY3NfeGEsICphbGxvY19pZCk7XG4mIzQzO1xuJiM0MztmcmVlX3BhZ2VfYWxsb2M6XG4mIzQzO1x0a21lbV9jYWNoZV9mcmVlKHBhZ2VfYWxsb2NfY2FjaGUsIHBhKTtcbiYjNDM7XG4mIzQzO2ZyZWVfcGFnZXM6XG4mIzQzO1x0X19mcmVlX3BhZ2VzKHBhZ2UsIHBhLVx1MDAzZXJlcV9hbGxvYy1cdTAwM2VvcmRlcik7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZnJlZV9hbGxvY19oZWxwZXIodW5zaWduZWQgbG9uZyBhbGxvY19pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBwYWdlX2FsbG9jICpwYTtcbiYjNDM7XG4mIzQzO1x0cGEgPSB4YV9lcmFzZShcdTAwMjZhbGxvY3NfeGEsIGFsbG9jX2lkKTtcbiYjNDM7XHRpZiAoIXBhKSB7XG4mIzQzO1x0XHRwcl9lcnIoXCYjMzQ7VGhlIGFsbG9jX2lkICVsdSB3YXMgbm90IGZvdW5kIVwmIzM0OywgYWxsb2NfaWQpO1xuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRfX2ZyZWVfcGFnZXMocGEtXHUwMDNlcGFnZSwgcGEtXHUwMDNlcmVxX2FsbG9jLVx1MDAzZW9yZGVyKTtcbiYjNDM7XHRkZWJ1Z2ZzX3JlbW92ZShwYS1cdTAwM2VhbGxvY19kZW50cnkpO1xuJiM0MztcdGttZW1fY2FjaGVfZnJlZShwYWdlX2FsbG9jX2NhY2hlLCBwYSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcmVxX3BhZ2VfYWxsb2Nfd3JpdGUoKSAtIEFsbG9jYXRlcyB0aGUgcGFnZXMgb24gdGhlIHJlcXVlc3RlZCBub2RlLCB6b25lLFxuJiM0MzsgKiBvcmRlciBhbmQgbWlncmF0ZSB0eXBlLiBPbmNlIHRoZSBhbGxvY2F0aW9uIGlzIHBlcmZvcm1lZCwgYSBmaWxlIGlzIGNyZWF0ZWRcbiYjNDM7ICogdG8gZnJlZSB0aGUgYWxsb2NhdGlvbiBsYXRlci5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBzc2l6ZV90IHJlcV9wYWdlX2FsbG9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdWJ1ZixcbiYjNDM7XHRcdFx0XHQgICAgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCByZXFfYWxsb2MgKnJlcSA9IGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgYWxsb2NfaWQ7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBucl9wYWdlc19hbGxvY3M7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyAqYWxsb2NzX2lkcztcbiYjNDM7XHRnZnBfdCBmbGFncyA9IDA7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0ga3N0cnRvdWxfZnJvbV91c2VyKHVidWYsIGNudCwgMTAsIFx1MDAyNm5yX3BhZ2VzX2FsbG9jcyk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdGFsbG9jc19pZHMgPSBrbWFsbG9jX2FycmF5KG5yX3BhZ2VzX2FsbG9jcywgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLFxuJiM0MztcdFx0XHRcdFx0R0ZQX0tFUk5FTCk7XG4mIzQzO1x0aWYgKCFhbGxvY3NfaWRzKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdHNldF96b25lX3RvX2FsbG9jX2Zyb20ocmVxLVx1MDAzZXpvbmVfaWR4LCBcdTAwMjZmbGFncyk7XG4mIzQzO1x0c2V0X21pZ3JhdGVfdHlwZV90b19hbGxvY19mcm9tKHJlcS1cdTAwM2VtaWdyYXRlX3R5cGUsIFx1MDAyNmZsYWdzKTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfcGFnZXNfYWxsb2NzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0cmV0ID0gbWFrZV9hbGxvYyhyZXEsIGZsYWdzLCBcdTAwMjZhbGxvY19pZCk7XG4mIzQzO1x0XHRpZiAocmV0KVxuJiM0MztcdFx0XHRnb3RvIGZyZWVfYWxsb2NzO1xuJiM0MztcbiYjNDM7XHRcdGFsbG9jc19pZHNbaV0gPSBhbGxvY19pZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGtmcmVlKGFsbG9jc19pZHMpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gY250O1xuJiM0MztcbiYjNDM7ZnJlZV9hbGxvY3M6XG4mIzQzO1x0LyogRnJlZSBhbGwgdGhlIHBhZ2VzIHByZXZpb3VzbHkgYWxsb2NhdGVkLiAqL1xuJiM0MztcdGZvciAoaW50IGogPSAwOyBqIFx1MDAzYyBpOyBqJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aW50IHJldDIgPSBmcmVlX2FsbG9jX2hlbHBlcihhbGxvY3NfaWRzW2pdKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAocmV0MilcbiYjNDM7XHRcdFx0cHJfZXJyKFwmIzM0O1VuYWJsZSB0byBmcmVlIHBhZ2VzIGFzc29jaWF0ZWQgd2l0aCBmaWxlICVsdVwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgIGFsbG9jc19pZHNbal0pO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0a2ZyZWUoYWxsb2NzX2lkcyk7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlcV9wYWdlX2FsbG9jX2ZvcHMgPSB7XG4mIzQzO1x0Lm93bmVyID0gVEhJU19NT0RVTEUsXG4mIzQzO1x0Lm9wZW4gPSBzaW1wbGVfb3BlbixcbiYjNDM7XHQud3JpdGUgPSByZXFfcGFnZV9hbGxvY193cml0ZSxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBmcmVlX3BhZ2VfYWxsb2Nfd3JpdGUoKSAtIGZyZWUgdGhlIHByZXZpb3VzbHkgYWxsb2NhdGVkIHBhZ2VzLlxuJiM0MzsgKiBAZmlsZTogRmlsZSB3aGVyZSB0aGUgdXNlciBpcyB3cml0aW5nLlxuJiM0MzsgKiBAdWJ1ZjogQ29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhlIHVzZXIgd2FudHMgdG8gZGVsZXRlIGFuZCBoYXZlIHRoZVxuJiM0MzsgKiAgICAgICBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZmlsZSBmcmVlZC5cbiYjNDM7ICogQGNudDogU2l6ZSBvZiBAdWJ1Zi5cbiYjNDM7ICogQHBwb3M6IEN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGZpbGUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgc3NpemVfdCBmcmVlX3BhZ2VfYWxsb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsXG4mIzQzO1x0XHRcdFx0ICAgICAgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsIHNpemVfdCBjbnQsXG4mIzQzO1x0XHRcdFx0ICAgICAgbG9mZl90ICpwcG9zKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGFsbG9jX2lkO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBrc3RydG91bF9mcm9tX3VzZXIodWJ1ZiwgY250LCAxMCwgXHUwMDI2YWxsb2NfaWQpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBmcmVlX2FsbG9jX2hlbHBlcihhbGxvY19pZCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldHVybiBjbnQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZyZWVfcGFnZV9hbGxvY19mb3BzID0ge1xuJiM0MztcdC5vd25lciA9IFRISVNfTU9EVUxFLFxuJiM0MztcdC53cml0ZSA9IGZyZWVfcGFnZV9hbGxvY193cml0ZSxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBjcmVhdGVfbnJfcGFnZXNfYWxsb2NzX2ZpbGUoKSAtIENyZWF0ZXMgdGhlIGZpbGUgXCYjMzQ7bnJfcGFnZXNfYWxsb2NzXCYjMzQ7LlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgXCYjMzQ7bnJfcGFnZXNfYWxsb2NzXCYjMzQ7IGZpbGUgd2lsbCBiZSB1c2VkIHRvIHdyaXRlIHRoZSBudW1iZXIgb2YgYWxsb2NhdGlvbnNcbiYjNDM7ICogdGhhdCB3aWxsIGJlIHBlcmZvcm1lZC4gV2hlbiB0aGUgYWxsb2NhdGlvbnMgYXJlIHBlcmZvcm1lZCwgYSBuZXcgZmlsZSBmb3JcbiYjNDM7ICogZWFjaCBhbGxvY2F0aW9uIHdpbGwgYmUgY3JlYXRlZCBpbiBAbWlncmF0ZWRpci5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IGNyZWF0ZV9ucl9wYWdlc19hbGxvY3NfZmlsZShzdHJ1Y3QgZGVudHJ5ICptaWdyYXRlZGlyLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgaW50IG5vZGVfaWR4LCBpbnQgem9uZV9pZHgsXG4mIzQzO1x0XHRcdFx0XHQgICAgICBpbnQgb3JkZXIsIGludCBtdHlwZSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCByZXFfYWxsb2MgKnJlcTtcbiYjNDM7XHRzdHJ1Y3QgZGVudHJ5ICpucl9wYWdlcztcbiYjNDM7XG4mIzQzO1x0cmVxID0ga21lbV9jYWNoZV9hbGxvYyhyZXFfYWxsb2NfY2FjaGUsIEdGUF9LRVJORUwpO1xuJiM0MztcdGlmICghcmVxKSB7XG4mIzQzO1x0XHRwcl9lcnIoXCYjMzQ7RmFpbGVkIHRvIGNyZWF0ZSBucl9wYWdlc19hbGxvY3NfaW5mb1wmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJlcS1cdTAwM2Vub2RlX2lkeCA9IG5vZGVfaWR4O1xuJiM0MztcdHJlcS1cdTAwM2V6b25lX2lkeCA9IHpvbmVfaWR4O1xuJiM0MztcdHJlcS1cdTAwM2VvcmRlciA9IG9yZGVyO1xuJiM0MztcdHJlcS1cdTAwM2VtaWdyYXRlX3R5cGUgPSBtdHlwZTtcbiYjNDM7XHRyZXEtXHUwMDNlcGFyZW50ZGlyID0gbWlncmF0ZWRpcjtcbiYjNDM7XG4mIzQzO1x0bnJfcGFnZXMgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKFwmIzM0O25yX3BhZ2VzX2FsbG9jc1wmIzM0OywgMDY0NCwgbWlncmF0ZWRpciwgcmVxLFxuJiM0MztcdFx0XHRcdCAgICAgICBcdTAwMjZyZXFfcGFnZV9hbGxvY19mb3BzKTtcbiYjNDM7XHRpZiAoSVNfRVJSKG5yX3BhZ2VzKSlcbiYjNDM7XHRcdHJldHVybiBQVFJfRVJSKG5yX3BhZ2VzKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBjcmVhdGVfbWlncmF0ZV90eXBlX3N1YmRpcnMoKSAtIENyZWF0ZXMgYSBkaXJlY3RvcnkgZm9yIGVhY2ggbWlncmF0ZSB0eXBlXG4mIzQzOyAqIGluc2lkZSB0aGUgb3JkZXIgZGlyZWN0b3J5LiBPbmNlIHRoZSBtaWdyYXRlIHR5cGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQsIGl0XG4mIzQzOyAqIGNyZWF0ZXMgdGhlIFwmIzM0O25yX2FsbG9jc1wmIzM0OyBmaWxlIGFuZCB0aGUgXCYjMzQ7ZnJlZVwmIzM0OyBmaWxlLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBpbnQgY3JlYXRlX21pZ3JhdGVfdHlwZV9zdWJkaXJzKHN0cnVjdCBkZW50cnkgKm9yZGVyZGlyLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgaW50IG5vZGVfaWR4LCBpbnQgem9uZV9pZHgsXG4mIzQzO1x0XHRcdFx0XHQgICAgICBpbnQgb3JkZXIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZGVudHJ5ICptaWdyYXRlZGlyO1xuJiM0MztcdGNoYXIgZGlybmFtZVsyNF07XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpbnQgbXR5cGUgPSAwOyBtdHlwZSBcdTAwM2MgTUlHUkFURV9UWVBFUzsgbXR5cGUmIzQzOyYjNDM7KSB7XG4mIzQzOyNpZmRlZiBDT05GSUdfQ01BXG4mIzQzO1x0XHRpZiAobXR5cGUgPT0gTUlHUkFURV9DTUEpIC8qIENNQSBhbGxvY3MgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0Ki9cbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzOyNlbmRpZlxuJiM0MzsjaWZkZWYgQ09ORklHX01FTU9SWV9JU09MQVRJT05cbiYjNDM7XHRcdGlmIChtdHlwZSA9PSBNSUdSQVRFX0lTT0xBVEUpIC8qIGNhbiYjMzk7dCBhbGxvY2F0ZSBmcm9tIGhlcmUgKi9cbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzOyNlbmRpZlxuJiM0MztcdFx0c25wcmludGYoZGlybmFtZSwgc2l6ZW9mKGRpcm5hbWUpLCBcJiMzNDttaWdyYXRlLSVzXCYjMzQ7LFxuJiM0MztcdFx0XHQgbWlncmF0ZXR5cGVfbmFtZXNbbXR5cGVdKTtcbiYjNDM7XHRcdG1pZ3JhdGVkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoZGlybmFtZSwgb3JkZXJkaXIpO1xuJiM0MztcdFx0aWYgKElTX0VSUihtaWdyYXRlZGlyKSlcbiYjNDM7XHRcdFx0cmV0dXJuIFBUUl9FUlIobWlncmF0ZWRpcik7XG4mIzQzO1xuJiM0MztcdFx0cmV0ID0gY3JlYXRlX25yX3BhZ2VzX2FsbG9jc19maWxlKG1pZ3JhdGVkaXIsIG5vZGVfaWR4LFxuJiM0MztcdFx0XHRcdFx0XHQgIHpvbmVfaWR4LCBvcmRlciwgbXR5cGUpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogY3JlYXRlX3BhZ2Vfb3JkZXJzX3N1YmRpcnMoKSAtIENyZWF0ZXMgYSBkaXJlY3RvcnkgZm9yIGVhY2ggcGFnZSBvcmRlciBpbnNpZGVcbiYjNDM7ICogdGhlIHpvbmUgZGlyZWN0b3J5LiBPbmNlIHRoYXQgdGhlIHBhZ2Ugb3JkZXIgZGlyZWN0b3J5IGlzIGNyZWF0ZWQsIGl0IGNyZWF0ZXNcbiYjNDM7ICogYSBkaXJlY3RvcnkgZm9yIGVhY2ggbWlncmF0ZSB0eXBlLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBpbnQgY3JlYXRlX3BhZ2Vfb3JkZXJzX3N1YmRpcnMoc3RydWN0IGRlbnRyeSAqem9uZWRpcixcbiYjNDM7XHRcdFx0XHRcdCAgICAgaW50IG5vZGVfaWR4LCBpbnQgem9uZV9pZHgsXG4mIzQzO1x0XHRcdFx0XHQgICAgIHN0cnVjdCB6b25lICp6b25lKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGRlbnRyeSAqb3JkZXJkaXI7XG4mIzQzO1x0Y2hhciBkaXJuYW1lWzEyXTtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRmb3IgKGludCBvcmRlciA9IDA7IG9yZGVyIFx1MDAzYyBOUl9QQUdFX09SREVSUzsgb3JkZXImIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRzbnByaW50ZihkaXJuYW1lLCBzaXplb2YoZGlybmFtZSksIFwmIzM0O29yZGVyLSVkXCYjMzQ7LCBvcmRlcik7XG4mIzQzO1x0XHRvcmRlcmRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihkaXJuYW1lLCB6b25lZGlyKTtcbiYjNDM7XHRcdGlmIChJU19FUlIob3JkZXJkaXIpKVxuJiM0MztcdFx0XHRyZXR1cm4gUFRSX0VSUihvcmRlcmRpcik7XG4mIzQzO1xuJiM0MztcdFx0cmV0ID0gY3JlYXRlX21pZ3JhdGVfdHlwZV9zdWJkaXJzKG9yZGVyZGlyLCBub2RlX2lkeCwgem9uZV9pZHgsXG4mIzQzO1x0XHRcdFx0XHRcdCAgb3JkZXIpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogY3JlYXRlX3pvbmVzX3N1YmRpcnMoKSAtIENyZWF0ZXMgYSBkaXJlY3RvcnkgZm9yIGVhY2ggcG9wdWxhdGVkIHpvbmUgaW4gdGhlXG4mIzQzOyAqIG5vZGUuIE9uY2UgdGhhdCB0aGUgem9uZSBkaXJlY3RvcnkgaXMgY3JlYXRlZCwgaXQgY3JlYXRlcyBhIGRpcmVjdG9yeSBmb3JcbiYjNDM7ICogZWFjaCBvcmRlciBzdXBwb3J0ZWQuXG4mIzQzOyAqXG4mIzQzOyAqIE5vdGU6IFpPTkVfREVWSUNFIHBhZ2VzIHdvbiYjMzk7dCBiZSBhbGxvY2F0ZWQgdXNpbmcgdGhpcyBkcml2ZXIuIFRoZSBtYWluIHJlYXNvblxuJiM0MzsgKiBpcyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBtYW5hZ2VkIGJ5IHRoZSBCdWRkeSBBbGxvY2F0b3Igb3IgQ01BIGFsbG9jYXRvci5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IGNyZWF0ZV96b25lc19zdWJkaXJzKHN0cnVjdCBkZW50cnkgKm5vZGVkaXIsIGludCBub2RlX2lkeCxcbiYjNDM7XHRcdFx0XHQgICAgICAgc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdGEpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZGVudHJ5ICp6b25lZGlyO1xuJiM0MztcdHN0cnVjdCB6b25lICp6b25lO1xuJiM0MztcdHN0cnVjdCB6b25lICpub2RlX3pvbmVzID0gcGdkYXRhLVx1MDAzZW5vZGVfem9uZXM7XG4mIzQzO1x0aW50IHpvbmVfaWR4O1xuJiM0MztcdGNoYXIgZGlybmFtZVsyNF07XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0Zm9yICh6b25lID0gbm9kZV96b25lcywgem9uZV9pZHggPSAwOyB6b25lIC0gbm9kZV96b25lcyBcdTAwM2MgTUFYX05SX1pPTkVTO1xuJiM0MztcdCAgICAgJiM0MzsmIzQzO3pvbmUsICYjNDM7JiM0Mzt6b25lX2lkeCkge1xuJiM0MztcdFx0aWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1xuJiM0MztcdFx0LyogWk9ORV9ERVZJQ0UgcGFnZXMgd29uJiMzOTt0IGJlIGFsbG9jYXRlZCB1c2luZyB0aGlzIGRyaXZlci4gKi9cbiYjNDM7XHRcdGlmICh6b25lX2lzX3pvbmVfZGV2aWNlKHpvbmUpKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XG4mIzQzO1x0XHRzbnByaW50ZihkaXJuYW1lLCBzaXplb2YoZGlybmFtZSksIFwmIzM0O3pvbmUtJXNcJiMzNDssIHpvbmUtXHUwMDNlbmFtZSk7XG4mIzQzO1x0XHR6b25lZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKGRpcm5hbWUsIG5vZGVkaXIpO1xuJiM0MztcdFx0aWYgKElTX0VSUih6b25lZGlyKSlcbiYjNDM7XHRcdFx0cmV0dXJuIFBUUl9FUlIoem9uZWRpcik7XG4mIzQzO1xuJiM0MztcdFx0cmV0ID0gY3JlYXRlX3BhZ2Vfb3JkZXJzX3N1YmRpcnMoem9uZWRpciwgbm9kZV9pZHgsIHpvbmVfaWR4LFxuJiM0MztcdFx0XHRcdFx0XHQgem9uZSk7XG4mIzQzO1x0XHRpZiAocmV0KVxuJiM0MztcdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBjcmVhdGVfbm9kZXNfc3ViZGlycygpIC0gQ3JlYXRlcyBhIGRpcmVjdG9yeSBmb3IgZWFjaCBvbmxpbmUgbm9kZSBpbiB0aGVcbiYjNDM7ICogc3lzdGVtLiBPbmNlIHRoYXQgdGhlIG5vZGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQsIGl0IGNyZWF0ZXMgYSBkaXJlY3RvcnkgZm9yXG4mIzQzOyAqIGVhY2ggem9uZSBpbiB0aGUgbm9kZS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IGNyZWF0ZV9ub2Rlc19zdWJkaXJzKHN0cnVjdCBkZW50cnkgKm1tZGlyKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGRlbnRyeSAqbm9kZWRpcjtcbiYjNDM7XHRpbnQgbm9kZV9pZHg7XG4mIzQzO1x0Y2hhciBkaXJuYW1lWzEyXTtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlX2lkeCkge1xuJiM0MztcdFx0c3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdGEgPSBOT0RFX0RBVEEobm9kZV9pZHgpO1xuJiM0MztcbiYjNDM7XHRcdHNucHJpbnRmKGRpcm5hbWUsIHNpemVvZihkaXJuYW1lKSwgXCYjMzQ7bm9kZS0lZFwmIzM0Oywgbm9kZV9pZHgpO1xuJiM0MztcdFx0bm9kZWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihkaXJuYW1lLCBtbWRpcik7XG4mIzQzO1x0XHRpZiAoSVNfRVJSKG5vZGVkaXIpKVxuJiM0MztcdFx0XHRyZXR1cm4gUFRSX0VSUihub2RlZGlyKTtcbiYjNDM7XG4mIzQzO1x0XHRyZXQgPSBjcmVhdGVfem9uZXNfc3ViZGlycyhub2RlZGlyLCBub2RlX2lkeCwgcGdkYXRhKTtcbiYjNDM7XHRcdGlmIChyZXQpXG4mIzQzO1x0XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBfX2luaXQgcGFnZV9hbGxvY19ob2dnZXJfZGVidWdmc19pbml0KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZGVudHJ5ICpmcmVlX2ZpbGU7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0cmVxX2FsbG9jX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoXG4mIzQzO1x0XHRcJiMzNDtyZXFfYWxsb2NfY2FjaGVcJiMzNDssIHNpemVvZihzdHJ1Y3QgcmVxX2FsbG9jKSwgMCxcbiYjNDM7XHRcdFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7XG4mIzQzO1x0aWYgKCFyZXFfYWxsb2NfY2FjaGUpIHtcbiYjNDM7XHRcdHByX2VycihcJiMzNDtUaGUgcmVxX2FsbG9jX2NhY2hlIGNvdWxkbiYjMzk7dCBiZSBjcmVhdGVkXCYjMzQ7KTtcbiYjNDM7XHRcdHJldCA9IC1FTk9NRU07XG4mIzQzO1x0XHRnb3RvIGVycm9yX2V4aXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRwYWdlX2FsbG9jX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoXG4mIzQzO1x0XHRcJiMzNDtwYWdlX2FsbG9jX2NhY2hlXCYjMzQ7LCBzaXplb2Yoc3RydWN0IHBhZ2VfYWxsb2MpLCAwLFxuJiM0MztcdFx0U0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTtcbiYjNDM7XHRpZiAoIXBhZ2VfYWxsb2NfY2FjaGUpIHtcbiYjNDM7XHRcdHByX2VycihcJiMzNDtUaGUgcGFnZV9hbGxvY19jYWNoZSBjb3VsZG4mIzM5O3QgYmUgY3JlYXRlZFwmIzM0Oyk7XG4mIzQzO1x0XHRyZXQgPSAtRU5PTUVNO1xuJiM0MztcdFx0Z290byBjbGVhbl9yZXFfYWxsb2NfY2FjaGU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRtbWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihcJiMzNDttbVwmIzM0OywgTlVMTCk7XG4mIzQzO1x0aWYgKElTX0VSUihtbWRpcikpIHtcbiYjNDM7XHRcdHByX2VycihcJiMzNDtVbmFibGUgdG8gY3JlYXRlIG1tIGRpcmVjdG9yeVwmIzM0Oyk7XG4mIzQzO1x0XHRyZXQgPSBQVFJfRVJSKG1tZGlyKTtcbiYjNDM7XHRcdGdvdG8gY2xlYW5fcGFnZV9hbGxvY19jYWNoZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IGNyZWF0ZV9ub2Rlc19zdWJkaXJzKG1tZGlyKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0Z290byBjbGVhbl9kaXI7XG4mIzQzO1xuJiM0MztcdGZyZWVfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoXCYjMzQ7ZnJlZVwmIzM0OywgMDY0NCwgbW1kaXIsIE5VTEwsXG4mIzQzO1x0XHRcdFx0XHRcdTAwMjZmcmVlX3BhZ2VfYWxsb2NfZm9wcyk7XG4mIzQzO1x0aWYgKElTX0VSUihmcmVlX2ZpbGUpKSB7XG4mIzQzO1x0XHRyZXQgPSBQVFJfRVJSKGZyZWVfZmlsZSk7XG4mIzQzO1x0XHRnb3RvIGNsZWFuX2RpcjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7Y2xlYW5fZGlyOlxuJiM0MztcdGRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShtbWRpcik7XG4mIzQzO1xuJiM0MztjbGVhbl9wYWdlX2FsbG9jX2NhY2hlOlxuJiM0MztcdGttZW1fY2FjaGVfZGVzdHJveShwYWdlX2FsbG9jX2NhY2hlKTtcbiYjNDM7XG4mIzQzO2NsZWFuX3JlcV9hbGxvY19jYWNoZTpcbiYjNDM7XHRrbWVtX2NhY2hlX2Rlc3Ryb3kocmVxX2FsbG9jX2NhY2hlKTtcbiYjNDM7XG4mIzQzO2Vycm9yX2V4aXQ6XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgX19leGl0IHBhZ2VfYWxsb2NfaG9nZ2VyX2RlYnVnZnNfZXhpdCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHBhZ2VfYWxsb2MgKnBhO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgaWR4O1xuJiM0MztcbiYjNDM7XHR4YV9mb3JfZWFjaChcdTAwMjZhbGxvY3NfeGEsIGlkeCwgcGEpIHtcbiYjNDM7XHRcdF9fZnJlZV9wYWdlcyhwYS1cdTAwM2VwYWdlLCBwYS1cdTAwM2VyZXFfYWxsb2MtXHUwMDNlb3JkZXIpO1xuJiM0MztcdFx0eGFfZXJhc2UoXHUwMDI2YWxsb2NzX3hhLCBpZHgpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKG1tZGlyKTtcbiYjNDM7XHRrbWVtX2NhY2hlX2Rlc3Ryb3kocmVxX2FsbG9jX2NhY2hlKTtcbiYjNDM7XHRrbWVtX2NhY2hlX2Rlc3Ryb3kocGFnZV9hbGxvY19jYWNoZSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO21vZHVsZV9pbml0KHBhZ2VfYWxsb2NfaG9nZ2VyX2RlYnVnZnNfaW5pdCk7XG4mIzQzO21vZHVsZV9leGl0KHBhZ2VfYWxsb2NfaG9nZ2VyX2RlYnVnZnNfZXhpdCk7XG4mIzQzO1xuJiM0MztNT0RVTEVfQVVUSE9SKFwmIzM0O0p1YW4gWWVzY2FzXCYjMzQ7KTtcbiYjNDM7TU9EVUxFX0RFU0NSSVBUSU9OKFwmIzM0O01vZHVsZSB0byBhbGxvYyBwYWdlcyB0byBnZW5lcmF0ZSBtZW1vcnkgcHJlc3N1cmVcJiMzNDspO1xuJiM0MztNT0RVTEVfTElDRU5TRShcJiMzNDtHUExcJiMzNDspO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI0IDEyOjE2PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtQQUdFQUxMT0NfSE9HR0VSJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7cmVxX3BhZ2VfYWxsb2Nfd3JpdGUmIzM0OywKICAgICYjMzQ7ZnJlZV9wYWdlX2FsbG9jX3dyaXRlJiMzNDssCiAgICAmIzM0O21ha2VfYWxsb2MmIzM0OywKICAgICYjMzQ7ZnJlZV9hbGxvY19oZWxwZXImIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBkZWJ1Z2ZzIGludGVyZmFjZSBmb3IgYWxsb2NhdGluZyBwYWdlcyBmcm9tIHNwZWNpZmljIG5vZGVzLCB6b25lcywgbWlncmF0ZSB0eXBlcywgYW5kIG9yZGVycy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgdGVzdGluZy9kZWJ1Z2dpbmcgdG9vbCB0aGF0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIG1lbW9yeSBwcmVzc3VyZSBhbmQgdGVzdCB0aGUgY29yZSBwYWdlIGFsbG9jYXRvciBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLiBGdXp6aW5nIGl0IGlzIHZhbHVhYmxlIHRvIHVuY292ZXIgcG90ZW50aWFsIGJ1Z3MgaW4gbWVtb3J5IG1hbmFnZW1lbnQgb3IgT09NIGhhbmRsaW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdAogICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksCiAgIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA4YWI5MGI1NmY3MWJiMWQxMDcyNzc1N2I4ZjY5YzQ5MWVjODU3NmEwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBKdWwgMjQgMTI6MTY6MTkgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9LY29uZmlnLmRlYnVnIGIvbW0vS2NvbmZpZy5kZWJ1ZwppbmRleCA3NjM4ZDc1YjI3ZGI4Yy4uYzhmY2VjZGNhNmFjYTkgMTAwNjQ0Ci0tLSBhL21tL0tjb25maWcuZGVidWcKJiM0MzsmIzQzOyYjNDM7IGIvbW0vS2NvbmZpZy5kZWJ1ZwpAQCAtMzA5LDMgJiM0MzszMDksMTUgQEAgY29uZmlnIFBFUl9WTUFfTE9DS19TVEFUUwogCSAgb3ZlcmhlYWQgaW4gdGhlIHBhZ2UgZmF1bHQgcGF0aC4KIAogCSAgSWYgaW4gZG91YnQsIHNheSBOLgomIzQzOwomIzQzO2NvbmZpZyBQQUdFQUxMT0NfSE9HR0VSCiYjNDM7CWJvb2wgJiMzNDtBbGxvYyBwYWdlcyBmcm9tIGRpZmZlcmVudCBub2Rlcywgem9uZXMsIG1pZ3JhdGUgdHlwZXMgYW5kIG9yZGVycyYjMzQ7CiYjNDM7CWRlcGVuZHMgb24gREVCVUdfRlMKJiM0MzsJaGVscAomIzQzOwkgIFNheSBZIHRvIGFsbG9jIHBhZ2VzIGZyb20gZGlmZmVyZW50IG5vZGVzLCB6b25lcywgbWlncmF0ZSB0eXBlIGFuZAomIzQzOwkgIG9yZGVycyB1c2luZyB0aGUgZGVidWcgZnMgZmlsZXN5c3RlbS4gVGhpcyBoZWxwcyB0byBnZW5lcmF0ZSBtZW1vcnkKJiM0MzsJICBwcmVzc3VyZSBlYXNpbHkuIFRoaXMgaXMgdXNlZnVsIHRvIGRlYnVnIG1lbW9yeSByZWNsYWltcyBpc3N1ZXMsCiYjNDM7CSAgT09NIHRyaWdnZXJzLCBwYWdlIG1pZ3JhdGlvbiBpc3N1ZXMsIGV0Yy4KJiM0MzsKJiM0MzsJICBJZiBpbiBkb3VidCwgc2F5IE4uCiYjNDM7CmRpZmYgLS1naXQgYS9tbS9NYWtlZmlsZSBiL21tL01ha2VmaWxlCmluZGV4IDJkMDU3MGExNmU1YmViLi5iNDhmMmFjNmVlODA4OSAxMDA2NDQKLS0tIGEvbW0vTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvbW0vTWFrZWZpbGUKQEAgLTEzMyw2ICYjNDM7MTMzLDcgQEAgb2JqLSQoQ09ORklHX0lETEVfUEFHRV9UUkFDS0lORykgJiM0Mzs9IHBhZ2VfaWRsZS5vCiBvYmotJChDT05GSUdfREVCVUdfUEFHRUFMTE9DKSAmIzQzOz0gZGVidWdfcGFnZV9hbGxvYy5vCiBvYmotJChDT05GSUdfREVCVUdfUEFHRV9SRUYpICYjNDM7PSBkZWJ1Z19wYWdlX3JlZi5vCiBvYmotJChDT05GSUdfREFNT04pICYjNDM7PSBkYW1vbi8KJiM0MztvYmotJChDT05GSUdfUEFHRUFMTE9DX0hPR0dFUikgJiM0Mzs9IHBhZ2VfYWxsb2NfaG9nZ2VyLm8KIG9iai0kKENPTkZJR19IQVJERU5FRF9VU0VSQ09QWSkgJiM0Mzs9IHVzZXJjb3B5Lm8KIG9iai0kKENPTkZJR19QRVJDUFVfU1RBVFMpICYjNDM7PSBwZXJjcHUtc3RhdHMubwogb2JqLSQoQ09ORklHX1pPTkVfREVWSUNFKSAmIzQzOz0gbWVtcmVtYXAubwpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvY19ob2dnZXIuYyBiL21tL3BhZ2VfYWxsb2NfaG9nZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLmY1NTRiYmI0YWZhNzMwCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvbW0vcGFnZV9hbGxvY19ob2dnZXIuYwpAQCAtMCwwICYjNDM7MSw2MTEgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qCiYjNDM7ICogUGFnZSBhbGxvY2F0b3IgRGVidWdGUyBJbnRlcmZhY2UKJiM0MzsgKiBBdXRob3I6IEp1YW4gWWVzY2FzICZsdDtqeWVzY2FzQGdvb2dsZS5jb20mZ3Q7CiYjNDM7ICoKJiM0MzsgKiBUaGlzIG1vZHVsZSBhbGxvd3MgdG8gbWFrZSBwYWdlIGFsbG9jcyBwZXIgbm9kZSwgem9uZSwgbWlncmF0ZSB0eXBlCiYjNDM7ICogYW5kIG9yZGVyIHVzaW5nIHRoZSBEZWJ1Z0ZTIGZpbGVzeXN0ZW0uCiYjNDM7ICoKJiM0MzsgKiBXaGVuIHRoaXMgbW9kdWxlIGlzIGluc3RhbGxlZCBhbmQgdGhlIGRlYnVnZnMgaXMgbW91bnRlZCwgdGhlICYjMzQ7bW0mIzM0OyBkaXJlY3RvcnkKJiM0MzsgJiMzNDsgd2lsbCBiZSBjcmVhdGVkIGluICZsdDtkZWJ1Z2ZzIG1vdW50IHBvaW50Jmd0Oy9tbSYjMzQ7IGRpcmVjdG9yeS4gVW5kZXIgdGhpcyBkaXJlY3RvcnksCiYjNDM7ICogdGhlcmUgd2lsbCBiZSBzdWJkaXJzIHRvIHNlbGVjdCB0aGUgbm9kZXMsIHpvbmVzLCBvcmRlcnMgYW5kIG1pZ3JhdGUgdHlwZS4KJiM0MzsgKgomIzQzOyAqIEZvciBleGFtcGxlOgomIzQzOyAqCiYjNDM7ICogICAgICAvc3lzL2tlcm5lbC9kZWJ1Zy9tbS8KJiM0MzsgKiAgICAgIHwtLSBmcmVlCiYjNDM7ICogICAgICBgLS0gbm9kZS0wCiYjNDM7ICogICAgICAgICB8LS0gem9uZS1ETUEKJiM0MzsgKiAgICAgICAgIHwgICB8LS0gb3JkZXItMAomIzQzOyAqICAgICAgICAgfCAgIHwgICB8LS0gbWlncmF0ZS1IaWdoQXRvbWljCiYjNDM7ICogICAgICAgICB8ICAgfCAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzCiYjNDM7ICogICAgICAgICB8ICAgfCAgIHwtLSBtaWdyYXRlLU1vdmFibGUKJiM0MzsgKiAgICAgICAgIHwgICB8ICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3MKJiM0MzsgKiAgICAgICAgIHwgICB8ICAgfC0tIG1pZ3JhdGUtUmVjbGFpbWFibGUKJiM0MzsgKiAgICAgICAgIHwgICB8ICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3MKJiM0MzsgKiAgICAgICAgIHwgICB8ICAgYC0tIG1pZ3JhdGUtVW5tb3ZhYmxlCiYjNDM7ICogICAgICAgICB8ICAgfCAgICAgICBgLS0gbnJfcGFnZXNfYWxsb2NzCiYjNDM7ICogICAgICAgICB8ICAgfC0tIC4uLgomIzQzOyAqICAgICAgICAgfCAgIHwKJiM0MzsgKiAgICAgICAgIHwgICBgLS0gb3JkZXItOQomIzQzOyAqICAgICAgICAgfCAgICAgICB8LS0gbWlncmF0ZS1IaWdoQXRvbWljCiYjNDM7ICogICAgICAgICB8ICAgICAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzCiYjNDM7ICogICAgICAgICB8ICAgICAgIHwtLSBtaWdyYXRlLU1vdmFibGUKJiM0MzsgKiAgICAgICAgIHwgICAgICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3MKJiM0MzsgKiAgICAgICAgIHwgICAgICAgfC0tIG1pZ3JhdGUtUmVjbGFpbWFibGUKJiM0MzsgKiAgICAgICAgIHwgICAgICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3MKJiM0MzsgKiAgICAgICAgIHwgICAgICAgYC0tIG1pZ3JhdGUtVW5tb3ZhYmxlCiYjNDM7ICogICAgICAgICB8ICAgICAgICAgICBgLS0gbnJfcGFnZXNfYWxsb2NzCiYjNDM7ICogICAgICAgICBgLS0gem9uZS1Ob3JtYWwKJiM0MzsgKiAgICAgICAgICAgICB8LS0gb3JkZXItMAomIzQzOyAqICAgICAgICAgICAgIHwgICB8LS0gbWlncmF0ZS1IaWdoQXRvbWljCiYjNDM7ICogICAgICAgICAgICAgfCAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzCiYjNDM7ICogICAgICAgICAgICAgfCAgIHwtLSBtaWdyYXRlLU1vdmFibGUKJiM0MzsgKiAgICAgICAgICAgICB8ICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3MKJiM0MzsgKiAgICAgICAgICAgICB8ICAgfC0tIG1pZ3JhdGUtUmVjbGFpbWFibGUKJiM0MzsgKiAgICAgICAgICAgICB8ICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3MKJiM0MzsgKiAgICAgICAgICAgICB8ICAgYC0tIG1pZ3JhdGUtVW5tb3ZhYmxlCiYjNDM7ICogICAgICAgICAgICAgfCAgICAgICBgLS0gbnJfcGFnZXNfYWxsb2NzCiYjNDM7ICogICAgICAgICAgICAgfC0tIC4uLi4KJiM0MzsgKiAgICAgICAgICAgICB8CiYjNDM7ICogICAgICAgICAgICAgYC0tIG9yZGVyLTkKJiM0MzsgKiAgICAgICAgICAgICAgICAgfC0tIG1pZ3JhdGUtSGlnaEF0b21pYwomIzQzOyAqICAgICAgICAgICAgICAgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jcwomIzQzOyAqICAgICAgICAgICAgICAgICB8LS0gbWlncmF0ZS1Nb3ZhYmxlCiYjNDM7ICogICAgICAgICAgICAgICAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzCiYjNDM7ICogICAgICAgICAgICAgICAgIHwtLSBtaWdyYXRlLVJlY2xhaW1hYmxlCiYjNDM7ICogICAgICAgICAgICAgICAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzCiYjNDM7ICogICAgICAgICAgICAgICAgIGAtLSBtaWdyYXRlLVVubW92YWJsZQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgYC0tIG5yX3BhZ2VzX2FsbG9jcwomIzQzOyAqCiYjNDM7ICogVXNhZ2U6CiYjNDM7ICoKJiM0MzsgKiAxLiBUbyB0cmlnZ2VyIHRoZSBhbGxvY2F0aW9uLCBuYXZpZ2F0ZSB0byB0aGUgZGVidWdmcyBwYXRoIGNvcnJlc3BvbmRpbmcKJiM0MzsgKiAgICB0byB5b3VyIHRhcmdldCBub2RlLCBtZW1vcnkgem9uZSwgYWxsb2NhdGlvbiBvcmRlciwgYW5kIG1pZ3JhdGlvbiB0eXBlLAomIzQzOyAqICAgIHRoZW4gd3JpdGUgdGhlIHJlcXVlc3RlZCBhbGxvY2F0aW9uIGNvdW50IHRvIG5yX3BhZ2VzX2FsbG9jcy4KJiM0MzsgKgomIzQzOyAqICAgIEZvciBleGFtcGxlLCB0byBtYWtlIDMgYWxsb2NzIG9mIG9yZGVyIDksIE1pZ3JhdGUgVHlwZSBNb3ZhYmxlLAomIzQzOyAqICAgIFpvbmUgTm9ybWFsIGFuZCBOb2RlIDAsIHJ1bjoKJiM0MzsgKgomIzQzOyAqICAgICQgZWNobyAzICZndDsgL3N5cy9rZXJuZWwvZGVidWcvbW0vbm9kZS0wL3pvbmUtTm9ybWFsL29yZGVyLTkvbWlncmF0ZS1Nb3ZhYmxlL25yX3BhZ2VzX2FsbG9jcwomIzQzOyAqCiYjNDM7ICogMi4gRm9yIGVhY2ggYWxsb2NhdGlvbiBjcmVhdGVkLCBhIGNvcnJlc3BvbmRpbmcgZmlsZSBuYW1lZCBzZXF1ZW50aWFsbHkKJiM0MzsgKiAgICAoMSwgMiwgbikgd2lsbCBhcHBlYXIgaW4gdGhhdCBkaXJlY3RvcnkuCiYjNDM7ICoKJiM0MzsgKiAgICAkIGxzIC9zeXMva2VybmVsL2RlYnVnL21tL25vZGUtMC96b25lLU5vcm1hbC9vcmRlci05L21pZ3JhdGUtTW92YWJsZS8KJiM0MzsgKiAgICAxICAgMiAgIDMgIG5yX3BhZ2VzX2FsbG9jcwomIzQzOyAqCiYjNDM7ICogMy4gVG8gZnJlZSB0aGUgYWxsb2NhdGlvbiwgd3JpdGUgdGhlIGFsbG9jYXRpb24gZmlsZSBuYW1lIGluIC9zeXMva2VybmVsL2RlYnVnL21tL2ZyZWUuCiYjNDM7ICogICAgRm9yIGV4YW1wbGUsIHRvIHJlbGVhc2UgdGhlIDJuZCBhbGxvY2F0aW9uIHJ1bjoKJiM0MzsgKgomIzQzOyAqICAgICQgZWNobyAyICZndDsgL3N5cy9rZXJuZWwvZGVidWcvbW0vZnJlZQomIzQzOyAqLwomIzQzOwomIzQzOyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgJiMzNDs6ICYjMzQ7IGZtdAomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9hdG9taWMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvZXJybm8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvZGVidWdmcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9nZnAuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvZ2ZwX3R5cGVzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2hpZ2htZW0uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgva2VybmVsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21tem9uZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9tb2R1bGUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbm9kZW1hc2suaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcHJpbnRrLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgveGFycmF5LmgmZ3Q7CiYjNDM7CiYjNDM7c3RydWN0IGRlbnRyeSAqbW1kaXI7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYXRvbWljX2xvbmdfdCBhbGxvY3NfZmlsZV9zZXEgLSBSZXByZXNlbnRzIHRoZSBuYW1pbmcgc2VxdWVuY2UgdXNlZCBmb3IKJiM0MzsgKiBhbGxvY2F0aW9uIGZpbGVzLgomIzQzOyAqLwomIzQzO2F0b21pY19sb25nX3QgYWxsb2NzX2ZpbGVfc2VxID0gQVRPTUlDX0lOSVQoMCk7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYWxsb2NzX3hhIC0gUmVwcmVzZW50IHRoZSB4YXJyYXkgdGhhdCBjb250YWlucyB0aGUgYWN0dWFsIGFsbG9jYXRpb25zIHBlcmZvcm0KJiM0MzsgKiBieSB0aGlzIGRyaXZlci4KJiM0MzsgKi8KJiM0MztzdGF0aWMgREVGSU5FX1hBUlJBWShhbGxvY3NfeGEpOwomIzQzOwomIzQzOy8qKgomIzQzOyAqIHN0cnVjdCByZXFfYWxsb2MgLSBSZXByZXNlbnRzIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvbgomIzQzOyAqIEBub2RlX2lkeDogVGhlIE5vZGUgaW5kZXggdG8gYWxsb2NhdGUgZnJvbS4KJiM0MzsgKiBAem9uZV9pZHg6IFRoZSBab25lIGluZGV4IHRvIGFsbG9jYXRlIGZyb20uCiYjNDM7ICogQG9yZGVyOiBUaGUgT3JkZXIgb2YgcGFnZXMgdG8gYWxsb2NhdGUuCiYjNDM7ICogQG1pZ3JhdGVfdHlwZTogVGhlIE1pZ3JhdGUgdHlwZSB0byBhbGxvY2F0ZSBmcm9tLgomIzQzOyAqIEBwYXJlbnRkaXI6IFRoZSBwYXJlbnQgZGlyIHdoZXJlIHRoZSBmaWxlIHJlcHJlc2VudGluZyB0aGUgYWxsb2Mgd2FzIGNyZWF0ZWQuCiYjNDM7ICovCiYjNDM7c3RydWN0IHJlcV9hbGxvYyB7CiYjNDM7CWludCBub2RlX2lkeDsKJiM0MzsJaW50IHpvbmVfaWR4OwomIzQzOwlpbnQgb3JkZXI7CiYjNDM7CWludCBtaWdyYXRlX3R5cGU7CiYjNDM7CXN0cnVjdCBkZW50cnkgKnBhcmVudGRpcjsKJiM0Mzt9OwomIzQzOwomIzQzOy8qCiYjNDM7ICogc3RydWN0IHBhZ2VfYWxsb2MgLSBSZXByZXNlbnRzIHRoZSBwYWdlIGFsbG9jYXRpb24uCiYjNDM7ICogQHBhZ2U6IFRoZSBwb2ludGVyIHRvIHRoZSBwYWdlKHMpIGFsbG9jYXRlZC4KJiM0MzsgKiBAcmVxX2FsbG9jOiBUaGUgZGV0YWlscyBvZiB0aGUgYWxsb2NhdGlvbi4KJiM0MzsgKiBAYWxsb2NfZGVudHJ5OiBUaGUgcG9pbnRlciB0byB0aGUgZmlsZSB0aGF0IHJlcHJlc2VudHMgdGhlIGFsbG9jYXRpb24uCiYjNDM7ICovCiYjNDM7c3RydWN0IHBhZ2VfYWxsb2MgewomIzQzOwlzdHJ1Y3QgcGFnZSAqcGFnZTsKJiM0MzsJc3RydWN0IHJlcV9hbGxvYyAqcmVxX2FsbG9jOwomIzQzOwlzdHJ1Y3QgZGVudHJ5ICphbGxvY19kZW50cnk7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3Qga21lbV9jYWNoZSAqcmVxX2FsbG9jX2NhY2hlOwomIzQzO3N0cnVjdCBrbWVtX2NhY2hlICpwYWdlX2FsbG9jX2NhY2hlOwomIzQzOwomIzQzO2lubGluZSB2b2lkIHNldF96b25lX3RvX2FsbG9jX2Zyb20oaW50IHpvbmVfaWR4LCBnZnBfdCAqZmxhZ3NfcHRyKQomIzQzO3sKJiM0MzsJc3dpdGNoICh6b25lX2lkeCkgewomIzQzOyNpZmRlZiBDT05GSUdfWk9ORV9ETUEKJiM0MzsJY2FzZSBaT05FX0RNQToKJiM0MzsJCSpmbGFnc19wdHIgfD0gX19HRlBfRE1BOwomIzQzOwkJYnJlYWs7CiYjNDM7I2VuZGlmCiYjNDM7I2lmZGVmIENPTkZJR19aT05FX0RNQTMyCiYjNDM7CWNhc2UgWk9ORV9ETUEzMjoKJiM0MzsJCSpmbGFnc19wdHIgfD0gX19HRlBfRE1BMzI7CiYjNDM7CQlicmVhazsKJiM0MzsjZW5kaWYKJiM0MzsjaWZkZWYgQ09ORklHX0hJR0hNRU0KJiM0MzsJY2FzZSBaT05FX0hJR0hNRU06CiYjNDM7CQkqZmxhZ3NfcHRyIHw9IF9fR0ZQX0hJR0hNRU07CiYjNDM7CQlicmVhazsKJiM0MzsjZW5kaWYKJiM0MzsJY2FzZSBaT05FX01PVkFCTEU6CiYjNDM7CQkqZmxhZ3NfcHRyIHw9IF9fR0ZQX01PVkFCTEU7CiYjNDM7CQlicmVhazsKJiM0MzsJY2FzZSBaT05FX05PUk1BTDoKJiM0MzsJZGVmYXVsdDoKJiM0MzsJCSpmbGFnc19wdHIgfD0gMDsKJiM0MzsJCWJyZWFrOwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzO2lubGluZSB2b2lkIHNldF9taWdyYXRlX3R5cGVfdG9fYWxsb2NfZnJvbShpbnQgbWlncmF0ZV90eXBlLCBnZnBfdCAqZmxhZ3NfcHRyKQomIzQzO3sKJiM0MzsJc3dpdGNoIChtaWdyYXRlX3R5cGUpIHsKJiM0MzsJY2FzZSBNSUdSQVRFX1VOTU9WQUJMRToKJiM0MzsJCSpmbGFnc19wdHIgJmFtcDs9IH4oX19HRlBfUkVDTEFJTUFCTEUgfCBfX0dGUF9NT1ZBQkxFKTsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIE1JR1JBVEVfUkVDTEFJTUFCTEU6CiYjNDM7CQkqZmxhZ3NfcHRyIHw9IF9fR0ZQX1JFQ0xBSU1BQkxFOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgTUlHUkFURV9ISUdIQVRPTUlDOgomIzQzOwkJKmZsYWdzX3B0ciB8PSBfX0dGUF9ISUdIOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgTUlHUkFURV9NT1ZBQkxFOiBkZWZhdWx0OgomIzQzOwkJKmZsYWdzX3B0ciB8PSBfX0dGUF9NT1ZBQkxFOwomIzQzOwkJYnJlYWs7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHNzaXplX3QgcGFnZV9hbGxvY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdWJ1ZiwKJiM0MzsJCQkJICAgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKJiM0Mzt7CiYjNDM7CS8qICBXaGljaCBpbmZvcm1hdGlvbiBzaG91bGQgYmUgcHJpbnQgYWJvdXQgdGhlIHBhZ2Ugb3IgYWxsb2NhdGlvbj8gKi8KJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBhZ2VfYWxsb2NfZm9wcyA9IHsKJiM0MzsJLm93bmVyID0gVEhJU19NT0RVTEUsCiYjNDM7CS5vcGVuID0gc2ltcGxlX29wZW4sCiYjNDM7CS5yZWFkID0gcGFnZV9hbGxvY19yZWFkLAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGludCBtYWtlX2FsbG9jKHN0cnVjdCByZXFfYWxsb2MgKnJlcSwKJiM0MzsJCQkgICAgZ2ZwX3QgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKmFsbG9jX2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHBhZ2VfYWxsb2MgKnBhOwomIzQzOwlzdHJ1Y3QgcGFnZSAqcGFnZTsKJiM0MzsJY2hhciBuZXdfYWxsb2NfbmFtZVsxMl07CiYjNDM7CXN0cnVjdCBkZW50cnkgKm5ld19hbGxvY19kZW50cnk7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXBhZ2UgPSBhbGxvY19wYWdlc19ub2RlX25vcHJvZihyZXEtJmd0O25vZGVfaWR4LCBmbGFncywgcmVxLSZndDtvcmRlcik7CiYjNDM7CWlmIChwYWdlKSB7CiYjNDM7CQlwYSA9IGttZW1fY2FjaGVfYWxsb2MocGFnZV9hbGxvY19jYWNoZSwgR0ZQX0tFUk5FTCk7CiYjNDM7CQlpZiAoIXBhKSB7CiYjNDM7CQkJcmV0ID0gLUVOT01FTTsKJiM0MzsJCQlnb3RvIGZyZWVfcGFnZXM7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQkqYWxsb2NfaWQgPSBhdG9taWNfbG9uZ19pbmNfcmV0dXJuKCZhbXA7YWxsb2NzX2ZpbGVfc2VxKTsKJiM0MzsJCXJldCA9IHhhX2luc2VydCgmYW1wO2FsbG9jc194YSwgKmFsbG9jX2lkLCBwYSwgR0ZQX0tFUk5FTCk7CiYjNDM7CQlpZiAocmV0KQomIzQzOwkJCWdvdG8gZnJlZV9wYWdlX2FsbG9jOwomIzQzOwomIzQzOwkJc25wcmludGYobmV3X2FsbG9jX25hbWUsIHNpemVvZihuZXdfYWxsb2NfbmFtZSksICYjMzQ7JWx1JiMzNDssCiYjNDM7CQkJICphbGxvY19pZCk7CiYjNDM7CiYjNDM7CQluZXdfYWxsb2NfZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgKJiM0MzsJCQluZXdfYWxsb2NfbmFtZSwgMDY0NCwgcmVxLSZndDtwYXJlbnRkaXIsCiYjNDM7CQkJcGEsICZhbXA7cGFnZV9hbGxvY19mb3BzKTsKJiM0MzsJCWlmIChJU19FUlIobmV3X2FsbG9jX2RlbnRyeSkpIHsKJiM0MzsJCQlyZXQgPSBQVFJfRVJSKG5ld19hbGxvY19kZW50cnkpOwomIzQzOwkJCWdvdG8gZXJhc2VfeGFfZW50cnk7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlwYS0mZ3Q7cmVxX2FsbG9jID0gcmVxOwomIzQzOwkJcGEtJmd0O3BhZ2UgPSBwYWdlOwomIzQzOwkJcGEtJmd0O2FsbG9jX2RlbnRyeSA9IG5ld19hbGxvY19kZW50cnk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MztlcmFzZV94YV9lbnRyeToKJiM0MzsJeGFfZXJhc2UoJmFtcDthbGxvY3NfeGEsICphbGxvY19pZCk7CiYjNDM7CiYjNDM7ZnJlZV9wYWdlX2FsbG9jOgomIzQzOwlrbWVtX2NhY2hlX2ZyZWUocGFnZV9hbGxvY19jYWNoZSwgcGEpOwomIzQzOwomIzQzO2ZyZWVfcGFnZXM6CiYjNDM7CV9fZnJlZV9wYWdlcyhwYWdlLCBwYS0mZ3Q7cmVxX2FsbG9jLSZndDtvcmRlcik7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZnJlZV9hbGxvY19oZWxwZXIodW5zaWduZWQgbG9uZyBhbGxvY19pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBwYWdlX2FsbG9jICpwYTsKJiM0MzsKJiM0MzsJcGEgPSB4YV9lcmFzZSgmYW1wO2FsbG9jc194YSwgYWxsb2NfaWQpOwomIzQzOwlpZiAoIXBhKSB7CiYjNDM7CQlwcl9lcnIoJiMzNDtUaGUgYWxsb2NfaWQgJWx1IHdhcyBub3QgZm91bmQhJiMzNDssIGFsbG9jX2lkKTsKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwl9CiYjNDM7CiYjNDM7CV9fZnJlZV9wYWdlcyhwYS0mZ3Q7cGFnZSwgcGEtJmd0O3JlcV9hbGxvYy0mZ3Q7b3JkZXIpOwomIzQzOwlkZWJ1Z2ZzX3JlbW92ZShwYS0mZ3Q7YWxsb2NfZGVudHJ5KTsKJiM0MzsJa21lbV9jYWNoZV9mcmVlKHBhZ2VfYWxsb2NfY2FjaGUsIHBhKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJlcV9wYWdlX2FsbG9jX3dyaXRlKCkgLSBBbGxvY2F0ZXMgdGhlIHBhZ2VzIG9uIHRoZSByZXF1ZXN0ZWQgbm9kZSwgem9uZSwKJiM0MzsgKiBvcmRlciBhbmQgbWlncmF0ZSB0eXBlLiBPbmNlIHRoZSBhbGxvY2F0aW9uIGlzIHBlcmZvcm1lZCwgYSBmaWxlIGlzIGNyZWF0ZWQKJiM0MzsgKiB0byBmcmVlIHRoZSBhbGxvY2F0aW9uIGxhdGVyLgomIzQzOyAqLwomIzQzO3N0YXRpYyBzc2l6ZV90IHJlcV9wYWdlX2FsbG9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdWJ1ZiwKJiM0MzsJCQkJICAgICBzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgcmVxX2FsbG9jICpyZXEgPSBmaWxlLSZndDtwcml2YXRlX2RhdGE7CiYjNDM7CXVuc2lnbmVkIGxvbmcgYWxsb2NfaWQ7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnJfcGFnZXNfYWxsb2NzOwomIzQzOwl1bnNpZ25lZCBsb25nICphbGxvY3NfaWRzOwomIzQzOwlnZnBfdCBmbGFncyA9IDA7CiYjNDM7CWludCByZXQ7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlyZXQgPSBrc3RydG91bF9mcm9tX3VzZXIodWJ1ZiwgY250LCAxMCwgJmFtcDtucl9wYWdlc19hbGxvY3MpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJYWxsb2NzX2lkcyA9IGttYWxsb2NfYXJyYXkobnJfcGFnZXNfYWxsb2NzLCBzaXplb2YodW5zaWduZWQgbG9uZyksCiYjNDM7CQkJCQlHRlBfS0VSTkVMKTsKJiM0MzsJaWYgKCFhbGxvY3NfaWRzKQomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CiYjNDM7CXNldF96b25lX3RvX2FsbG9jX2Zyb20ocmVxLSZndDt6b25lX2lkeCwgJmFtcDtmbGFncyk7CiYjNDM7CXNldF9taWdyYXRlX3R5cGVfdG9fYWxsb2NfZnJvbShyZXEtJmd0O21pZ3JhdGVfdHlwZSwgJmFtcDtmbGFncyk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBucl9wYWdlc19hbGxvY3M7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlyZXQgPSBtYWtlX2FsbG9jKHJlcSwgZmxhZ3MsICZhbXA7YWxsb2NfaWQpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlnb3RvIGZyZWVfYWxsb2NzOwomIzQzOwomIzQzOwkJYWxsb2NzX2lkc1tpXSA9IGFsbG9jX2lkOwomIzQzOwl9CiYjNDM7CiYjNDM7CWtmcmVlKGFsbG9jc19pZHMpOwomIzQzOwomIzQzOwlyZXR1cm4gY250OwomIzQzOwomIzQzO2ZyZWVfYWxsb2NzOgomIzQzOwkvKiBGcmVlIGFsbCB0aGUgcGFnZXMgcHJldmlvdXNseSBhbGxvY2F0ZWQuICovCiYjNDM7CWZvciAoaW50IGogPSAwOyBqICZsdDsgaTsgaiYjNDM7JiM0MzspIHsKJiM0MzsJCWludCByZXQyID0gZnJlZV9hbGxvY19oZWxwZXIoYWxsb2NzX2lkc1tqXSk7CiYjNDM7CiYjNDM7CQlpZiAocmV0MikKJiM0MzsJCQlwcl9lcnIoJiMzNDtVbmFibGUgdG8gZnJlZSBwYWdlcyBhc3NvY2lhdGVkIHdpdGggZmlsZSAlbHUmIzM0OywKJiM0MzsJCQkgICAgICAgYWxsb2NzX2lkc1tqXSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJa2ZyZWUoYWxsb2NzX2lkcyk7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlcV9wYWdlX2FsbG9jX2ZvcHMgPSB7CiYjNDM7CS5vd25lciA9IFRISVNfTU9EVUxFLAomIzQzOwkub3BlbiA9IHNpbXBsZV9vcGVuLAomIzQzOwkud3JpdGUgPSByZXFfcGFnZV9hbGxvY193cml0ZSwKJiM0Mzt9OwomIzQzOwomIzQzOy8qKgomIzQzOyAqIGZyZWVfcGFnZV9hbGxvY193cml0ZSgpIC0gZnJlZSB0aGUgcHJldmlvdXNseSBhbGxvY2F0ZWQgcGFnZXMuCiYjNDM7ICogQGZpbGU6IEZpbGUgd2hlcmUgdGhlIHVzZXIgaXMgd3JpdGluZy4KJiM0MzsgKiBAdWJ1ZjogQ29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhlIHVzZXIgd2FudHMgdG8gZGVsZXRlIGFuZCBoYXZlIHRoZQomIzQzOyAqICAgICAgIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmaWxlIGZyZWVkLgomIzQzOyAqIEBjbnQ6IFNpemUgb2YgQHVidWYuCiYjNDM7ICogQHBwb3M6IEN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGZpbGUuCiYjNDM7ICovCiYjNDM7c3RhdGljIHNzaXplX3QgZnJlZV9wYWdlX2FsbG9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAomIzQzOwkJCQkgICAgICBjb25zdCBjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IGNudCwKJiM0MzsJCQkJICAgICAgbG9mZl90ICpwcG9zKQomIzQzO3sKJiM0MzsJaW50IHJldDsKJiM0MzsJdW5zaWduZWQgbG9uZyBhbGxvY19pZDsKJiM0MzsKJiM0MzsJcmV0ID0ga3N0cnRvdWxfZnJvbV91c2VyKHVidWYsIGNudCwgMTAsICZhbXA7YWxsb2NfaWQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gZnJlZV9hbGxvY19oZWxwZXIoYWxsb2NfaWQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0dXJuIGNudDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnJlZV9wYWdlX2FsbG9jX2ZvcHMgPSB7CiYjNDM7CS5vd25lciA9IFRISVNfTU9EVUxFLAomIzQzOwkud3JpdGUgPSBmcmVlX3BhZ2VfYWxsb2Nfd3JpdGUsCiYjNDM7fTsKJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBjcmVhdGVfbnJfcGFnZXNfYWxsb2NzX2ZpbGUoKSAtIENyZWF0ZXMgdGhlIGZpbGUgJiMzNDtucl9wYWdlc19hbGxvY3MmIzM0Oy4KJiM0MzsgKgomIzQzOyAqIFRoZSAmIzM0O25yX3BhZ2VzX2FsbG9jcyYjMzQ7IGZpbGUgd2lsbCBiZSB1c2VkIHRvIHdyaXRlIHRoZSBudW1iZXIgb2YgYWxsb2NhdGlvbnMKJiM0MzsgKiB0aGF0IHdpbGwgYmUgcGVyZm9ybWVkLiBXaGVuIHRoZSBhbGxvY2F0aW9ucyBhcmUgcGVyZm9ybWVkLCBhIG5ldyBmaWxlIGZvcgomIzQzOyAqIGVhY2ggYWxsb2NhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgaW4gQG1pZ3JhdGVkaXIuCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgY3JlYXRlX25yX3BhZ2VzX2FsbG9jc19maWxlKHN0cnVjdCBkZW50cnkgKm1pZ3JhdGVkaXIsCiYjNDM7CQkJCQkgICAgICBpbnQgbm9kZV9pZHgsIGludCB6b25lX2lkeCwKJiM0MzsJCQkJCSAgICAgIGludCBvcmRlciwgaW50IG10eXBlKQomIzQzO3sKJiM0MzsJc3RydWN0IHJlcV9hbGxvYyAqcmVxOwomIzQzOwlzdHJ1Y3QgZGVudHJ5ICpucl9wYWdlczsKJiM0MzsKJiM0MzsJcmVxID0ga21lbV9jYWNoZV9hbGxvYyhyZXFfYWxsb2NfY2FjaGUsIEdGUF9LRVJORUwpOwomIzQzOwlpZiAoIXJlcSkgewomIzQzOwkJcHJfZXJyKCYjMzQ7RmFpbGVkIHRvIGNyZWF0ZSBucl9wYWdlc19hbGxvY3NfaW5mbyYjMzQ7KTsKJiM0MzsJCXJldHVybiAtRU5PTUVNOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJlcS0mZ3Q7bm9kZV9pZHggPSBub2RlX2lkeDsKJiM0MzsJcmVxLSZndDt6b25lX2lkeCA9IHpvbmVfaWR4OwomIzQzOwlyZXEtJmd0O29yZGVyID0gb3JkZXI7CiYjNDM7CXJlcS0mZ3Q7bWlncmF0ZV90eXBlID0gbXR5cGU7CiYjNDM7CXJlcS0mZ3Q7cGFyZW50ZGlyID0gbWlncmF0ZWRpcjsKJiM0MzsKJiM0MzsJbnJfcGFnZXMgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCYjMzQ7bnJfcGFnZXNfYWxsb2NzJiMzNDssIDA2NDQsIG1pZ3JhdGVkaXIsIHJlcSwKJiM0MzsJCQkJICAgICAgICZhbXA7cmVxX3BhZ2VfYWxsb2NfZm9wcyk7CiYjNDM7CWlmIChJU19FUlIobnJfcGFnZXMpKQomIzQzOwkJcmV0dXJuIFBUUl9FUlIobnJfcGFnZXMpOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogY3JlYXRlX21pZ3JhdGVfdHlwZV9zdWJkaXJzKCkgLSBDcmVhdGVzIGEgZGlyZWN0b3J5IGZvciBlYWNoIG1pZ3JhdGUgdHlwZQomIzQzOyAqIGluc2lkZSB0aGUgb3JkZXIgZGlyZWN0b3J5LiBPbmNlIHRoZSBtaWdyYXRlIHR5cGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQsIGl0CiYjNDM7ICogY3JlYXRlcyB0aGUgJiMzNDtucl9hbGxvY3MmIzM0OyBmaWxlIGFuZCB0aGUgJiMzNDtmcmVlJiMzNDsgZmlsZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGludCBjcmVhdGVfbWlncmF0ZV90eXBlX3N1YmRpcnMoc3RydWN0IGRlbnRyeSAqb3JkZXJkaXIsCiYjNDM7CQkJCQkgICAgICBpbnQgbm9kZV9pZHgsIGludCB6b25lX2lkeCwKJiM0MzsJCQkJCSAgICAgIGludCBvcmRlcikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBkZW50cnkgKm1pZ3JhdGVkaXI7CiYjNDM7CWNoYXIgZGlybmFtZVsyNF07CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWZvciAoaW50IG10eXBlID0gMDsgbXR5cGUgJmx0OyBNSUdSQVRFX1RZUEVTOyBtdHlwZSYjNDM7JiM0MzspIHsKJiM0MzsjaWZkZWYgQ09ORklHX0NNQQomIzQzOwkJaWYgKG10eXBlID09IE1JR1JBVEVfQ01BKSAvKiBDTUEgYWxsb2NzIGFyZSBub3Qgc3VwcG9ydGVkIHlldCovCiYjNDM7CQkJY29udGludWU7CiYjNDM7I2VuZGlmCiYjNDM7I2lmZGVmIENPTkZJR19NRU1PUllfSVNPTEFUSU9OCiYjNDM7CQlpZiAobXR5cGUgPT0gTUlHUkFURV9JU09MQVRFKSAvKiBjYW4mIzM5O3QgYWxsb2NhdGUgZnJvbSBoZXJlICovCiYjNDM7CQkJY29udGludWU7CiYjNDM7I2VuZGlmCiYjNDM7CQlzbnByaW50ZihkaXJuYW1lLCBzaXplb2YoZGlybmFtZSksICYjMzQ7bWlncmF0ZS0lcyYjMzQ7LAomIzQzOwkJCSBtaWdyYXRldHlwZV9uYW1lc1ttdHlwZV0pOwomIzQzOwkJbWlncmF0ZWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihkaXJuYW1lLCBvcmRlcmRpcik7CiYjNDM7CQlpZiAoSVNfRVJSKG1pZ3JhdGVkaXIpKQomIzQzOwkJCXJldHVybiBQVFJfRVJSKG1pZ3JhdGVkaXIpOwomIzQzOwomIzQzOwkJcmV0ID0gY3JlYXRlX25yX3BhZ2VzX2FsbG9jc19maWxlKG1pZ3JhdGVkaXIsIG5vZGVfaWR4LAomIzQzOwkJCQkJCSAgem9uZV9pZHgsIG9yZGVyLCBtdHlwZSk7CiYjNDM7CQlpZiAocmV0KQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGNyZWF0ZV9wYWdlX29yZGVyc19zdWJkaXJzKCkgLSBDcmVhdGVzIGEgZGlyZWN0b3J5IGZvciBlYWNoIHBhZ2Ugb3JkZXIgaW5zaWRlCiYjNDM7ICogdGhlIHpvbmUgZGlyZWN0b3J5LiBPbmNlIHRoYXQgdGhlIHBhZ2Ugb3JkZXIgZGlyZWN0b3J5IGlzIGNyZWF0ZWQsIGl0IGNyZWF0ZXMKJiM0MzsgKiBhIGRpcmVjdG9yeSBmb3IgZWFjaCBtaWdyYXRlIHR5cGUuCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgY3JlYXRlX3BhZ2Vfb3JkZXJzX3N1YmRpcnMoc3RydWN0IGRlbnRyeSAqem9uZWRpciwKJiM0MzsJCQkJCSAgICAgaW50IG5vZGVfaWR4LCBpbnQgem9uZV9pZHgsCiYjNDM7CQkJCQkgICAgIHN0cnVjdCB6b25lICp6b25lKQomIzQzO3sKJiM0MzsJc3RydWN0IGRlbnRyeSAqb3JkZXJkaXI7CiYjNDM7CWNoYXIgZGlybmFtZVsxMl07CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWZvciAoaW50IG9yZGVyID0gMDsgb3JkZXIgJmx0OyBOUl9QQUdFX09SREVSUzsgb3JkZXImIzQzOyYjNDM7KSB7CiYjNDM7CQlzbnByaW50ZihkaXJuYW1lLCBzaXplb2YoZGlybmFtZSksICYjMzQ7b3JkZXItJWQmIzM0Oywgb3JkZXIpOwomIzQzOwkJb3JkZXJkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoZGlybmFtZSwgem9uZWRpcik7CiYjNDM7CQlpZiAoSVNfRVJSKG9yZGVyZGlyKSkKJiM0MzsJCQlyZXR1cm4gUFRSX0VSUihvcmRlcmRpcik7CiYjNDM7CiYjNDM7CQlyZXQgPSBjcmVhdGVfbWlncmF0ZV90eXBlX3N1YmRpcnMob3JkZXJkaXIsIG5vZGVfaWR4LCB6b25lX2lkeCwKJiM0MzsJCQkJCQkgIG9yZGVyKTsKJiM0MzsJCWlmIChyZXQpCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogY3JlYXRlX3pvbmVzX3N1YmRpcnMoKSAtIENyZWF0ZXMgYSBkaXJlY3RvcnkgZm9yIGVhY2ggcG9wdWxhdGVkIHpvbmUgaW4gdGhlCiYjNDM7ICogbm9kZS4gT25jZSB0aGF0IHRoZSB6b25lIGRpcmVjdG9yeSBpcyBjcmVhdGVkLCBpdCBjcmVhdGVzIGEgZGlyZWN0b3J5IGZvcgomIzQzOyAqIGVhY2ggb3JkZXIgc3VwcG9ydGVkLgomIzQzOyAqCiYjNDM7ICogTm90ZTogWk9ORV9ERVZJQ0UgcGFnZXMgd29uJiMzOTt0IGJlIGFsbG9jYXRlZCB1c2luZyB0aGlzIGRyaXZlci4gVGhlIG1haW4gcmVhc29uCiYjNDM7ICogaXMgYmVjYXVzZSB0aGV5IGFyZSBub3QgbWFuYWdlZCBieSB0aGUgQnVkZHkgQWxsb2NhdG9yIG9yIENNQSBhbGxvY2F0b3IuCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgY3JlYXRlX3pvbmVzX3N1YmRpcnMoc3RydWN0IGRlbnRyeSAqbm9kZWRpciwgaW50IG5vZGVfaWR4LAomIzQzOwkJCQkgICAgICAgc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdGEpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZGVudHJ5ICp6b25lZGlyOwomIzQzOwlzdHJ1Y3Qgem9uZSAqem9uZTsKJiM0MzsJc3RydWN0IHpvbmUgKm5vZGVfem9uZXMgPSBwZ2RhdGEtJmd0O25vZGVfem9uZXM7CiYjNDM7CWludCB6b25lX2lkeDsKJiM0MzsJY2hhciBkaXJuYW1lWzI0XTsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJZm9yICh6b25lID0gbm9kZV96b25lcywgem9uZV9pZHggPSAwOyB6b25lIC0gbm9kZV96b25lcyAmbHQ7IE1BWF9OUl9aT05FUzsKJiM0MzsJICAgICAmIzQzOyYjNDM7em9uZSwgJiM0MzsmIzQzO3pvbmVfaWR4KSB7CiYjNDM7CQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwomIzQzOwkJLyogWk9ORV9ERVZJQ0UgcGFnZXMgd29uJiMzOTt0IGJlIGFsbG9jYXRlZCB1c2luZyB0aGlzIGRyaXZlci4gKi8KJiM0MzsJCWlmICh6b25lX2lzX3pvbmVfZGV2aWNlKHpvbmUpKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwomIzQzOwkJc25wcmludGYoZGlybmFtZSwgc2l6ZW9mKGRpcm5hbWUpLCAmIzM0O3pvbmUtJXMmIzM0Oywgem9uZS0mZ3Q7bmFtZSk7CiYjNDM7CQl6b25lZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKGRpcm5hbWUsIG5vZGVkaXIpOwomIzQzOwkJaWYgKElTX0VSUih6b25lZGlyKSkKJiM0MzsJCQlyZXR1cm4gUFRSX0VSUih6b25lZGlyKTsKJiM0MzsKJiM0MzsJCXJldCA9IGNyZWF0ZV9wYWdlX29yZGVyc19zdWJkaXJzKHpvbmVkaXIsIG5vZGVfaWR4LCB6b25lX2lkeCwKJiM0MzsJCQkJCQkgem9uZSk7CiYjNDM7CQlpZiAocmV0KQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGNyZWF0ZV9ub2Rlc19zdWJkaXJzKCkgLSBDcmVhdGVzIGEgZGlyZWN0b3J5IGZvciBlYWNoIG9ubGluZSBub2RlIGluIHRoZQomIzQzOyAqIHN5c3RlbS4gT25jZSB0aGF0IHRoZSBub2RlIGRpcmVjdG9yeSBpcyBjcmVhdGVkLCBpdCBjcmVhdGVzIGEgZGlyZWN0b3J5IGZvcgomIzQzOyAqIGVhY2ggem9uZSBpbiB0aGUgbm9kZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGludCBjcmVhdGVfbm9kZXNfc3ViZGlycyhzdHJ1Y3QgZGVudHJ5ICptbWRpcikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBkZW50cnkgKm5vZGVkaXI7CiYjNDM7CWludCBub2RlX2lkeDsKJiM0MzsJY2hhciBkaXJuYW1lWzEyXTsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZV9pZHgpIHsKJiM0MzsJCXN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXRhID0gTk9ERV9EQVRBKG5vZGVfaWR4KTsKJiM0MzsKJiM0MzsJCXNucHJpbnRmKGRpcm5hbWUsIHNpemVvZihkaXJuYW1lKSwgJiMzNDtub2RlLSVkJiMzNDssIG5vZGVfaWR4KTsKJiM0MzsJCW5vZGVkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoZGlybmFtZSwgbW1kaXIpOwomIzQzOwkJaWYgKElTX0VSUihub2RlZGlyKSkKJiM0MzsJCQlyZXR1cm4gUFRSX0VSUihub2RlZGlyKTsKJiM0MzsKJiM0MzsJCXJldCA9IGNyZWF0ZV96b25lc19zdWJkaXJzKG5vZGVkaXIsIG5vZGVfaWR4LCBwZ2RhdGEpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IF9faW5pdCBwYWdlX2FsbG9jX2hvZ2dlcl9kZWJ1Z2ZzX2luaXQodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBkZW50cnkgKmZyZWVfZmlsZTsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJcmVxX2FsbG9jX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoCiYjNDM7CQkmIzM0O3JlcV9hbGxvY19jYWNoZSYjMzQ7LCBzaXplb2Yoc3RydWN0IHJlcV9hbGxvYyksIDAsCiYjNDM7CQlTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOwomIzQzOwlpZiAoIXJlcV9hbGxvY19jYWNoZSkgewomIzQzOwkJcHJfZXJyKCYjMzQ7VGhlIHJlcV9hbGxvY19jYWNoZSBjb3VsZG4mIzM5O3QgYmUgY3JlYXRlZCYjMzQ7KTsKJiM0MzsJCXJldCA9IC1FTk9NRU07CiYjNDM7CQlnb3RvIGVycm9yX2V4aXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcGFnZV9hbGxvY19jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKAomIzQzOwkJJiMzNDtwYWdlX2FsbG9jX2NhY2hlJiMzNDssIHNpemVvZihzdHJ1Y3QgcGFnZV9hbGxvYyksIDAsCiYjNDM7CQlTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOwomIzQzOwlpZiAoIXBhZ2VfYWxsb2NfY2FjaGUpIHsKJiM0MzsJCXByX2VycigmIzM0O1RoZSBwYWdlX2FsbG9jX2NhY2hlIGNvdWxkbiYjMzk7dCBiZSBjcmVhdGVkJiMzNDspOwomIzQzOwkJcmV0ID0gLUVOT01FTTsKJiM0MzsJCWdvdG8gY2xlYW5fcmVxX2FsbG9jX2NhY2hlOwomIzQzOwl9CiYjNDM7CiYjNDM7CW1tZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCYjMzQ7bW0mIzM0OywgTlVMTCk7CiYjNDM7CWlmIChJU19FUlIobW1kaXIpKSB7CiYjNDM7CQlwcl9lcnIoJiMzNDtVbmFibGUgdG8gY3JlYXRlIG1tIGRpcmVjdG9yeSYjMzQ7KTsKJiM0MzsJCXJldCA9IFBUUl9FUlIobW1kaXIpOwomIzQzOwkJZ290byBjbGVhbl9wYWdlX2FsbG9jX2NhY2hlOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9ub2Rlc19zdWJkaXJzKG1tZGlyKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCWdvdG8gY2xlYW5fZGlyOwomIzQzOwomIzQzOwlmcmVlX2ZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCYjMzQ7ZnJlZSYjMzQ7LCAwNjQ0LCBtbWRpciwgTlVMTCwKJiM0MzsJCQkJCSZhbXA7ZnJlZV9wYWdlX2FsbG9jX2ZvcHMpOwomIzQzOwlpZiAoSVNfRVJSKGZyZWVfZmlsZSkpIHsKJiM0MzsJCXJldCA9IFBUUl9FUlIoZnJlZV9maWxlKTsKJiM0MzsJCWdvdG8gY2xlYW5fZGlyOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2NsZWFuX2RpcjoKJiM0MzsJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKG1tZGlyKTsKJiM0MzsKJiM0MztjbGVhbl9wYWdlX2FsbG9jX2NhY2hlOgomIzQzOwlrbWVtX2NhY2hlX2Rlc3Ryb3kocGFnZV9hbGxvY19jYWNoZSk7CiYjNDM7CiYjNDM7Y2xlYW5fcmVxX2FsbG9jX2NhY2hlOgomIzQzOwlrbWVtX2NhY2hlX2Rlc3Ryb3kocmVxX2FsbG9jX2NhY2hlKTsKJiM0MzsKJiM0MztlcnJvcl9leGl0OgomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBfX2V4aXQgcGFnZV9hbGxvY19ob2dnZXJfZGVidWdmc19leGl0KHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgcGFnZV9hbGxvYyAqcGE7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaWR4OwomIzQzOwomIzQzOwl4YV9mb3JfZWFjaCgmYW1wO2FsbG9jc194YSwgaWR4LCBwYSkgewomIzQzOwkJX19mcmVlX3BhZ2VzKHBhLSZndDtwYWdlLCBwYS0mZ3Q7cmVxX2FsbG9jLSZndDtvcmRlcik7CiYjNDM7CQl4YV9lcmFzZSgmYW1wO2FsbG9jc194YSwgaWR4KTsKJiM0MzsJfQomIzQzOwomIzQzOwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUobW1kaXIpOwomIzQzOwlrbWVtX2NhY2hlX2Rlc3Ryb3kocmVxX2FsbG9jX2NhY2hlKTsKJiM0MzsJa21lbV9jYWNoZV9kZXN0cm95KHBhZ2VfYWxsb2NfY2FjaGUpOwomIzQzO30KJiM0MzsKJiM0Mzttb2R1bGVfaW5pdChwYWdlX2FsbG9jX2hvZ2dlcl9kZWJ1Z2ZzX2luaXQpOwomIzQzO21vZHVsZV9leGl0KHBhZ2VfYWxsb2NfaG9nZ2VyX2RlYnVnZnNfZXhpdCk7CiYjNDM7CiYjNDM7TU9EVUxFX0FVVEhPUigmIzM0O0p1YW4gWWVzY2FzJiMzNDspOwomIzQzO01PRFVMRV9ERVNDUklQVElPTigmIzM0O01vZHVsZSB0byBhbGxvYyBwYWdlcyB0byBnZW5lcmF0ZSBtZW1vcnkgcHJlc3N1cmUmIzM0Oyk7CiYjNDM7TU9EVUxFX0xJQ0VOU0UoJiMzNDtHUEwmIzM0Oyk7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI0IDEyOjE2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg0MjcKCQkJCQkJCW91dHB1dDogMjAKCQkJCQkJCXRob3VnaHRzOiAzODQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSAmIzM0O1BhZ2UgQWxsb2MgSG9nZ2VyJiMzNDsgRGVidWdmcyBJbnRlcmZhY2UgZm9yIEZ1enppbmcqKgoKT2theSwgc28gdGhlcmUmIzM5O3MgdGhpcyBuZXcgcGF0Y2gsIGBwYWdlX2FsbG9jX2hvZ2dlci5jYCwgdGhhdCBpbnRyb2R1Y2VzIGEgZGVidWdmcyBpbnRlcmZhY2UsIHNwZWNpZmljYWxseSB1bmRlciBgL3N5cy9rZXJuZWwvZGVidWcvbW0vYC4gIFRoZSBnb2FsIGhlcmUgaXMgdG8gY3JlYXRlIGFydGlmaWNpYWwgbWVtb3J5IHByZXNzdXJlIGFuZCB0ZXN0IHRoaW5ncyBsaWtlIG1lbW9yeSByZWNsYWltLCB0aGUgT3V0LW9mLU1lbW9yeSAoT09NKSBraWxsZXIsIGFuZCBwYWdlIG1pZ3JhdGlvbi4gIFRoZSBpbXBvcnRhbnQgdGhpbmcgaXMsIGl0JiMzOTtzIGNvbmZpZ3VyYWJsZSB2aWEgYENPTkZJR19QQUdFQUxMT0NfSE9HR0VSYCBhbmQgcmVsaWVzIG9uIGBERUJVR19GU2AuCgpNeSBpbml0aWFsIHRob3VnaHQgaXMsIGlzIHRoaXMgZnV6emFibGU/ICBBYnNvbHV0ZWx5LiBJdCBnaXZlcyB1cyBhIHdheSB0byBhbGxvY2F0ZSBtZW1vcnkgd2l0aCBhIHZhcmlldHkgb2YgYEdGUGAgZmxhZ3MgYW5kIGFsbG9jYXRpb24gb3JkZXJzLCB3aGljaCBjb3VsZCBiZSBhIGdvbGRtaW5lIGZvciB0cmlnZ2VyaW5nIGludGVyZXN0aW5nIG1lbW9yeSBtYW5hZ2VtZW50IGJ1Z3Mgb3IgaGl0dGluZyB0aG9zZSBlZGdlIGNhc2VzIHRoYXQgbGVhZCB0byBPT00gY29uZGl0aW9ucy4gIEl0IHNlZW1zIHRvIGJlIGEgc3RyYWlnaHRmb3J3YXJkIGludGVyZmFjZSB0aGF0IGVzc2VudGlhbGx5IGp1c3QgY2FsbHMgYGFsbG9jX3BhZ2VzX25vZGVfbm9wcm9mYCBhbmQgYF9fZnJlZV9wYWdlc2AsIHNvIGl0JiMzOTtzIGEgdGVzdGluZyBhbmQgZGVidWdnaW5nIHRvb2wuIEJ1dCB0aGF0JiMzOTtzIGV4YWN0bHkgd2h5IGZ1enppbmcgaXQgY291bGQgYmUgc28gdmFsdWFibGUsIHRlc3RpbmcgdGhlIHBhZ2UgYWxsb2NhdG9yIGFuZCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLgoKTm93LCBzeXprYWxsZXIsIGJlaW5nIHRoZSBmdXp6aW5nIGJlaGVtb3RoIHRoYXQgaXQgaXMsIHdpbGwgbGlrZWx5IGdvIGFmdGVyIGFueSByZWFjaGFibGUgZGVidWdmcyBpbnRlcmZhY2VzLiBTbyBsZXQmIzM5O3MgdGhpbms6IGlzIGl0IHJlYWNoYWJsZT8gRGVidWdmcyBpcyB0eXBpY2FsbHkgbW91bnRlZCwgYW5kLCBjcml0aWNhbGx5LCBzeXprYWxsZXIgcnVucyBhcyByb290LiBCaW5nby4gIFNvIGl0JiMzOTtzIGRlZmluaXRlbHkgYWNjZXNzaWJsZS4KCkxldCYjMzk7cyBxdWlja2x5IHJldmlldyB0aGUgY29yZSBmdW5jdGlvbnMgaW4gYHBhZ2VfYWxsb2NfaG9nZ2VyLmNgOiBgcmVxX3BhZ2VfYWxsb2Nfd3JpdGVgLCBgZnJlZV9wYWdlX2FsbG9jX3dyaXRlYCwgYG1ha2VfYWxsb2NgLCBhbmQgYGZyZWVfYWxsb2NfaGVscGVyYC4gIFNwZWNpZmljYWxseSwgYHJlcV9wYWdlX2FsbG9jX3dyaXRlYCBhbmQgYGZyZWVfcGFnZV9hbGxvY193cml0ZWAgc2VlbSB0byBiZSB0aGUgcHJpbWFyeSB0YXJnZXRzLCB0aG9zZSBhcmUgdGhlIGVudHJ5IHBvaW50cy4KCkkgd2lsbCB1c2UgbXkgZXhpc3RpbmcgdG9vbHMgdG8gdmVyaWZ5IHRoYXQgdGhpcyBpcyBpbmRlZWQgdGhlIGNhc2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjQgMTI6MTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7UEFHRUFMTE9DX0hPR0dFUiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnLmRlYnVnPTMwMD1jb25maWcgUEVSX1ZNQV9MT0NLX1NUQVRTXG4tLVxubW0vS2NvbmZpZy5kZWJ1Zy0zMTItXG5tbS9LY29uZmlnLmRlYnVnOjMxMzpjb25maWcgUEFHRUFMTE9DX0hPR0dFUlxubW0vS2NvbmZpZy5kZWJ1Zy0zMTQtXHRib29sIFwmIzM0O0FsbG9jIHBhZ2VzIGZyb20gZGlmZmVyZW50IG5vZGVzLCB6b25lcywgbWlncmF0ZSB0eXBlcyBhbmQgb3JkZXJzXCYjMzQ7XG4tLVxubW0vTWFrZWZpbGU9MTM1PW9iai0kKENPTkZJR19EQU1PTikgJiM0Mzs9IGRhbW9uL1xubW0vTWFrZWZpbGU6MTM2Om9iai0kKENPTkZJR19QQUdFQUxMT0NfSE9HR0VSKSAmIzQzOz0gcGFnZV9hbGxvY19ob2dnZXIub1xubW0vTWFrZWZpbGUtMTM3LW9iai0kKENPTkZJR19IQVJERU5FRF9VU0VSQ09QWSkgJiM0Mzs9IHVzZXJjb3B5Lm9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yNCAxMjoxNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5NDEyCgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogOTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYW5hbHlzaXMgb2YgdGhlIHNpdHVhdGlvbjoKCioqSW52ZXN0aWdhdGluZyB0aGUgUEFHRUFMTE9DX0hPR0dFUiBDb25maWd1cmF0aW9uKioKCk9rYXksIHNvIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggYSBzeXN0ZW0gY29uZmlndXJlZCB3aXRoIGBQQUdFQUxMT0NfSE9HR0VSYC4gTXkgcHJpbWFyeSB0YXJnZXRzIGFyZSB0aGUgZnVuY3Rpb25zIGByZXFfcGFnZV9hbGxvY193cml0ZWAsIGBmcmVlX3BhZ2VfYWxsb2Nfd3JpdGVgLCBgbWFrZV9hbGxvY2AsIGFuZCBgZnJlZV9hbGxvY19oZWxwZXJgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBjb25maWcgaW50ZXJhY3RzIHdpdGggdGhvc2UgY29yZSBhbGxvY2F0aW9uIHJvdXRpbmVzLgoKQmVmb3JlIGRpdmluZyBkZWVwLCBsZXQmIzM5O3MganVzdCBtYWtlIHN1cmUgdGhlcmUgaXNuJiMzOTt0IHNvbWUgb2J2aW91cyBvdGhlciBwbGFjZSBJIG5lZWQgdG8gY29uc2lkZXIgLSBsaWtlIGFuIGluaXQgZnVuY3Rpb24gb3IgYSBwcmUtZGVmaW5lZCBzZXQgb2YgY29uc3RhbnRzLgoKUmlnaHQsIGxldCBtZSBqdXN0IHF1aWNrbHkgZ2xhbmNlIGF0IGBwYWdlX2FsbG9jX3JlYWRgLiBBaCwgaXQganVzdCByZXR1cm5zIHplcm8uIFRoYXQmIzM5O3MgZ29vZCB0byBrbm93LCBidXQgbGlrZWx5IHdvbiYjMzk7dCBnaXZlIG1lIGFueSBjbHVlcy4gU28sIGl0IGxvb2tzIGxpa2UgbXkgYXR0ZW50aW9uIHNob3VsZCBiZSBwcmltYXJpbHkgb24gYHJlcV9wYWdlX2FsbG9jX3dyaXRlYCBhbmQgYG1ha2VfYWxsb2NgIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBiZWhhdmlvciB1bmRlciB0aGlzIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uIEkgbmVlZCB0byBkaWcgaW50byB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiB0aG9zZSB0d28gZnVuY3Rpb25zLiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3MgYWN0dWFsbHkgZ29pbmcgb24gaW4gdGhvc2UgaW1wbGVtZW50YXRpb25zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI0IDEyOjE2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vcGFnZV9hbGxvY19ob2dnZXIuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIxMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDIxMDpcdFx0c3RydWN0IGRlbnRyeSAqbmV3X2FsbG9jX2RlbnRyeTtcbiAyMTE6XHRcdGludCByZXQ7XG4gMjEyOlx0XG4gMjEzOlx0XHRwYWdlID0gYWxsb2NfcGFnZXNfbm9kZV9ub3Byb2YocmVxLVx1MDAzZW5vZGVfaWR4LCBmbGFncywgcmVxLVx1MDAzZW9yZGVyKTtcbiAyMTQ6XHRcdGlmIChwYWdlKSB7XG4gMjE1Olx0XHRcdHBhID0ga21lbV9jYWNoZV9hbGxvYyhwYWdlX2FsbG9jX2NhY2hlLCBHRlBfS0VSTkVMKTtcbiAyMTY6XHRcdFx0aWYgKCFwYSkge1xuIDIxNzpcdFx0XHRcdHJldCA9IC1FTk9NRU07XG4gMjE4Olx0XHRcdFx0Z290byBmcmVlX3BhZ2VzO1xuIDIxOTpcdFx0XHR9XG4gMjIwOlx0XG4gMjIxOlx0XHRcdCphbGxvY19pZCA9IGF0b21pY19sb25nX2luY19yZXR1cm4oXHUwMDI2YWxsb2NzX2ZpbGVfc2VxKTtcbiAyMjI6XHRcdFx0cmV0ID0geGFfaW5zZXJ0KFx1MDAyNmFsbG9jc194YSwgKmFsbG9jX2lkLCBwYSwgR0ZQX0tFUk5FTCk7XG4gMjIzOlx0XHRcdGlmIChyZXQpXG4gMjI0Olx0XHRcdFx0Z290byBmcmVlX3BhZ2VfYWxsb2M7XG4gMjI1Olx0XG4gMjI2Olx0XHRcdHNucHJpbnRmKG5ld19hbGxvY19uYW1lLCBzaXplb2YobmV3X2FsbG9jX25hbWUpLCBcJiMzNDslbHVcJiMzNDssXG4gMjI3Olx0XHRcdFx0ICphbGxvY19pZCk7XG4gMjI4Olx0XG4gMjI5Olx0XHRcdG5ld19hbGxvY19kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKFxuIDIzMDpcdFx0XHRcdG5ld19hbGxvY19uYW1lLCAwNjQ0LCByZXEtXHUwMDNlcGFyZW50ZGlyLFxuIDIzMTpcdFx0XHRcdHBhLCBcdTAwMjZwYWdlX2FsbG9jX2ZvcHMpO1xuIDIzMjpcdFx0XHRpZiAoSVNfRVJSKG5ld19hbGxvY19kZW50cnkpKSB7XG4gMjMzOlx0XHRcdFx0cmV0ID0gUFRSX0VSUihuZXdfYWxsb2NfZGVudHJ5KTtcbiAyMzQ6XHRcdFx0XHRnb3RvIGVyYXNlX3hhX2VudHJ5O1xuIDIzNTpcdFx0XHR9XG4gMjM2Olx0XG4gMjM3Olx0XHRcdHBhLVx1MDAzZXJlcV9hbGxvYyA9IHJlcTtcbiAyMzg6XHRcdFx0cGEtXHUwMDNlcGFnZSA9IHBhZ2U7XG4gMjM5Olx0XHRcdHBhLVx1MDAzZWFsbG9jX2RlbnRyeSA9IG5ld19hbGxvY19kZW50cnk7XG4gMjQwOlx0XHR9IGVsc2Uge1xuIDI0MTpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiAyNDI6XHRcdH1cbiAyNDM6XHRcbiAyNDQ6XHRcdHJldHVybiAwO1xuIDI0NTpcdFxuIDI0NjpcdGVyYXNlX3hhX2VudHJ5OlxuIDI0NzpcdFx0eGFfZXJhc2UoXHUwMDI2YWxsb2NzX3hhLCAqYWxsb2NfaWQpO1xuIDI0ODpcdFxuIDI0OTpcdGZyZWVfcGFnZV9hbGxvYzpcbiAyNTA6XHRcdGttZW1fY2FjaGVfZnJlZShwYWdlX2FsbG9jX2NhY2hlLCBwYSk7XG4gMjUxOlx0XG4gMjUyOlx0ZnJlZV9wYWdlczpcbiAyNTM6XHRcdF9fZnJlZV9wYWdlcyhwYWdlLCBwYS1cdTAwM2VyZXFfYWxsb2MtXHUwMDNlb3JkZXIpO1xuIDI1NDpcdFxuIDI1NTpcdFx0cmV0dXJuIHJldDtcbiAyNTY6XHR9XG4gMjU3Olx0XG4gMjU4Olx0c3RhdGljIGludCBmcmVlX2FsbG9jX2hlbHBlcih1bnNpZ25lZCBsb25nIGFsbG9jX2lkKVxuIDI1OTpcdHtcbiAyNjA6XHRcdHN0cnVjdCBwYWdlX2FsbG9jICpwYTtcbiAyNjE6XHRcbiAyNjI6XHRcdHBhID0geGFfZXJhc2UoXHUwMDI2YWxsb2NzX3hhLCBhbGxvY19pZCk7XG4gMjYzOlx0XHRpZiAoIXBhKSB7XG4gMjY0Olx0XHRcdHByX2VycihcJiMzNDtUaGUgYWxsb2NfaWQgJWx1IHdhcyBub3QgZm91bmQhXCYjMzQ7LCBhbGxvY19pZCk7XG4gMjY1Olx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDI2NjpcdFx0fVxuIDI2NzpcdFxuIDI2ODpcdFx0X19mcmVlX3BhZ2VzKHBhLVx1MDAzZXBhZ2UsIHBhLVx1MDAzZXJlcV9hbGxvYy1cdTAwM2VvcmRlcik7XG4gMjY5Olx0XHRkZWJ1Z2ZzX3JlbW92ZShwYS1cdTAwM2VhbGxvY19kZW50cnkpO1xuIDI3MDpcdFx0a21lbV9jYWNoZV9mcmVlKHBhZ2VfYWxsb2NfY2FjaGUsIHBhKTtcbiAyNzE6XHRcbiAyNzI6XHRcdHJldHVybiAwO1xuIDI3MzpcdH1cbiAyNzQ6XHRcbiAyNzU6XHQvKipcbiAyNzY6XHQgKiByZXFfcGFnZV9hbGxvY193cml0ZSgpIC0gQWxsb2NhdGVzIHRoZSBwYWdlcyBvbiB0aGUgcmVxdWVzdGVkIG5vZGUsIHpvbmUsXG4gMjc3Olx0ICogb3JkZXIgYW5kIG1pZ3JhdGUgdHlwZS4gT25jZSB0aGUgYWxsb2NhdGlvbiBpcyBwZXJmb3JtZWQsIGEgZmlsZSBpcyBjcmVhdGVkXG4gMjc4Olx0ICogdG8gZnJlZSB0aGUgYWxsb2NhdGlvbiBsYXRlci5cbiAyNzk6XHQgKi9cbiAyODA6XHRzdGF0aWMgc3NpemVfdCByZXFfcGFnZV9hbGxvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsXG4gMjgxOlx0XHRcdFx0XHQgICAgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcylcbiAyODI6XHR7XG4gMjgzOlx0XHRzdHJ1Y3QgcmVxX2FsbG9jICpyZXEgPSBmaWxlLVx1MDAzZXByaXZhdGVfZGF0YTtcbiAyODQ6XHRcdHVuc2lnbmVkIGxvbmcgYWxsb2NfaWQ7XG4gMjg1Olx0XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzX2FsbG9jcztcbiAyODY6XHRcdHVuc2lnbmVkIGxvbmcgKmFsbG9jc19pZHM7XG4gMjg3Olx0XHRnZnBfdCBmbGFncyA9IDA7XG4gMjg4Olx0XHRpbnQgcmV0O1xuIDI4OTpcdFx0aW50IGk7XG4gMjkwOlx0XG4gMjkxOlx0XHRyZXQgPSBrc3RydG91bF9mcm9tX3VzZXIodWJ1ZiwgY250LCAxMCwgXHUwMDI2bnJfcGFnZXNfYWxsb2NzKTtcbiAyOTI6XHRcdGlmIChyZXQpXG4gMjkzOlx0XHRcdHJldHVybiByZXQ7XG4gMjk0Olx0XG4gMjk1Olx0XHRhbGxvY3NfaWRzID0ga21hbGxvY19hcnJheShucl9wYWdlc19hbGxvY3MsIHNpemVvZih1bnNpZ25lZCBsb25nKSxcbiAyOTY6XHRcdFx0XHRcdFx0R0ZQX0tFUk5FTCk7XG4gMjk3Olx0XHRpZiAoIWFsbG9jc19pZHMpXG4gMjk4Olx0XHRcdHJldHVybiAtRU5PTUVNO1xuIDI5OTpcdFxuIDMwMDpcdFx0c2V0X3pvbmVfdG9fYWxsb2NfZnJvbShyZXEtXHUwMDNlem9uZV9pZHgsIFx1MDAyNmZsYWdzKTtcbiAzMDE6XHRcdHNldF9taWdyYXRlX3R5cGVfdG9fYWxsb2NfZnJvbShyZXEtXHUwMDNlbWlncmF0ZV90eXBlLCBcdTAwMjZmbGFncyk7XG4gMzAyOlx0XG4gMzAzOlx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlc19hbGxvY3M7IGkmIzQzOyYjNDM7KSB7XG4gMzA0Olx0XHRcdHJldCA9IG1ha2VfYWxsb2MocmVxLCBmbGFncywgXHUwMDI2YWxsb2NfaWQpO1xuIDMwNTpcdFx0XHRpZiAocmV0KVxuIDMwNjpcdFx0XHRcdGdvdG8gZnJlZV9hbGxvY3M7XG4gMzA3Olx0XG4gMzA4Olx0XHRcdGFsbG9jc19pZHNbaV0gPSBhbGxvY19pZDtcbiAzMDk6XHRcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yNCAxMjoxNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTI1NgoJCQkJCQkJb3V0cHV0OiAxNDAKCQkJCQkJCXRob3VnaHRzOiAxNTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgUGFnZSBBbGxvY2F0b3IgVGVzdGluZyBDb2RlKioKCk9rYXksIHNvIHRoZSBjb2RlIGlzIGZ1bmN0aW9uYWwg4oCTIGdvb2Qgc3RhcnQhIEl0JiMzOTtzIGRlc2lnbmVkIHRvIHRlc3QgdGhlIHBhZ2UgYWxsb2NhdG9yLCBzcGVjaWZpY2FsbHkgYnkgcHJvdmlkaW5nIGEgZGVidWdmcyBpbnRlcmZhY2UuIFRoaXMgYWxsb3dzIGZvciBjb250cm9sbGVkIGFsbG9jYXRpb24gYW5kIGZyZWVpbmcgb2YgcGFnZXMsIHdpdGggc3BlY2lmaWMgcGFyYW1ldGVycy4gSG1tLCB0aGlzIGlzIGludGVyZXN0aW5nLi4uIEkgY2FuIHNlZSB0aGUgaW1tZWRpYXRlIGFwcGxpY2F0aW9uIGhlcmU6IGl0IGxvb2tzIGxpa2UgaXQmIzM5O2QgYmUgcHJldHR5IGRhcm4gdXNlZnVsIGZvciBmdXp6aW5nIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uIFRoYXQmIzM5O3MgYSB2YWx1YWJsZSBjYXBhYmlsaXR5IHRvIGhhdmUuIEkmIzM5O20gZ29pbmcgdG8gZmxhZyB0aGlzIGFzIHNvbWV0aGluZyBXb3J0aEZ1enppbmcuCgpJIG5lZWQgdG8gZm9jdXMgb24gYSBmZXcga2V5IHN5bWJvbHMgaGVyZTogYHJlcV9wYWdlX2FsbG9jX3dyaXRlYCwgYGZyZWVfcGFnZV9hbGxvY193cml0ZWAsIGBtYWtlX2FsbG9jYCwgYW5kIGBmcmVlX2FsbG9jX2hlbHBlcmAuIFRob3NlIGFyZSB0aGUgZW50cnkgcG9pbnRzIGFuZCBjb3JlIGZ1bmN0aW9ucyB0aGF0IEkmIzM5O2xsIG5lZWQgdG8gdW5kZXJzdGFuZCBpbiBkZXRhaWwgdG8gZnVsbHkgbGV2ZXJhZ2UgdGhpcyBmb3IgdGVzdGluZy4KCkFuZCBvZiBjb3Vyc2UsIEkgc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHRoZSBgUEFHRUFMTE9DX0hPR0dFUmAgY29uZmlnIGlzIGVuYWJsZWQgdG8gdXNlIHRoZSBkZWJ1Z2dpbmcgdG9vbC4KCkFscmlnaHQsIGxldCBtZSBqdXN0IGRvdWJsZS1jaGVjaywgYmVjYXVzZSBJJiMzOTttIGEgYml0IG9ic2Vzc2l2ZSBhYm91dCBiZWluZyB0aG9yb3VnaC4gQWgsIHllcywgdGhlIHBhdGNoIGlzIGEgbmV3IGZpbGUsIGBtbS9wYWdlX2FsbG9jX2hvZ2dlci5jYCwgd2hpY2ggbWFrZXMgc2Vuc2UuIEl0JiMzOTtzIGFkZGluZyB0aGF0IGRlYnVnZnMgaW50ZXJmYWNlLCB3aGljaCBjb25maXJtcyBteSBpbml0aWFsIGltcHJlc3Npb24uIFRoZSBmdW5jdGlvbmFsaXR5IGlzIGRlZmluaXRlbHkgdGhlcmUsIGFuZCBpdCYjMzk7cyByZWFjaGFibGUgdmlhIGRlYnVnZnMuCgpHcmVhdC4gTG9va3MgbGlrZSBJJiMzOTt2ZSBnb3QgZXZlcnl0aGluZyBJIG5lZWQuIFRpbWUgdG8gc2V0LXJlc3VsdHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjQgMTI6MTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1BBR0VBTExPQ19IT0dHRVImIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtyZXFfcGFnZV9hbGxvY193cml0ZSYjMzQ7LAogICAgJiMzNDtmcmVlX3BhZ2VfYWxsb2Nfd3JpdGUmIzM0OywKICAgICYjMzQ7bWFrZV9hbGxvYyYjMzQ7LAogICAgJiMzNDtmcmVlX2FsbG9jX2hlbHBlciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGRlYnVnZnMgaW50ZXJmYWNlIGZvciBhbGxvY2F0aW5nIHBhZ2VzIGZyb20gc3BlY2lmaWMgbm9kZXMsIHpvbmVzLCBtaWdyYXRlIHR5cGVzLCBhbmQgb3JkZXJzLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCB0ZXN0aW5nL2RlYnVnZ2luZyB0b29sIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgbWVtb3J5IHByZXNzdXJlIGFuZCB0ZXN0IHRoZSBjb3JlIHBhZ2UgYWxsb2NhdG9yIGFuZCBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uIEZ1enppbmcgaXQgaXMgdmFsdWFibGUgdG8gdW5jb3ZlciBwb3RlbnRpYWwgYnVncyBpbiBtZW1vcnkgbWFuYWdlbWVudCBvciBPT00gaGFuZGxpbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1BBR0VBTExPQ19IT0dHRVImIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtyZXFfcGFnZV9hbGxvY193cml0ZSYjMzQ7LAogICAgJiMzNDtmcmVlX3BhZ2VfYWxsb2Nfd3JpdGUmIzM0OywKICAgICYjMzQ7bWFrZV9hbGxvYyYjMzQ7LAogICAgJiMzNDtmcmVlX2FsbG9jX2hlbHBlciYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGRlYnVnZnMgaW50ZXJmYWNlIGZvciBhbGxvY2F0aW5nIHBhZ2VzIGZyb20gc3BlY2lmaWMgbm9kZXMsIHpvbmVzLCBtaWdyYXRlIHR5cGVzLCBhbmQgb3JkZXJzLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCB0ZXN0aW5nL2RlYnVnZ2luZyB0b29sIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgbWVtb3J5IHByZXNzdXJlIGFuZCB0ZXN0IHRoZSBjb3JlIHBhZ2UgYWxsb2NhdG9yIGFuZCBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uIEZ1enppbmcgaXQgaXMgdmFsdWFibGUgdG8gdW5jb3ZlciBwb3RlbnRpYWwgYnVncyBpbiBtZW1vcnkgbWFuYWdlbWVudCBvciBPT00gaGFuZGxpbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wNy0yNFQxMjoxNjoyMS4yOTI1NzE4NDVaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMjE2MzA5Mjc0NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJQQUdFQUxMT0NfSE9HR0VSXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwicmVxX3BhZ2VfYWxsb2Nfd3JpdGVcIixcbiAgICBcImZyZWVfcGFnZV9hbGxvY193cml0ZVwiLFxuICAgIFwibWFrZV9hbGxvY1wiLFxuICAgIFwiZnJlZV9hbGxvY19oZWxwZXJcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGRlYnVnZnMgaW50ZXJmYWNlIGZvciBhbGxvY2F0aW5nIHBhZ2VzIGZyb20gc3BlY2lmaWMgbm9kZXMsIHpvbmVzLCBtaWdyYXRlIHR5cGVzLCBhbmQgb3JkZXJzLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCB0ZXN0aW5nL2RlYnVnZ2luZyB0b29sIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgbWVtb3J5IHByZXNzdXJlIGFuZCB0ZXN0IHRoZSBjb3JlIHBhZ2UgYWxsb2NhdG9yIGFuZCBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uIEZ1enppbmcgaXQgaXMgdmFsdWFibGUgdG8gdW5jb3ZlciBwb3RlbnRpYWwgYnVncyBpbiBtZW1vcnkgbWFuYWdlbWVudCBvciBPT00gaGFuZGxpbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI0VDEyOjE2OjIxLjI5MjU3ODExNFoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjUxNTA5ODI1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgOGFiOTBiNTZmNzFiYjFkMTA3Mjc3NTdiOGY2OWM0OTFlYzg1NzZhMFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgRnJpIEp1bCAyNCAxMjoxNjoxOSAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9tbS9LY29uZmlnLmRlYnVnIGIvbW0vS2NvbmZpZy5kZWJ1Z1xcbmluZGV4IDc2MzhkNzViMjdkYjhjLi5jOGZjZWNkY2E2YWNhOSAxMDA2NDRcXG4tLS0gYS9tbS9LY29uZmlnLmRlYnVnXFxuKysrIGIvbW0vS2NvbmZpZy5kZWJ1Z1xcbkBAIC0zMDksMyArMzA5LDE1IEBAIGNvbmZpZyBQRVJfVk1BX0xPQ0tfU1RBVFNcXG4gXFx0ICBvdmVyaGVhZCBpbiB0aGUgcGFnZSBmYXVsdCBwYXRoLlxcbiBcXG4gXFx0ICBJZiBpbiBkb3VidCwgc2F5IE4uXFxuK1xcbitjb25maWcgUEFHRUFMTE9DX0hPR0dFUlxcbitcXHRib29sIFxcXCJBbGxvYyBwYWdlcyBmcm9tIGRpZmZlcmVudCBub2Rlcywgem9uZXMsIG1pZ3JhdGUgdHlwZXMgYW5kIG9yZGVyc1xcXCJcXG4rXFx0ZGVwZW5kcyBvbiBERUJVR19GU1xcbitcXHRoZWxwXFxuK1xcdCAgU2F5IFkgdG8gYWxsb2MgcGFnZXMgZnJvbSBkaWZmZXJlbnQgbm9kZXMsIHpvbmVzLCBtaWdyYXRlIHR5cGUgYW5kXFxuK1xcdCAgb3JkZXJzIHVzaW5nIHRoZSBkZWJ1ZyBmcyBmaWxlc3lzdGVtLiBUaGlzIGhlbHBzIHRvIGdlbmVyYXRlIG1lbW9yeVxcbitcXHQgIHByZXNzdXJlIGVhc2lseS4gVGhpcyBpcyB1c2VmdWwgdG8gZGVidWcgbWVtb3J5IHJlY2xhaW1zIGlzc3VlcyxcXG4rXFx0ICBPT00gdHJpZ2dlcnMsIHBhZ2UgbWlncmF0aW9uIGlzc3VlcywgZXRjLlxcbitcXG4rXFx0ICBJZiBpbiBkb3VidCwgc2F5IE4uXFxuK1xcbmRpZmYgLS1naXQgYS9tbS9NYWtlZmlsZSBiL21tL01ha2VmaWxlXFxuaW5kZXggMmQwNTcwYTE2ZTViZWIuLmI0OGYyYWM2ZWU4MDg5IDEwMDY0NFxcbi0tLSBhL21tL01ha2VmaWxlXFxuKysrIGIvbW0vTWFrZWZpbGVcXG5AQCAtMTMzLDYgKzEzMyw3IEBAIG9iai0kKENPTkZJR19JRExFX1BBR0VfVFJBQ0tJTkcpICs9IHBhZ2VfaWRsZS5vXFxuIG9iai0kKENPTkZJR19ERUJVR19QQUdFQUxMT0MpICs9IGRlYnVnX3BhZ2VfYWxsb2Mub1xcbiBvYmotJChDT05GSUdfREVCVUdfUEFHRV9SRUYpICs9IGRlYnVnX3BhZ2VfcmVmLm9cXG4gb2JqLSQoQ09ORklHX0RBTU9OKSArPSBkYW1vbi9cXG4rb2JqLSQoQ09ORklHX1BBR0VBTExPQ19IT0dHRVIpICs9IHBhZ2VfYWxsb2NfaG9nZ2VyLm9cXG4gb2JqLSQoQ09ORklHX0hBUkRFTkVEX1VTRVJDT1BZKSArPSB1c2VyY29weS5vXFxuIG9iai0kKENPTkZJR19QRVJDUFVfU1RBVFMpICs9IHBlcmNwdS1zdGF0cy5vXFxuIG9iai0kKENPTkZJR19aT05FX0RFVklDRSkgKz0gbWVtcmVtYXAub1xcbmRpZmYgLS1naXQgYS9tbS9wYWdlX2FsbG9jX2hvZ2dlci5jIGIvbW0vcGFnZV9hbGxvY19ob2dnZXIuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLmY1NTRiYmI0YWZhNzMwXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL21tL3BhZ2VfYWxsb2NfaG9nZ2VyLmNcXG5AQCAtMCwwICsxLDYxMSBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBQYWdlIGFsbG9jYXRvciBEZWJ1Z0ZTIEludGVyZmFjZVxcbisgKiBBdXRob3I6IEp1YW4gWWVzY2FzIFxcdTAwM2NqeWVzY2FzQGdvb2dsZS5jb21cXHUwMDNlXFxuKyAqXFxuKyAqIFRoaXMgbW9kdWxlIGFsbG93cyB0byBtYWtlIHBhZ2UgYWxsb2NzIHBlciBub2RlLCB6b25lLCBtaWdyYXRlIHR5cGVcXG4rICogYW5kIG9yZGVyIHVzaW5nIHRoZSBEZWJ1Z0ZTIGZpbGVzeXN0ZW0uXFxuKyAqXFxuKyAqIFdoZW4gdGhpcyBtb2R1bGUgaXMgaW5zdGFsbGVkIGFuZCB0aGUgZGVidWdmcyBpcyBtb3VudGVkLCB0aGUgXFxcIm1tXFxcIiBkaXJlY3RvcnlcXG4rIFxcXCIgd2lsbCBiZSBjcmVhdGVkIGluIFxcdTAwM2NkZWJ1Z2ZzIG1vdW50IHBvaW50XFx1MDAzZS9tbVxcXCIgZGlyZWN0b3J5LiBVbmRlciB0aGlzIGRpcmVjdG9yeSxcXG4rICogdGhlcmUgd2lsbCBiZSBzdWJkaXJzIHRvIHNlbGVjdCB0aGUgbm9kZXMsIHpvbmVzLCBvcmRlcnMgYW5kIG1pZ3JhdGUgdHlwZS5cXG4rICpcXG4rICogRm9yIGV4YW1wbGU6XFxuKyAqXFxuKyAqICAgICAgL3N5cy9rZXJuZWwvZGVidWcvbW0vXFxuKyAqICAgICAgfC0tIGZyZWVcXG4rICogICAgICBgLS0gbm9kZS0wXFxuKyAqICAgICAgICAgfC0tIHpvbmUtRE1BXFxuKyAqICAgICAgICAgfCAgIHwtLSBvcmRlci0wXFxuKyAqICAgICAgICAgfCAgIHwgICB8LS0gbWlncmF0ZS1IaWdoQXRvbWljXFxuKyAqICAgICAgICAgfCAgIHwgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xcbisgKiAgICAgICAgIHwgICB8ICAgfC0tIG1pZ3JhdGUtTW92YWJsZVxcbisgKiAgICAgICAgIHwgICB8ICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcXG4rICogICAgICAgICB8ICAgfCAgIHwtLSBtaWdyYXRlLVJlY2xhaW1hYmxlXFxuKyAqICAgICAgICAgfCAgIHwgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xcbisgKiAgICAgICAgIHwgICB8ICAgYC0tIG1pZ3JhdGUtVW5tb3ZhYmxlXFxuKyAqICAgICAgICAgfCAgIHwgICAgICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xcbisgKiAgICAgICAgIHwgICB8LS0gLi4uXFxuKyAqICAgICAgICAgfCAgIHxcXG4rICogICAgICAgICB8ICAgYC0tIG9yZGVyLTlcXG4rICogICAgICAgICB8ICAgICAgIHwtLSBtaWdyYXRlLUhpZ2hBdG9taWNcXG4rICogICAgICAgICB8ICAgICAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXFxuKyAqICAgICAgICAgfCAgICAgICB8LS0gbWlncmF0ZS1Nb3ZhYmxlXFxuKyAqICAgICAgICAgfCAgICAgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xcbisgKiAgICAgICAgIHwgICAgICAgfC0tIG1pZ3JhdGUtUmVjbGFpbWFibGVcXG4rICogICAgICAgICB8ICAgICAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXFxuKyAqICAgICAgICAgfCAgICAgICBgLS0gbWlncmF0ZS1Vbm1vdmFibGVcXG4rICogICAgICAgICB8ICAgICAgICAgICBgLS0gbnJfcGFnZXNfYWxsb2NzXFxuKyAqICAgICAgICAgYC0tIHpvbmUtTm9ybWFsXFxuKyAqICAgICAgICAgICAgIHwtLSBvcmRlci0wXFxuKyAqICAgICAgICAgICAgIHwgICB8LS0gbWlncmF0ZS1IaWdoQXRvbWljXFxuKyAqICAgICAgICAgICAgIHwgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xcbisgKiAgICAgICAgICAgICB8ICAgfC0tIG1pZ3JhdGUtTW92YWJsZVxcbisgKiAgICAgICAgICAgICB8ICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcXG4rICogICAgICAgICAgICAgfCAgIHwtLSBtaWdyYXRlLVJlY2xhaW1hYmxlXFxuKyAqICAgICAgICAgICAgIHwgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xcbisgKiAgICAgICAgICAgICB8ICAgYC0tIG1pZ3JhdGUtVW5tb3ZhYmxlXFxuKyAqICAgICAgICAgICAgIHwgICAgICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xcbisgKiAgICAgICAgICAgICB8LS0gLi4uLlxcbisgKiAgICAgICAgICAgICB8XFxuKyAqICAgICAgICAgICAgIGAtLSBvcmRlci05XFxuKyAqICAgICAgICAgICAgICAgICB8LS0gbWlncmF0ZS1IaWdoQXRvbWljXFxuKyAqICAgICAgICAgICAgICAgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xcbisgKiAgICAgICAgICAgICAgICAgfC0tIG1pZ3JhdGUtTW92YWJsZVxcbisgKiAgICAgICAgICAgICAgICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcXG4rICogICAgICAgICAgICAgICAgIHwtLSBtaWdyYXRlLVJlY2xhaW1hYmxlXFxuKyAqICAgICAgICAgICAgICAgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xcbisgKiAgICAgICAgICAgICAgICAgYC0tIG1pZ3JhdGUtVW5tb3ZhYmxlXFxuKyAqICAgICAgICAgICAgICAgICAgICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xcbisgKlxcbisgKiBVc2FnZTpcXG4rICpcXG4rICogMS4gVG8gdHJpZ2dlciB0aGUgYWxsb2NhdGlvbiwgbmF2aWdhdGUgdG8gdGhlIGRlYnVnZnMgcGF0aCBjb3JyZXNwb25kaW5nXFxuKyAqICAgIHRvIHlvdXIgdGFyZ2V0IG5vZGUsIG1lbW9yeSB6b25lLCBhbGxvY2F0aW9uIG9yZGVyLCBhbmQgbWlncmF0aW9uIHR5cGUsXFxuKyAqICAgIHRoZW4gd3JpdGUgdGhlIHJlcXVlc3RlZCBhbGxvY2F0aW9uIGNvdW50IHRvIG5yX3BhZ2VzX2FsbG9jcy5cXG4rICpcXG4rICogICAgRm9yIGV4YW1wbGUsIHRvIG1ha2UgMyBhbGxvY3Mgb2Ygb3JkZXIgOSwgTWlncmF0ZSBUeXBlIE1vdmFibGUsXFxuKyAqICAgIFpvbmUgTm9ybWFsIGFuZCBOb2RlIDAsIHJ1bjpcXG4rICpcXG4rICogICAgJCBlY2hvIDMgXFx1MDAzZSAvc3lzL2tlcm5lbC9kZWJ1Zy9tbS9ub2RlLTAvem9uZS1Ob3JtYWwvb3JkZXItOS9taWdyYXRlLU1vdmFibGUvbnJfcGFnZXNfYWxsb2NzXFxuKyAqXFxuKyAqIDIuIEZvciBlYWNoIGFsbG9jYXRpb24gY3JlYXRlZCwgYSBjb3JyZXNwb25kaW5nIGZpbGUgbmFtZWQgc2VxdWVudGlhbGx5XFxuKyAqICAgICgxLCAyLCBuKSB3aWxsIGFwcGVhciBpbiB0aGF0IGRpcmVjdG9yeS5cXG4rICpcXG4rICogICAgJCBscyAvc3lzL2tlcm5lbC9kZWJ1Zy9tbS9ub2RlLTAvem9uZS1Ob3JtYWwvb3JkZXItOS9taWdyYXRlLU1vdmFibGUvXFxuKyAqICAgIDEgICAyICAgMyAgbnJfcGFnZXNfYWxsb2NzXFxuKyAqXFxuKyAqIDMuIFRvIGZyZWUgdGhlIGFsbG9jYXRpb24sIHdyaXRlIHRoZSBhbGxvY2F0aW9uIGZpbGUgbmFtZSBpbiAvc3lzL2tlcm5lbC9kZWJ1Zy9tbS9mcmVlLlxcbisgKiAgICBGb3IgZXhhbXBsZSwgdG8gcmVsZWFzZSB0aGUgMm5kIGFsbG9jYXRpb24gcnVuOlxcbisgKlxcbisgKiAgICAkIGVjaG8gMiBcXHUwMDNlIC9zeXMva2VybmVsL2RlYnVnL21tL2ZyZWVcXG4rICovXFxuK1xcbisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FIFxcXCI6IFxcXCIgZm10XFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYXRvbWljLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9lcnJuby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvZGVidWdmcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvZ2ZwLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9nZnBfdHlwZXMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2hpZ2htZW0uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2tlcm5lbC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbW16b25lLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9tb2R1bGUuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L25vZGVtYXNrLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9wcmludGsuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3hhcnJheS5oXFx1MDAzZVxcbitcXG4rc3RydWN0IGRlbnRyeSAqbW1kaXI7XFxuK1xcbisvKipcXG4rICogYXRvbWljX2xvbmdfdCBhbGxvY3NfZmlsZV9zZXEgLSBSZXByZXNlbnRzIHRoZSBuYW1pbmcgc2VxdWVuY2UgdXNlZCBmb3JcXG4rICogYWxsb2NhdGlvbiBmaWxlcy5cXG4rICovXFxuK2F0b21pY19sb25nX3QgYWxsb2NzX2ZpbGVfc2VxID0gQVRPTUlDX0lOSVQoMCk7XFxuK1xcbisvKipcXG4rICogYWxsb2NzX3hhIC0gUmVwcmVzZW50IHRoZSB4YXJyYXkgdGhhdCBjb250YWlucyB0aGUgYWN0dWFsIGFsbG9jYXRpb25zIHBlcmZvcm1cXG4rICogYnkgdGhpcyBkcml2ZXIuXFxuKyAqL1xcbitzdGF0aWMgREVGSU5FX1hBUlJBWShhbGxvY3NfeGEpO1xcbitcXG4rLyoqXFxuKyAqIHN0cnVjdCByZXFfYWxsb2MgLSBSZXByZXNlbnRzIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvblxcbisgKiBAbm9kZV9pZHg6IFRoZSBOb2RlIGluZGV4IHRvIGFsbG9jYXRlIGZyb20uXFxuKyAqIEB6b25lX2lkeDogVGhlIFpvbmUgaW5kZXggdG8gYWxsb2NhdGUgZnJvbS5cXG4rICogQG9yZGVyOiBUaGUgT3JkZXIgb2YgcGFnZXMgdG8gYWxsb2NhdGUuXFxuKyAqIEBtaWdyYXRlX3R5cGU6IFRoZSBNaWdyYXRlIHR5cGUgdG8gYWxsb2NhdGUgZnJvbS5cXG4rICogQHBhcmVudGRpcjogVGhlIHBhcmVudCBkaXIgd2hlcmUgdGhlIGZpbGUgcmVwcmVzZW50aW5nIHRoZSBhbGxvYyB3YXMgY3JlYXRlZC5cXG4rICovXFxuK3N0cnVjdCByZXFfYWxsb2Mge1xcbitcXHRpbnQgbm9kZV9pZHg7XFxuK1xcdGludCB6b25lX2lkeDtcXG4rXFx0aW50IG9yZGVyO1xcbitcXHRpbnQgbWlncmF0ZV90eXBlO1xcbitcXHRzdHJ1Y3QgZGVudHJ5ICpwYXJlbnRkaXI7XFxuK307XFxuK1xcbisvKlxcbisgKiBzdHJ1Y3QgcGFnZV9hbGxvYyAtIFJlcHJlc2VudHMgdGhlIHBhZ2UgYWxsb2NhdGlvbi5cXG4rICogQHBhZ2U6IFRoZSBwb2ludGVyIHRvIHRoZSBwYWdlKHMpIGFsbG9jYXRlZC5cXG4rICogQHJlcV9hbGxvYzogVGhlIGRldGFpbHMgb2YgdGhlIGFsbG9jYXRpb24uXFxuKyAqIEBhbGxvY19kZW50cnk6IFRoZSBwb2ludGVyIHRvIHRoZSBmaWxlIHRoYXQgcmVwcmVzZW50cyB0aGUgYWxsb2NhdGlvbi5cXG4rICovXFxuK3N0cnVjdCBwYWdlX2FsbG9jIHtcXG4rXFx0c3RydWN0IHBhZ2UgKnBhZ2U7XFxuK1xcdHN0cnVjdCByZXFfYWxsb2MgKnJlcV9hbGxvYztcXG4rXFx0c3RydWN0IGRlbnRyeSAqYWxsb2NfZGVudHJ5O1xcbit9O1xcbitcXG4rc3RydWN0IGttZW1fY2FjaGUgKnJlcV9hbGxvY19jYWNoZTtcXG4rc3RydWN0IGttZW1fY2FjaGUgKnBhZ2VfYWxsb2NfY2FjaGU7XFxuK1xcbitpbmxpbmUgdm9pZCBzZXRfem9uZV90b19hbGxvY19mcm9tKGludCB6b25lX2lkeCwgZ2ZwX3QgKmZsYWdzX3B0cilcXG4re1xcbitcXHRzd2l0Y2ggKHpvbmVfaWR4KSB7XFxuKyNpZmRlZiBDT05GSUdfWk9ORV9ETUFcXG4rXFx0Y2FzZSBaT05FX0RNQTpcXG4rXFx0XFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9ETUE7XFxuK1xcdFxcdGJyZWFrO1xcbisjZW5kaWZcXG4rI2lmZGVmIENPTkZJR19aT05FX0RNQTMyXFxuK1xcdGNhc2UgWk9ORV9ETUEzMjpcXG4rXFx0XFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9ETUEzMjtcXG4rXFx0XFx0YnJlYWs7XFxuKyNlbmRpZlxcbisjaWZkZWYgQ09ORklHX0hJR0hNRU1cXG4rXFx0Y2FzZSBaT05FX0hJR0hNRU06XFxuK1xcdFxcdCpmbGFnc19wdHIgfD0gX19HRlBfSElHSE1FTTtcXG4rXFx0XFx0YnJlYWs7XFxuKyNlbmRpZlxcbitcXHRjYXNlIFpPTkVfTU9WQUJMRTpcXG4rXFx0XFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9NT1ZBQkxFO1xcbitcXHRcXHRicmVhaztcXG4rXFx0Y2FzZSBaT05FX05PUk1BTDpcXG4rXFx0ZGVmYXVsdDpcXG4rXFx0XFx0KmZsYWdzX3B0ciB8PSAwO1xcbitcXHRcXHRicmVhaztcXG4rXFx0fVxcbit9XFxuK1xcbitpbmxpbmUgdm9pZCBzZXRfbWlncmF0ZV90eXBlX3RvX2FsbG9jX2Zyb20oaW50IG1pZ3JhdGVfdHlwZSwgZ2ZwX3QgKmZsYWdzX3B0cilcXG4re1xcbitcXHRzd2l0Y2ggKG1pZ3JhdGVfdHlwZSkge1xcbitcXHRjYXNlIE1JR1JBVEVfVU5NT1ZBQkxFOlxcbitcXHRcXHQqZmxhZ3NfcHRyIFxcdTAwMjY9IH4oX19HRlBfUkVDTEFJTUFCTEUgfCBfX0dGUF9NT1ZBQkxFKTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgTUlHUkFURV9SRUNMQUlNQUJMRTpcXG4rXFx0XFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9SRUNMQUlNQUJMRTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgTUlHUkFURV9ISUdIQVRPTUlDOlxcbitcXHRcXHQqZmxhZ3NfcHRyIHw9IF9fR0ZQX0hJR0g7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRjYXNlIE1JR1JBVEVfTU9WQUJMRTogZGVmYXVsdDpcXG4rXFx0XFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9NT1ZBQkxFO1xcbitcXHRcXHRicmVhaztcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgc3NpemVfdCBwYWdlX2FsbG9jX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1YnVmLFxcbitcXHRcXHRcXHRcXHQgICAgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKVxcbit7XFxuK1xcdC8qICBXaGljaCBpbmZvcm1hdGlvbiBzaG91bGQgYmUgcHJpbnQgYWJvdXQgdGhlIHBhZ2Ugb3IgYWxsb2NhdGlvbj8gKi9cXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBhZ2VfYWxsb2NfZm9wcyA9IHtcXG4rXFx0Lm93bmVyID0gVEhJU19NT0RVTEUsXFxuK1xcdC5vcGVuID0gc2ltcGxlX29wZW4sXFxuK1xcdC5yZWFkID0gcGFnZV9hbGxvY19yZWFkLFxcbit9O1xcbitcXG4rc3RhdGljIGludCBtYWtlX2FsbG9jKHN0cnVjdCByZXFfYWxsb2MgKnJlcSxcXG4rXFx0XFx0XFx0ICAgIGdmcF90IGZsYWdzLCB1bnNpZ25lZCBsb25nICphbGxvY19pZClcXG4re1xcbitcXHRzdHJ1Y3QgcGFnZV9hbGxvYyAqcGE7XFxuK1xcdHN0cnVjdCBwYWdlICpwYWdlO1xcbitcXHRjaGFyIG5ld19hbGxvY19uYW1lWzEyXTtcXG4rXFx0c3RydWN0IGRlbnRyeSAqbmV3X2FsbG9jX2RlbnRyeTtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHBhZ2UgPSBhbGxvY19wYWdlc19ub2RlX25vcHJvZihyZXEtXFx1MDAzZW5vZGVfaWR4LCBmbGFncywgcmVxLVxcdTAwM2VvcmRlcik7XFxuK1xcdGlmIChwYWdlKSB7XFxuK1xcdFxcdHBhID0ga21lbV9jYWNoZV9hbGxvYyhwYWdlX2FsbG9jX2NhY2hlLCBHRlBfS0VSTkVMKTtcXG4rXFx0XFx0aWYgKCFwYSkge1xcbitcXHRcXHRcXHRyZXQgPSAtRU5PTUVNO1xcbitcXHRcXHRcXHRnb3RvIGZyZWVfcGFnZXM7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdCphbGxvY19pZCA9IGF0b21pY19sb25nX2luY19yZXR1cm4oXFx1MDAyNmFsbG9jc19maWxlX3NlcSk7XFxuK1xcdFxcdHJldCA9IHhhX2luc2VydChcXHUwMDI2YWxsb2NzX3hhLCAqYWxsb2NfaWQsIHBhLCBHRlBfS0VSTkVMKTtcXG4rXFx0XFx0aWYgKHJldClcXG4rXFx0XFx0XFx0Z290byBmcmVlX3BhZ2VfYWxsb2M7XFxuK1xcbitcXHRcXHRzbnByaW50ZihuZXdfYWxsb2NfbmFtZSwgc2l6ZW9mKG5ld19hbGxvY19uYW1lKSwgXFxcIiVsdVxcXCIsXFxuK1xcdFxcdFxcdCAqYWxsb2NfaWQpO1xcbitcXG4rXFx0XFx0bmV3X2FsbG9jX2RlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoXFxuK1xcdFxcdFxcdG5ld19hbGxvY19uYW1lLCAwNjQ0LCByZXEtXFx1MDAzZXBhcmVudGRpcixcXG4rXFx0XFx0XFx0cGEsIFxcdTAwMjZwYWdlX2FsbG9jX2ZvcHMpO1xcbitcXHRcXHRpZiAoSVNfRVJSKG5ld19hbGxvY19kZW50cnkpKSB7XFxuK1xcdFxcdFxcdHJldCA9IFBUUl9FUlIobmV3X2FsbG9jX2RlbnRyeSk7XFxuK1xcdFxcdFxcdGdvdG8gZXJhc2VfeGFfZW50cnk7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdHBhLVxcdTAwM2VyZXFfYWxsb2MgPSByZXE7XFxuK1xcdFxcdHBhLVxcdTAwM2VwYWdlID0gcGFnZTtcXG4rXFx0XFx0cGEtXFx1MDAzZWFsbG9jX2RlbnRyeSA9IG5ld19hbGxvY19kZW50cnk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rXFxuK2VyYXNlX3hhX2VudHJ5OlxcbitcXHR4YV9lcmFzZShcXHUwMDI2YWxsb2NzX3hhLCAqYWxsb2NfaWQpO1xcbitcXG4rZnJlZV9wYWdlX2FsbG9jOlxcbitcXHRrbWVtX2NhY2hlX2ZyZWUocGFnZV9hbGxvY19jYWNoZSwgcGEpO1xcbitcXG4rZnJlZV9wYWdlczpcXG4rXFx0X19mcmVlX3BhZ2VzKHBhZ2UsIHBhLVxcdTAwM2VyZXFfYWxsb2MtXFx1MDAzZW9yZGVyKTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgZnJlZV9hbGxvY19oZWxwZXIodW5zaWduZWQgbG9uZyBhbGxvY19pZClcXG4re1xcbitcXHRzdHJ1Y3QgcGFnZV9hbGxvYyAqcGE7XFxuK1xcbitcXHRwYSA9IHhhX2VyYXNlKFxcdTAwMjZhbGxvY3NfeGEsIGFsbG9jX2lkKTtcXG4rXFx0aWYgKCFwYSkge1xcbitcXHRcXHRwcl9lcnIoXFxcIlRoZSBhbGxvY19pZCAlbHUgd2FzIG5vdCBmb3VuZCFcXFwiLCBhbGxvY19pZCk7XFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHR9XFxuK1xcbitcXHRfX2ZyZWVfcGFnZXMocGEtXFx1MDAzZXBhZ2UsIHBhLVxcdTAwM2VyZXFfYWxsb2MtXFx1MDAzZW9yZGVyKTtcXG4rXFx0ZGVidWdmc19yZW1vdmUocGEtXFx1MDAzZWFsbG9jX2RlbnRyeSk7XFxuK1xcdGttZW1fY2FjaGVfZnJlZShwYWdlX2FsbG9jX2NhY2hlLCBwYSk7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJlcV9wYWdlX2FsbG9jX3dyaXRlKCkgLSBBbGxvY2F0ZXMgdGhlIHBhZ2VzIG9uIHRoZSByZXF1ZXN0ZWQgbm9kZSwgem9uZSxcXG4rICogb3JkZXIgYW5kIG1pZ3JhdGUgdHlwZS4gT25jZSB0aGUgYWxsb2NhdGlvbiBpcyBwZXJmb3JtZWQsIGEgZmlsZSBpcyBjcmVhdGVkXFxuKyAqIHRvIGZyZWUgdGhlIGFsbG9jYXRpb24gbGF0ZXIuXFxuKyAqL1xcbitzdGF0aWMgc3NpemVfdCByZXFfcGFnZV9hbGxvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsXFxuK1xcdFxcdFxcdFxcdCAgICAgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKVxcbit7XFxuK1xcdHN0cnVjdCByZXFfYWxsb2MgKnJlcSA9IGZpbGUtXFx1MDAzZXByaXZhdGVfZGF0YTtcXG4rXFx0dW5zaWduZWQgbG9uZyBhbGxvY19pZDtcXG4rXFx0dW5zaWduZWQgbG9uZyBucl9wYWdlc19hbGxvY3M7XFxuK1xcdHVuc2lnbmVkIGxvbmcgKmFsbG9jc19pZHM7XFxuK1xcdGdmcF90IGZsYWdzID0gMDtcXG4rXFx0aW50IHJldDtcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRyZXQgPSBrc3RydG91bF9mcm9tX3VzZXIodWJ1ZiwgY250LCAxMCwgXFx1MDAyNm5yX3BhZ2VzX2FsbG9jcyk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRhbGxvY3NfaWRzID0ga21hbGxvY19hcnJheShucl9wYWdlc19hbGxvY3MsIHNpemVvZih1bnNpZ25lZCBsb25nKSxcXG4rXFx0XFx0XFx0XFx0XFx0R0ZQX0tFUk5FTCk7XFxuK1xcdGlmICghYWxsb2NzX2lkcylcXG4rXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcbitcXHRzZXRfem9uZV90b19hbGxvY19mcm9tKHJlcS1cXHUwMDNlem9uZV9pZHgsIFxcdTAwMjZmbGFncyk7XFxuK1xcdHNldF9taWdyYXRlX3R5cGVfdG9fYWxsb2NfZnJvbShyZXEtXFx1MDAzZW1pZ3JhdGVfdHlwZSwgXFx1MDAyNmZsYWdzKTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9wYWdlc19hbGxvY3M7IGkrKykge1xcbitcXHRcXHRyZXQgPSBtYWtlX2FsbG9jKHJlcSwgZmxhZ3MsIFxcdTAwMjZhbGxvY19pZCk7XFxuK1xcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdGdvdG8gZnJlZV9hbGxvY3M7XFxuK1xcbitcXHRcXHRhbGxvY3NfaWRzW2ldID0gYWxsb2NfaWQ7XFxuK1xcdH1cXG4rXFxuK1xcdGtmcmVlKGFsbG9jc19pZHMpO1xcbitcXG4rXFx0cmV0dXJuIGNudDtcXG4rXFxuK2ZyZWVfYWxsb2NzOlxcbitcXHQvKiBGcmVlIGFsbCB0aGUgcGFnZXMgcHJldmlvdXNseSBhbGxvY2F0ZWQuICovXFxuK1xcdGZvciAoaW50IGogPSAwOyBqIFxcdTAwM2MgaTsgaisrKSB7XFxuK1xcdFxcdGludCByZXQyID0gZnJlZV9hbGxvY19oZWxwZXIoYWxsb2NzX2lkc1tqXSk7XFxuK1xcbitcXHRcXHRpZiAocmV0MilcXG4rXFx0XFx0XFx0cHJfZXJyKFxcXCJVbmFibGUgdG8gZnJlZSBwYWdlcyBhc3NvY2lhdGVkIHdpdGggZmlsZSAlbHVcXFwiLFxcbitcXHRcXHRcXHQgICAgICAgYWxsb2NzX2lkc1tqXSk7XFxuK1xcdH1cXG4rXFxuK1xcdGtmcmVlKGFsbG9jc19pZHMpO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVxX3BhZ2VfYWxsb2NfZm9wcyA9IHtcXG4rXFx0Lm93bmVyID0gVEhJU19NT0RVTEUsXFxuK1xcdC5vcGVuID0gc2ltcGxlX29wZW4sXFxuK1xcdC53cml0ZSA9IHJlcV9wYWdlX2FsbG9jX3dyaXRlLFxcbit9O1xcbitcXG4rLyoqXFxuKyAqIGZyZWVfcGFnZV9hbGxvY193cml0ZSgpIC0gZnJlZSB0aGUgcHJldmlvdXNseSBhbGxvY2F0ZWQgcGFnZXMuXFxuKyAqIEBmaWxlOiBGaWxlIHdoZXJlIHRoZSB1c2VyIGlzIHdyaXRpbmcuXFxuKyAqIEB1YnVmOiBDb250YWlucyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0aGUgdXNlciB3YW50cyB0byBkZWxldGUgYW5kIGhhdmUgdGhlXFxuKyAqICAgICAgIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmaWxlIGZyZWVkLlxcbisgKiBAY250OiBTaXplIG9mIEB1YnVmLlxcbisgKiBAcHBvczogQ3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZmlsZS5cXG4rICovXFxuK3N0YXRpYyBzc2l6ZV90IGZyZWVfcGFnZV9hbGxvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsIHNpemVfdCBjbnQsXFxuK1xcdFxcdFxcdFxcdCAgICAgIGxvZmZfdCAqcHBvcylcXG4re1xcbitcXHRpbnQgcmV0O1xcbitcXHR1bnNpZ25lZCBsb25nIGFsbG9jX2lkO1xcbitcXG4rXFx0cmV0ID0ga3N0cnRvdWxfZnJvbV91c2VyKHVidWYsIGNudCwgMTAsIFxcdTAwMjZhbGxvY19pZCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBmcmVlX2FsbG9jX2hlbHBlcihhbGxvY19pZCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXR1cm4gY250O1xcbit9XFxuK1xcbitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmcmVlX3BhZ2VfYWxsb2NfZm9wcyA9IHtcXG4rXFx0Lm93bmVyID0gVEhJU19NT0RVTEUsXFxuK1xcdC53cml0ZSA9IGZyZWVfcGFnZV9hbGxvY193cml0ZSxcXG4rfTtcXG4rXFxuKy8qKlxcbisgKiBjcmVhdGVfbnJfcGFnZXNfYWxsb2NzX2ZpbGUoKSAtIENyZWF0ZXMgdGhlIGZpbGUgXFxcIm5yX3BhZ2VzX2FsbG9jc1xcXCIuXFxuKyAqXFxuKyAqIFRoZSBcXFwibnJfcGFnZXNfYWxsb2NzXFxcIiBmaWxlIHdpbGwgYmUgdXNlZCB0byB3cml0ZSB0aGUgbnVtYmVyIG9mIGFsbG9jYXRpb25zXFxuKyAqIHRoYXQgd2lsbCBiZSBwZXJmb3JtZWQuIFdoZW4gdGhlIGFsbG9jYXRpb25zIGFyZSBwZXJmb3JtZWQsIGEgbmV3IGZpbGUgZm9yXFxuKyAqIGVhY2ggYWxsb2NhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgaW4gQG1pZ3JhdGVkaXIuXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBjcmVhdGVfbnJfcGFnZXNfYWxsb2NzX2ZpbGUoc3RydWN0IGRlbnRyeSAqbWlncmF0ZWRpcixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgaW50IG5vZGVfaWR4LCBpbnQgem9uZV9pZHgsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIGludCBvcmRlciwgaW50IG10eXBlKVxcbit7XFxuK1xcdHN0cnVjdCByZXFfYWxsb2MgKnJlcTtcXG4rXFx0c3RydWN0IGRlbnRyeSAqbnJfcGFnZXM7XFxuK1xcbitcXHRyZXEgPSBrbWVtX2NhY2hlX2FsbG9jKHJlcV9hbGxvY19jYWNoZSwgR0ZQX0tFUk5FTCk7XFxuK1xcdGlmICghcmVxKSB7XFxuK1xcdFxcdHByX2VycihcXFwiRmFpbGVkIHRvIGNyZWF0ZSBucl9wYWdlc19hbGxvY3NfaW5mb1xcXCIpO1xcbitcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFx0fVxcbitcXG4rXFx0cmVxLVxcdTAwM2Vub2RlX2lkeCA9IG5vZGVfaWR4O1xcbitcXHRyZXEtXFx1MDAzZXpvbmVfaWR4ID0gem9uZV9pZHg7XFxuK1xcdHJlcS1cXHUwMDNlb3JkZXIgPSBvcmRlcjtcXG4rXFx0cmVxLVxcdTAwM2VtaWdyYXRlX3R5cGUgPSBtdHlwZTtcXG4rXFx0cmVxLVxcdTAwM2VwYXJlbnRkaXIgPSBtaWdyYXRlZGlyO1xcbitcXG4rXFx0bnJfcGFnZXMgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKFxcXCJucl9wYWdlc19hbGxvY3NcXFwiLCAwNjQ0LCBtaWdyYXRlZGlyLCByZXEsXFxuK1xcdFxcdFxcdFxcdCAgICAgICBcXHUwMDI2cmVxX3BhZ2VfYWxsb2NfZm9wcyk7XFxuK1xcdGlmIChJU19FUlIobnJfcGFnZXMpKVxcbitcXHRcXHRyZXR1cm4gUFRSX0VSUihucl9wYWdlcyk7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGNyZWF0ZV9taWdyYXRlX3R5cGVfc3ViZGlycygpIC0gQ3JlYXRlcyBhIGRpcmVjdG9yeSBmb3IgZWFjaCBtaWdyYXRlIHR5cGVcXG4rICogaW5zaWRlIHRoZSBvcmRlciBkaXJlY3RvcnkuIE9uY2UgdGhlIG1pZ3JhdGUgdHlwZSBkaXJlY3RvcnkgaXMgY3JlYXRlZCwgaXRcXG4rICogY3JlYXRlcyB0aGUgXFxcIm5yX2FsbG9jc1xcXCIgZmlsZSBhbmQgdGhlIFxcXCJmcmVlXFxcIiBmaWxlLlxcbisgKi9cXG4rc3RhdGljIGlubGluZSBpbnQgY3JlYXRlX21pZ3JhdGVfdHlwZV9zdWJkaXJzKHN0cnVjdCBkZW50cnkgKm9yZGVyZGlyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBpbnQgbm9kZV9pZHgsIGludCB6b25lX2lkeCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgaW50IG9yZGVyKVxcbit7XFxuK1xcdHN0cnVjdCBkZW50cnkgKm1pZ3JhdGVkaXI7XFxuK1xcdGNoYXIgZGlybmFtZVsyNF07XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRmb3IgKGludCBtdHlwZSA9IDA7IG10eXBlIFxcdTAwM2MgTUlHUkFURV9UWVBFUzsgbXR5cGUrKykge1xcbisjaWZkZWYgQ09ORklHX0NNQVxcbitcXHRcXHRpZiAobXR5cGUgPT0gTUlHUkFURV9DTUEpIC8qIENNQSBhbGxvY3MgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0Ki9cXG4rXFx0XFx0XFx0Y29udGludWU7XFxuKyNlbmRpZlxcbisjaWZkZWYgQ09ORklHX01FTU9SWV9JU09MQVRJT05cXG4rXFx0XFx0aWYgKG10eXBlID09IE1JR1JBVEVfSVNPTEFURSkgLyogY2FuJ3QgYWxsb2NhdGUgZnJvbSBoZXJlICovXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbisjZW5kaWZcXG4rXFx0XFx0c25wcmludGYoZGlybmFtZSwgc2l6ZW9mKGRpcm5hbWUpLCBcXFwibWlncmF0ZS0lc1xcXCIsXFxuK1xcdFxcdFxcdCBtaWdyYXRldHlwZV9uYW1lc1ttdHlwZV0pO1xcbitcXHRcXHRtaWdyYXRlZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKGRpcm5hbWUsIG9yZGVyZGlyKTtcXG4rXFx0XFx0aWYgKElTX0VSUihtaWdyYXRlZGlyKSlcXG4rXFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIobWlncmF0ZWRpcik7XFxuK1xcbitcXHRcXHRyZXQgPSBjcmVhdGVfbnJfcGFnZXNfYWxsb2NzX2ZpbGUobWlncmF0ZWRpciwgbm9kZV9pZHgsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgem9uZV9pZHgsIG9yZGVyLCBtdHlwZSk7XFxuK1xcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKipcXG4rICogY3JlYXRlX3BhZ2Vfb3JkZXJzX3N1YmRpcnMoKSAtIENyZWF0ZXMgYSBkaXJlY3RvcnkgZm9yIGVhY2ggcGFnZSBvcmRlciBpbnNpZGVcXG4rICogdGhlIHpvbmUgZGlyZWN0b3J5LiBPbmNlIHRoYXQgdGhlIHBhZ2Ugb3JkZXIgZGlyZWN0b3J5IGlzIGNyZWF0ZWQsIGl0IGNyZWF0ZXNcXG4rICogYSBkaXJlY3RvcnkgZm9yIGVhY2ggbWlncmF0ZSB0eXBlLlxcbisgKi9cXG4rc3RhdGljIGlubGluZSBpbnQgY3JlYXRlX3BhZ2Vfb3JkZXJzX3N1YmRpcnMoc3RydWN0IGRlbnRyeSAqem9uZWRpcixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICBpbnQgbm9kZV9pZHgsIGludCB6b25lX2lkeCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3Qgem9uZSAqem9uZSlcXG4re1xcbitcXHRzdHJ1Y3QgZGVudHJ5ICpvcmRlcmRpcjtcXG4rXFx0Y2hhciBkaXJuYW1lWzEyXTtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdGZvciAoaW50IG9yZGVyID0gMDsgb3JkZXIgXFx1MDAzYyBOUl9QQUdFX09SREVSUzsgb3JkZXIrKykge1xcbitcXHRcXHRzbnByaW50ZihkaXJuYW1lLCBzaXplb2YoZGlybmFtZSksIFxcXCJvcmRlci0lZFxcXCIsIG9yZGVyKTtcXG4rXFx0XFx0b3JkZXJkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoZGlybmFtZSwgem9uZWRpcik7XFxuK1xcdFxcdGlmIChJU19FUlIob3JkZXJkaXIpKVxcbitcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUihvcmRlcmRpcik7XFxuK1xcbitcXHRcXHRyZXQgPSBjcmVhdGVfbWlncmF0ZV90eXBlX3N1YmRpcnMob3JkZXJkaXIsIG5vZGVfaWR4LCB6b25lX2lkeCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICBvcmRlcik7XFxuK1xcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKipcXG4rICogY3JlYXRlX3pvbmVzX3N1YmRpcnMoKSAtIENyZWF0ZXMgYSBkaXJlY3RvcnkgZm9yIGVhY2ggcG9wdWxhdGVkIHpvbmUgaW4gdGhlXFxuKyAqIG5vZGUuIE9uY2UgdGhhdCB0aGUgem9uZSBkaXJlY3RvcnkgaXMgY3JlYXRlZCwgaXQgY3JlYXRlcyBhIGRpcmVjdG9yeSBmb3JcXG4rICogZWFjaCBvcmRlciBzdXBwb3J0ZWQuXFxuKyAqXFxuKyAqIE5vdGU6IFpPTkVfREVWSUNFIHBhZ2VzIHdvbid0IGJlIGFsbG9jYXRlZCB1c2luZyB0aGlzIGRyaXZlci4gVGhlIG1haW4gcmVhc29uXFxuKyAqIGlzIGJlY2F1c2UgdGhleSBhcmUgbm90IG1hbmFnZWQgYnkgdGhlIEJ1ZGR5IEFsbG9jYXRvciBvciBDTUEgYWxsb2NhdG9yLlxcbisgKi9cXG4rc3RhdGljIGlubGluZSBpbnQgY3JlYXRlX3pvbmVzX3N1YmRpcnMoc3RydWN0IGRlbnRyeSAqbm9kZWRpciwgaW50IG5vZGVfaWR4LFxcbitcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdGEpXFxuK3tcXG4rXFx0c3RydWN0IGRlbnRyeSAqem9uZWRpcjtcXG4rXFx0c3RydWN0IHpvbmUgKnpvbmU7XFxuK1xcdHN0cnVjdCB6b25lICpub2RlX3pvbmVzID0gcGdkYXRhLVxcdTAwM2Vub2RlX3pvbmVzO1xcbitcXHRpbnQgem9uZV9pZHg7XFxuK1xcdGNoYXIgZGlybmFtZVsyNF07XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRmb3IgKHpvbmUgPSBub2RlX3pvbmVzLCB6b25lX2lkeCA9IDA7IHpvbmUgLSBub2RlX3pvbmVzIFxcdTAwM2MgTUFYX05SX1pPTkVTO1xcbitcXHQgICAgICsrem9uZSwgKyt6b25lX2lkeCkge1xcbitcXHRcXHRpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFxuK1xcdFxcdC8qIFpPTkVfREVWSUNFIHBhZ2VzIHdvbid0IGJlIGFsbG9jYXRlZCB1c2luZyB0aGlzIGRyaXZlci4gKi9cXG4rXFx0XFx0aWYgKHpvbmVfaXNfem9uZV9kZXZpY2Uoem9uZSkpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4rXFx0XFx0c25wcmludGYoZGlybmFtZSwgc2l6ZW9mKGRpcm5hbWUpLCBcXFwiem9uZS0lc1xcXCIsIHpvbmUtXFx1MDAzZW5hbWUpO1xcbitcXHRcXHR6b25lZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKGRpcm5hbWUsIG5vZGVkaXIpO1xcbitcXHRcXHRpZiAoSVNfRVJSKHpvbmVkaXIpKVxcbitcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUih6b25lZGlyKTtcXG4rXFxuK1xcdFxcdHJldCA9IGNyZWF0ZV9wYWdlX29yZGVyc19zdWJkaXJzKHpvbmVkaXIsIG5vZGVfaWR4LCB6b25lX2lkeCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0IHpvbmUpO1xcbitcXHRcXHRpZiAocmV0KVxcbitcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGNyZWF0ZV9ub2Rlc19zdWJkaXJzKCkgLSBDcmVhdGVzIGEgZGlyZWN0b3J5IGZvciBlYWNoIG9ubGluZSBub2RlIGluIHRoZVxcbisgKiBzeXN0ZW0uIE9uY2UgdGhhdCB0aGUgbm9kZSBkaXJlY3RvcnkgaXMgY3JlYXRlZCwgaXQgY3JlYXRlcyBhIGRpcmVjdG9yeSBmb3JcXG4rICogZWFjaCB6b25lIGluIHRoZSBub2RlLlxcbisgKi9cXG4rc3RhdGljIGlubGluZSBpbnQgY3JlYXRlX25vZGVzX3N1YmRpcnMoc3RydWN0IGRlbnRyeSAqbW1kaXIpXFxuK3tcXG4rXFx0c3RydWN0IGRlbnRyeSAqbm9kZWRpcjtcXG4rXFx0aW50IG5vZGVfaWR4O1xcbitcXHRjaGFyIGRpcm5hbWVbMTJdO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0Zm9yX2VhY2hfb25saW5lX25vZGUobm9kZV9pZHgpIHtcXG4rXFx0XFx0c3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdGEgPSBOT0RFX0RBVEEobm9kZV9pZHgpO1xcbitcXG4rXFx0XFx0c25wcmludGYoZGlybmFtZSwgc2l6ZW9mKGRpcm5hbWUpLCBcXFwibm9kZS0lZFxcXCIsIG5vZGVfaWR4KTtcXG4rXFx0XFx0bm9kZWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihkaXJuYW1lLCBtbWRpcik7XFxuK1xcdFxcdGlmIChJU19FUlIobm9kZWRpcikpXFxuK1xcdFxcdFxcdHJldHVybiBQVFJfRVJSKG5vZGVkaXIpO1xcbitcXG4rXFx0XFx0cmV0ID0gY3JlYXRlX3pvbmVzX3N1YmRpcnMobm9kZWRpciwgbm9kZV9pZHgsIHBnZGF0YSk7XFxuK1xcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IF9faW5pdCBwYWdlX2FsbG9jX2hvZ2dlcl9kZWJ1Z2ZzX2luaXQodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgZGVudHJ5ICpmcmVlX2ZpbGU7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRyZXFfYWxsb2NfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZShcXG4rXFx0XFx0XFxcInJlcV9hbGxvY19jYWNoZVxcXCIsIHNpemVvZihzdHJ1Y3QgcmVxX2FsbG9jKSwgMCxcXG4rXFx0XFx0U0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTtcXG4rXFx0aWYgKCFyZXFfYWxsb2NfY2FjaGUpIHtcXG4rXFx0XFx0cHJfZXJyKFxcXCJUaGUgcmVxX2FsbG9jX2NhY2hlIGNvdWxkbid0IGJlIGNyZWF0ZWRcXFwiKTtcXG4rXFx0XFx0cmV0ID0gLUVOT01FTTtcXG4rXFx0XFx0Z290byBlcnJvcl9leGl0O1xcbitcXHR9XFxuK1xcbitcXHRwYWdlX2FsbG9jX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoXFxuK1xcdFxcdFxcXCJwYWdlX2FsbG9jX2NhY2hlXFxcIiwgc2l6ZW9mKHN0cnVjdCBwYWdlX2FsbG9jKSwgMCxcXG4rXFx0XFx0U0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTtcXG4rXFx0aWYgKCFwYWdlX2FsbG9jX2NhY2hlKSB7XFxuK1xcdFxcdHByX2VycihcXFwiVGhlIHBhZ2VfYWxsb2NfY2FjaGUgY291bGRuJ3QgYmUgY3JlYXRlZFxcXCIpO1xcbitcXHRcXHRyZXQgPSAtRU5PTUVNO1xcbitcXHRcXHRnb3RvIGNsZWFuX3JlcV9hbGxvY19jYWNoZTtcXG4rXFx0fVxcbitcXG4rXFx0bW1kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoXFxcIm1tXFxcIiwgTlVMTCk7XFxuK1xcdGlmIChJU19FUlIobW1kaXIpKSB7XFxuK1xcdFxcdHByX2VycihcXFwiVW5hYmxlIHRvIGNyZWF0ZSBtbSBkaXJlY3RvcnlcXFwiKTtcXG4rXFx0XFx0cmV0ID0gUFRSX0VSUihtbWRpcik7XFxuK1xcdFxcdGdvdG8gY2xlYW5fcGFnZV9hbGxvY19jYWNoZTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gY3JlYXRlX25vZGVzX3N1YmRpcnMobW1kaXIpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRnb3RvIGNsZWFuX2RpcjtcXG4rXFxuK1xcdGZyZWVfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoXFxcImZyZWVcXFwiLCAwNjQ0LCBtbWRpciwgTlVMTCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx1MDAyNmZyZWVfcGFnZV9hbGxvY19mb3BzKTtcXG4rXFx0aWYgKElTX0VSUihmcmVlX2ZpbGUpKSB7XFxuK1xcdFxcdHJldCA9IFBUUl9FUlIoZnJlZV9maWxlKTtcXG4rXFx0XFx0Z290byBjbGVhbl9kaXI7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbitcXG4rY2xlYW5fZGlyOlxcbitcXHRkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUobW1kaXIpO1xcbitcXG4rY2xlYW5fcGFnZV9hbGxvY19jYWNoZTpcXG4rXFx0a21lbV9jYWNoZV9kZXN0cm95KHBhZ2VfYWxsb2NfY2FjaGUpO1xcbitcXG4rY2xlYW5fcmVxX2FsbG9jX2NhY2hlOlxcbitcXHRrbWVtX2NhY2hlX2Rlc3Ryb3kocmVxX2FsbG9jX2NhY2hlKTtcXG4rXFxuK2Vycm9yX2V4aXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIF9fZXhpdCBwYWdlX2FsbG9jX2hvZ2dlcl9kZWJ1Z2ZzX2V4aXQodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgcGFnZV9hbGxvYyAqcGE7XFxuK1xcdHVuc2lnbmVkIGxvbmcgaWR4O1xcbitcXG4rXFx0eGFfZm9yX2VhY2goXFx1MDAyNmFsbG9jc194YSwgaWR4LCBwYSkge1xcbitcXHRcXHRfX2ZyZWVfcGFnZXMocGEtXFx1MDAzZXBhZ2UsIHBhLVxcdTAwM2VyZXFfYWxsb2MtXFx1MDAzZW9yZGVyKTtcXG4rXFx0XFx0eGFfZXJhc2UoXFx1MDAyNmFsbG9jc194YSwgaWR4KTtcXG4rXFx0fVxcbitcXG4rXFx0ZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKG1tZGlyKTtcXG4rXFx0a21lbV9jYWNoZV9kZXN0cm95KHJlcV9hbGxvY19jYWNoZSk7XFxuK1xcdGttZW1fY2FjaGVfZGVzdHJveShwYWdlX2FsbG9jX2NhY2hlKTtcXG4rfVxcbitcXG4rbW9kdWxlX2luaXQocGFnZV9hbGxvY19ob2dnZXJfZGVidWdmc19pbml0KTtcXG4rbW9kdWxlX2V4aXQocGFnZV9hbGxvY19ob2dnZXJfZGVidWdmc19leGl0KTtcXG4rXFxuK01PRFVMRV9BVVRIT1IoXFxcIkp1YW4gWWVzY2FzXFxcIik7XFxuK01PRFVMRV9ERVNDUklQVElPTihcXFwiTW9kdWxlIHRvIGFsbG9jIHBhZ2VzIHRvIGdlbmVyYXRlIG1lbW9yeSBwcmVzc3VyZVxcXCIpO1xcbitNT0RVTEVfTElDRU5TRShcXFwiR1BMXFxcIik7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI0VDEyOjE2OjIxLjk0NDk2MTk5OFoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjIxNTEwNjkzNzIyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlBBR0VBTExPQ19IT0dHRVJcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJyZXFfcGFnZV9hbGxvY193cml0ZVwiLFxuICAgIFwiZnJlZV9wYWdlX2FsbG9jX3dyaXRlXCIsXG4gICAgXCJtYWtlX2FsbG9jXCIsXG4gICAgXCJmcmVlX2FsbG9jX2hlbHBlclwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZGVidWdmcyBpbnRlcmZhY2UgZm9yIGFsbG9jYXRpbmcgcGFnZXMgZnJvbSBzcGVjaWZpYyBub2Rlcywgem9uZXMsIG1pZ3JhdGUgdHlwZXMsIGFuZCBvcmRlcnMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIHRlc3RpbmcvZGVidWdnaW5nIHRvb2wgdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBtZW1vcnkgcHJlc3N1cmUgYW5kIHRlc3QgdGhlIGNvcmUgcGFnZSBhbGxvY2F0b3IgYW5kIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS4gRnV6emluZyBpdCBpcyB2YWx1YWJsZSB0byB1bmNvdmVyIHBvdGVudGlhbCBidWdzIGluIG1lbW9yeSBtYW5hZ2VtZW50IG9yIE9PTSBoYW5kbGluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdFxuICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LFxuICAgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA4YWI5MGI1NmY3MWJiMWQxMDcyNzc1N2I4ZjY5YzQ5MWVjODU3NmEwXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBKdWwgMjQgMTI6MTY6MTkgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9LY29uZmlnLmRlYnVnIGIvbW0vS2NvbmZpZy5kZWJ1Z1xuaW5kZXggNzYzOGQ3NWIyN2RiOGMuLmM4ZmNlY2RjYTZhY2E5IDEwMDY0NFxuLS0tIGEvbW0vS2NvbmZpZy5kZWJ1Z1xuKysrIGIvbW0vS2NvbmZpZy5kZWJ1Z1xuQEAgLTMwOSwzICszMDksMTUgQEAgY29uZmlnIFBFUl9WTUFfTE9DS19TVEFUU1xuIFx0ICBvdmVyaGVhZCBpbiB0aGUgcGFnZSBmYXVsdCBwYXRoLlxuIFxuIFx0ICBJZiBpbiBkb3VidCwgc2F5IE4uXG4rXG4rY29uZmlnIFBBR0VBTExPQ19IT0dHRVJcbitcdGJvb2wgXCJBbGxvYyBwYWdlcyBmcm9tIGRpZmZlcmVudCBub2Rlcywgem9uZXMsIG1pZ3JhdGUgdHlwZXMgYW5kIG9yZGVyc1wiXG4rXHRkZXBlbmRzIG9uIERFQlVHX0ZTXG4rXHRoZWxwXG4rXHQgIFNheSBZIHRvIGFsbG9jIHBhZ2VzIGZyb20gZGlmZmVyZW50IG5vZGVzLCB6b25lcywgbWlncmF0ZSB0eXBlIGFuZFxuK1x0ICBvcmRlcnMgdXNpbmcgdGhlIGRlYnVnIGZzIGZpbGVzeXN0ZW0uIFRoaXMgaGVscHMgdG8gZ2VuZXJhdGUgbWVtb3J5XG4rXHQgIHByZXNzdXJlIGVhc2lseS4gVGhpcyBpcyB1c2VmdWwgdG8gZGVidWcgbWVtb3J5IHJlY2xhaW1zIGlzc3VlcyxcbitcdCAgT09NIHRyaWdnZXJzLCBwYWdlIG1pZ3JhdGlvbiBpc3N1ZXMsIGV0Yy5cbitcbitcdCAgSWYgaW4gZG91YnQsIHNheSBOLlxuK1xuZGlmZiAtLWdpdCBhL21tL01ha2VmaWxlIGIvbW0vTWFrZWZpbGVcbmluZGV4IDJkMDU3MGExNmU1YmViLi5iNDhmMmFjNmVlODA4OSAxMDA2NDRcbi0tLSBhL21tL01ha2VmaWxlXG4rKysgYi9tbS9NYWtlZmlsZVxuQEAgLTEzMyw2ICsxMzMsNyBAQCBvYmotJChDT05GSUdfSURMRV9QQUdFX1RSQUNLSU5HKSArPSBwYWdlX2lkbGUub1xuIG9iai0kKENPTkZJR19ERUJVR19QQUdFQUxMT0MpICs9IGRlYnVnX3BhZ2VfYWxsb2Mub1xuIG9iai0kKENPTkZJR19ERUJVR19QQUdFX1JFRikgKz0gZGVidWdfcGFnZV9yZWYub1xuIG9iai0kKENPTkZJR19EQU1PTikgKz0gZGFtb24vXG4rb2JqLSQoQ09ORklHX1BBR0VBTExPQ19IT0dHRVIpICs9IHBhZ2VfYWxsb2NfaG9nZ2VyLm9cbiBvYmotJChDT05GSUdfSEFSREVORURfVVNFUkNPUFkpICs9IHVzZXJjb3B5Lm9cbiBvYmotJChDT05GSUdfUEVSQ1BVX1NUQVRTKSArPSBwZXJjcHUtc3RhdHMub1xuIG9iai0kKENPTkZJR19aT05FX0RFVklDRSkgKz0gbWVtcmVtYXAub1xuZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2NfaG9nZ2VyLmMgYi9tbS9wYWdlX2FsbG9jX2hvZ2dlci5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLmY1NTRiYmI0YWZhNzMwXG4tLS0gL2Rldi9udWxsXG4rKysgYi9tbS9wYWdlX2FsbG9jX2hvZ2dlci5jXG5AQCAtMCwwICsxLDYxMSBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBQYWdlIGFsbG9jYXRvciBEZWJ1Z0ZTIEludGVyZmFjZVxuKyAqIEF1dGhvcjogSnVhbiBZZXNjYXMgXHUwMDNjanllc2Nhc0Bnb29nbGUuY29tXHUwMDNlXG4rICpcbisgKiBUaGlzIG1vZHVsZSBhbGxvd3MgdG8gbWFrZSBwYWdlIGFsbG9jcyBwZXIgbm9kZSwgem9uZSwgbWlncmF0ZSB0eXBlXG4rICogYW5kIG9yZGVyIHVzaW5nIHRoZSBEZWJ1Z0ZTIGZpbGVzeXN0ZW0uXG4rICpcbisgKiBXaGVuIHRoaXMgbW9kdWxlIGlzIGluc3RhbGxlZCBhbmQgdGhlIGRlYnVnZnMgaXMgbW91bnRlZCwgdGhlIFwibW1cIiBkaXJlY3RvcnlcbisgXCIgd2lsbCBiZSBjcmVhdGVkIGluIFx1MDAzY2RlYnVnZnMgbW91bnQgcG9pbnRcdTAwM2UvbW1cIiBkaXJlY3RvcnkuIFVuZGVyIHRoaXMgZGlyZWN0b3J5LFxuKyAqIHRoZXJlIHdpbGwgYmUgc3ViZGlycyB0byBzZWxlY3QgdGhlIG5vZGVzLCB6b25lcywgb3JkZXJzIGFuZCBtaWdyYXRlIHR5cGUuXG4rICpcbisgKiBGb3IgZXhhbXBsZTpcbisgKlxuKyAqICAgICAgL3N5cy9rZXJuZWwvZGVidWcvbW0vXG4rICogICAgICB8LS0gZnJlZVxuKyAqICAgICAgYC0tIG5vZGUtMFxuKyAqICAgICAgICAgfC0tIHpvbmUtRE1BXG4rICogICAgICAgICB8ICAgfC0tIG9yZGVyLTBcbisgKiAgICAgICAgIHwgICB8ICAgfC0tIG1pZ3JhdGUtSGlnaEF0b21pY1xuKyAqICAgICAgICAgfCAgIHwgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuKyAqICAgICAgICAgfCAgIHwgICB8LS0gbWlncmF0ZS1Nb3ZhYmxlXG4rICogICAgICAgICB8ICAgfCAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXG4rICogICAgICAgICB8ICAgfCAgIHwtLSBtaWdyYXRlLVJlY2xhaW1hYmxlXG4rICogICAgICAgICB8ICAgfCAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXG4rICogICAgICAgICB8ICAgfCAgIGAtLSBtaWdyYXRlLVVubW92YWJsZVxuKyAqICAgICAgICAgfCAgIHwgICAgICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuKyAqICAgICAgICAgfCAgIHwtLSAuLi5cbisgKiAgICAgICAgIHwgICB8XG4rICogICAgICAgICB8ICAgYC0tIG9yZGVyLTlcbisgKiAgICAgICAgIHwgICAgICAgfC0tIG1pZ3JhdGUtSGlnaEF0b21pY1xuKyAqICAgICAgICAgfCAgICAgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuKyAqICAgICAgICAgfCAgICAgICB8LS0gbWlncmF0ZS1Nb3ZhYmxlXG4rICogICAgICAgICB8ICAgICAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXG4rICogICAgICAgICB8ICAgICAgIHwtLSBtaWdyYXRlLVJlY2xhaW1hYmxlXG4rICogICAgICAgICB8ICAgICAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXG4rICogICAgICAgICB8ICAgICAgIGAtLSBtaWdyYXRlLVVubW92YWJsZVxuKyAqICAgICAgICAgfCAgICAgICAgICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuKyAqICAgICAgICAgYC0tIHpvbmUtTm9ybWFsXG4rICogICAgICAgICAgICAgfC0tIG9yZGVyLTBcbisgKiAgICAgICAgICAgICB8ICAgfC0tIG1pZ3JhdGUtSGlnaEF0b21pY1xuKyAqICAgICAgICAgICAgIHwgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuKyAqICAgICAgICAgICAgIHwgICB8LS0gbWlncmF0ZS1Nb3ZhYmxlXG4rICogICAgICAgICAgICAgfCAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXG4rICogICAgICAgICAgICAgfCAgIHwtLSBtaWdyYXRlLVJlY2xhaW1hYmxlXG4rICogICAgICAgICAgICAgfCAgIHwgICBgLS0gbnJfcGFnZXNfYWxsb2NzXG4rICogICAgICAgICAgICAgfCAgIGAtLSBtaWdyYXRlLVVubW92YWJsZVxuKyAqICAgICAgICAgICAgIHwgICAgICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuKyAqICAgICAgICAgICAgIHwtLSAuLi4uXG4rICogICAgICAgICAgICAgfFxuKyAqICAgICAgICAgICAgIGAtLSBvcmRlci05XG4rICogICAgICAgICAgICAgICAgIHwtLSBtaWdyYXRlLUhpZ2hBdG9taWNcbisgKiAgICAgICAgICAgICAgICAgfCAgIGAtLSBucl9wYWdlc19hbGxvY3NcbisgKiAgICAgICAgICAgICAgICAgfC0tIG1pZ3JhdGUtTW92YWJsZVxuKyAqICAgICAgICAgICAgICAgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuKyAqICAgICAgICAgICAgICAgICB8LS0gbWlncmF0ZS1SZWNsYWltYWJsZVxuKyAqICAgICAgICAgICAgICAgICB8ICAgYC0tIG5yX3BhZ2VzX2FsbG9jc1xuKyAqICAgICAgICAgICAgICAgICBgLS0gbWlncmF0ZS1Vbm1vdmFibGVcbisgKiAgICAgICAgICAgICAgICAgICAgIGAtLSBucl9wYWdlc19hbGxvY3NcbisgKlxuKyAqIFVzYWdlOlxuKyAqXG4rICogMS4gVG8gdHJpZ2dlciB0aGUgYWxsb2NhdGlvbiwgbmF2aWdhdGUgdG8gdGhlIGRlYnVnZnMgcGF0aCBjb3JyZXNwb25kaW5nXG4rICogICAgdG8geW91ciB0YXJnZXQgbm9kZSwgbWVtb3J5IHpvbmUsIGFsbG9jYXRpb24gb3JkZXIsIGFuZCBtaWdyYXRpb24gdHlwZSxcbisgKiAgICB0aGVuIHdyaXRlIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvbiBjb3VudCB0byBucl9wYWdlc19hbGxvY3MuXG4rICpcbisgKiAgICBGb3IgZXhhbXBsZSwgdG8gbWFrZSAzIGFsbG9jcyBvZiBvcmRlciA5LCBNaWdyYXRlIFR5cGUgTW92YWJsZSxcbisgKiAgICBab25lIE5vcm1hbCBhbmQgTm9kZSAwLCBydW46XG4rICpcbisgKiAgICAkIGVjaG8gMyBcdTAwM2UgL3N5cy9rZXJuZWwvZGVidWcvbW0vbm9kZS0wL3pvbmUtTm9ybWFsL29yZGVyLTkvbWlncmF0ZS1Nb3ZhYmxlL25yX3BhZ2VzX2FsbG9jc1xuKyAqXG4rICogMi4gRm9yIGVhY2ggYWxsb2NhdGlvbiBjcmVhdGVkLCBhIGNvcnJlc3BvbmRpbmcgZmlsZSBuYW1lZCBzZXF1ZW50aWFsbHlcbisgKiAgICAoMSwgMiwgbikgd2lsbCBhcHBlYXIgaW4gdGhhdCBkaXJlY3RvcnkuXG4rICpcbisgKiAgICAkIGxzIC9zeXMva2VybmVsL2RlYnVnL21tL25vZGUtMC96b25lLU5vcm1hbC9vcmRlci05L21pZ3JhdGUtTW92YWJsZS9cbisgKiAgICAxICAgMiAgIDMgIG5yX3BhZ2VzX2FsbG9jc1xuKyAqXG4rICogMy4gVG8gZnJlZSB0aGUgYWxsb2NhdGlvbiwgd3JpdGUgdGhlIGFsbG9jYXRpb24gZmlsZSBuYW1lIGluIC9zeXMva2VybmVsL2RlYnVnL21tL2ZyZWUuXG4rICogICAgRm9yIGV4YW1wbGUsIHRvIHJlbGVhc2UgdGhlIDJuZCBhbGxvY2F0aW9uIHJ1bjpcbisgKlxuKyAqICAgICQgZWNobyAyIFx1MDAzZSAvc3lzL2tlcm5lbC9kZWJ1Zy9tbS9mcmVlXG4rICovXG4rXG4rI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSBcIjogXCIgZm10XG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYXRvbWljLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9lcnJuby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZGVidWdmcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZ2ZwLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9nZnBfdHlwZXMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2hpZ2htZW0uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbW16b25lLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L25vZGVtYXNrLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9wcmludGsuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3hhcnJheS5oXHUwMDNlXG4rXG4rc3RydWN0IGRlbnRyeSAqbW1kaXI7XG4rXG4rLyoqXG4rICogYXRvbWljX2xvbmdfdCBhbGxvY3NfZmlsZV9zZXEgLSBSZXByZXNlbnRzIHRoZSBuYW1pbmcgc2VxdWVuY2UgdXNlZCBmb3JcbisgKiBhbGxvY2F0aW9uIGZpbGVzLlxuKyAqL1xuK2F0b21pY19sb25nX3QgYWxsb2NzX2ZpbGVfc2VxID0gQVRPTUlDX0lOSVQoMCk7XG4rXG4rLyoqXG4rICogYWxsb2NzX3hhIC0gUmVwcmVzZW50IHRoZSB4YXJyYXkgdGhhdCBjb250YWlucyB0aGUgYWN0dWFsIGFsbG9jYXRpb25zIHBlcmZvcm1cbisgKiBieSB0aGlzIGRyaXZlci5cbisgKi9cbitzdGF0aWMgREVGSU5FX1hBUlJBWShhbGxvY3NfeGEpO1xuK1xuKy8qKlxuKyAqIHN0cnVjdCByZXFfYWxsb2MgLSBSZXByZXNlbnRzIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvblxuKyAqIEBub2RlX2lkeDogVGhlIE5vZGUgaW5kZXggdG8gYWxsb2NhdGUgZnJvbS5cbisgKiBAem9uZV9pZHg6IFRoZSBab25lIGluZGV4IHRvIGFsbG9jYXRlIGZyb20uXG4rICogQG9yZGVyOiBUaGUgT3JkZXIgb2YgcGFnZXMgdG8gYWxsb2NhdGUuXG4rICogQG1pZ3JhdGVfdHlwZTogVGhlIE1pZ3JhdGUgdHlwZSB0byBhbGxvY2F0ZSBmcm9tLlxuKyAqIEBwYXJlbnRkaXI6IFRoZSBwYXJlbnQgZGlyIHdoZXJlIHRoZSBmaWxlIHJlcHJlc2VudGluZyB0aGUgYWxsb2Mgd2FzIGNyZWF0ZWQuXG4rICovXG4rc3RydWN0IHJlcV9hbGxvYyB7XG4rXHRpbnQgbm9kZV9pZHg7XG4rXHRpbnQgem9uZV9pZHg7XG4rXHRpbnQgb3JkZXI7XG4rXHRpbnQgbWlncmF0ZV90eXBlO1xuK1x0c3RydWN0IGRlbnRyeSAqcGFyZW50ZGlyO1xuK307XG4rXG4rLypcbisgKiBzdHJ1Y3QgcGFnZV9hbGxvYyAtIFJlcHJlc2VudHMgdGhlIHBhZ2UgYWxsb2NhdGlvbi5cbisgKiBAcGFnZTogVGhlIHBvaW50ZXIgdG8gdGhlIHBhZ2UocykgYWxsb2NhdGVkLlxuKyAqIEByZXFfYWxsb2M6IFRoZSBkZXRhaWxzIG9mIHRoZSBhbGxvY2F0aW9uLlxuKyAqIEBhbGxvY19kZW50cnk6IFRoZSBwb2ludGVyIHRvIHRoZSBmaWxlIHRoYXQgcmVwcmVzZW50cyB0aGUgYWxsb2NhdGlvbi5cbisgKi9cbitzdHJ1Y3QgcGFnZV9hbGxvYyB7XG4rXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbitcdHN0cnVjdCByZXFfYWxsb2MgKnJlcV9hbGxvYztcbitcdHN0cnVjdCBkZW50cnkgKmFsbG9jX2RlbnRyeTtcbit9O1xuK1xuK3N0cnVjdCBrbWVtX2NhY2hlICpyZXFfYWxsb2NfY2FjaGU7XG4rc3RydWN0IGttZW1fY2FjaGUgKnBhZ2VfYWxsb2NfY2FjaGU7XG4rXG4raW5saW5lIHZvaWQgc2V0X3pvbmVfdG9fYWxsb2NfZnJvbShpbnQgem9uZV9pZHgsIGdmcF90ICpmbGFnc19wdHIpXG4re1xuK1x0c3dpdGNoICh6b25lX2lkeCkge1xuKyNpZmRlZiBDT05GSUdfWk9ORV9ETUFcbitcdGNhc2UgWk9ORV9ETUE6XG4rXHRcdCpmbGFnc19wdHIgfD0gX19HRlBfRE1BO1xuK1x0XHRicmVhaztcbisjZW5kaWZcbisjaWZkZWYgQ09ORklHX1pPTkVfRE1BMzJcbitcdGNhc2UgWk9ORV9ETUEzMjpcbitcdFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9ETUEzMjtcbitcdFx0YnJlYWs7XG4rI2VuZGlmXG4rI2lmZGVmIENPTkZJR19ISUdITUVNXG4rXHRjYXNlIFpPTkVfSElHSE1FTTpcbitcdFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9ISUdITUVNO1xuK1x0XHRicmVhaztcbisjZW5kaWZcbitcdGNhc2UgWk9ORV9NT1ZBQkxFOlxuK1x0XHQqZmxhZ3NfcHRyIHw9IF9fR0ZQX01PVkFCTEU7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBaT05FX05PUk1BTDpcbitcdGRlZmF1bHQ6XG4rXHRcdCpmbGFnc19wdHIgfD0gMDtcbitcdFx0YnJlYWs7XG4rXHR9XG4rfVxuK1xuK2lubGluZSB2b2lkIHNldF9taWdyYXRlX3R5cGVfdG9fYWxsb2NfZnJvbShpbnQgbWlncmF0ZV90eXBlLCBnZnBfdCAqZmxhZ3NfcHRyKVxuK3tcbitcdHN3aXRjaCAobWlncmF0ZV90eXBlKSB7XG4rXHRjYXNlIE1JR1JBVEVfVU5NT1ZBQkxFOlxuK1x0XHQqZmxhZ3NfcHRyIFx1MDAyNj0gfihfX0dGUF9SRUNMQUlNQUJMRSB8IF9fR0ZQX01PVkFCTEUpO1xuK1x0XHRicmVhaztcbitcdGNhc2UgTUlHUkFURV9SRUNMQUlNQUJMRTpcbitcdFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9SRUNMQUlNQUJMRTtcbitcdFx0YnJlYWs7XG4rXHRjYXNlIE1JR1JBVEVfSElHSEFUT01JQzpcbitcdFx0KmZsYWdzX3B0ciB8PSBfX0dGUF9ISUdIO1xuK1x0XHRicmVhaztcbitcdGNhc2UgTUlHUkFURV9NT1ZBQkxFOiBkZWZhdWx0OlxuK1x0XHQqZmxhZ3NfcHRyIHw9IF9fR0ZQX01PVkFCTEU7XG4rXHRcdGJyZWFrO1xuK1x0fVxuK31cbitcbitzdGF0aWMgc3NpemVfdCBwYWdlX2FsbG9jX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1YnVmLFxuK1x0XHRcdFx0ICAgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcylcbit7XG4rXHQvKiAgV2hpY2ggaW5mb3JtYXRpb24gc2hvdWxkIGJlIHByaW50IGFib3V0IHRoZSBwYWdlIG9yIGFsbG9jYXRpb24/ICovXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcGFnZV9hbGxvY19mb3BzID0ge1xuK1x0Lm93bmVyID0gVEhJU19NT0RVTEUsXG4rXHQub3BlbiA9IHNpbXBsZV9vcGVuLFxuK1x0LnJlYWQgPSBwYWdlX2FsbG9jX3JlYWQsXG4rfTtcbitcbitzdGF0aWMgaW50IG1ha2VfYWxsb2Moc3RydWN0IHJlcV9hbGxvYyAqcmVxLFxuK1x0XHRcdCAgICBnZnBfdCBmbGFncywgdW5zaWduZWQgbG9uZyAqYWxsb2NfaWQpXG4re1xuK1x0c3RydWN0IHBhZ2VfYWxsb2MgKnBhO1xuK1x0c3RydWN0IHBhZ2UgKnBhZ2U7XG4rXHRjaGFyIG5ld19hbGxvY19uYW1lWzEyXTtcbitcdHN0cnVjdCBkZW50cnkgKm5ld19hbGxvY19kZW50cnk7XG4rXHRpbnQgcmV0O1xuK1xuK1x0cGFnZSA9IGFsbG9jX3BhZ2VzX25vZGVfbm9wcm9mKHJlcS1cdTAwM2Vub2RlX2lkeCwgZmxhZ3MsIHJlcS1cdTAwM2VvcmRlcik7XG4rXHRpZiAocGFnZSkge1xuK1x0XHRwYSA9IGttZW1fY2FjaGVfYWxsb2MocGFnZV9hbGxvY19jYWNoZSwgR0ZQX0tFUk5FTCk7XG4rXHRcdGlmICghcGEpIHtcbitcdFx0XHRyZXQgPSAtRU5PTUVNO1xuK1x0XHRcdGdvdG8gZnJlZV9wYWdlcztcbitcdFx0fVxuK1xuK1x0XHQqYWxsb2NfaWQgPSBhdG9taWNfbG9uZ19pbmNfcmV0dXJuKFx1MDAyNmFsbG9jc19maWxlX3NlcSk7XG4rXHRcdHJldCA9IHhhX2luc2VydChcdTAwMjZhbGxvY3NfeGEsICphbGxvY19pZCwgcGEsIEdGUF9LRVJORUwpO1xuK1x0XHRpZiAocmV0KVxuK1x0XHRcdGdvdG8gZnJlZV9wYWdlX2FsbG9jO1xuK1xuK1x0XHRzbnByaW50ZihuZXdfYWxsb2NfbmFtZSwgc2l6ZW9mKG5ld19hbGxvY19uYW1lKSwgXCIlbHVcIixcbitcdFx0XHQgKmFsbG9jX2lkKTtcbitcbitcdFx0bmV3X2FsbG9jX2RlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoXG4rXHRcdFx0bmV3X2FsbG9jX25hbWUsIDA2NDQsIHJlcS1cdTAwM2VwYXJlbnRkaXIsXG4rXHRcdFx0cGEsIFx1MDAyNnBhZ2VfYWxsb2NfZm9wcyk7XG4rXHRcdGlmIChJU19FUlIobmV3X2FsbG9jX2RlbnRyeSkpIHtcbitcdFx0XHRyZXQgPSBQVFJfRVJSKG5ld19hbGxvY19kZW50cnkpO1xuK1x0XHRcdGdvdG8gZXJhc2VfeGFfZW50cnk7XG4rXHRcdH1cbitcbitcdFx0cGEtXHUwMDNlcmVxX2FsbG9jID0gcmVxO1xuK1x0XHRwYS1cdTAwM2VwYWdlID0gcGFnZTtcbitcdFx0cGEtXHUwMDNlYWxsb2NfZGVudHJ5ID0gbmV3X2FsbG9jX2RlbnRyeTtcbitcdH0gZWxzZSB7XG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rXG4rZXJhc2VfeGFfZW50cnk6XG4rXHR4YV9lcmFzZShcdTAwMjZhbGxvY3NfeGEsICphbGxvY19pZCk7XG4rXG4rZnJlZV9wYWdlX2FsbG9jOlxuK1x0a21lbV9jYWNoZV9mcmVlKHBhZ2VfYWxsb2NfY2FjaGUsIHBhKTtcbitcbitmcmVlX3BhZ2VzOlxuK1x0X19mcmVlX3BhZ2VzKHBhZ2UsIHBhLVx1MDAzZXJlcV9hbGxvYy1cdTAwM2VvcmRlcik7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50IGZyZWVfYWxsb2NfaGVscGVyKHVuc2lnbmVkIGxvbmcgYWxsb2NfaWQpXG4re1xuK1x0c3RydWN0IHBhZ2VfYWxsb2MgKnBhO1xuK1xuK1x0cGEgPSB4YV9lcmFzZShcdTAwMjZhbGxvY3NfeGEsIGFsbG9jX2lkKTtcbitcdGlmICghcGEpIHtcbitcdFx0cHJfZXJyKFwiVGhlIGFsbG9jX2lkICVsdSB3YXMgbm90IGZvdW5kIVwiLCBhbGxvY19pZCk7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0X19mcmVlX3BhZ2VzKHBhLVx1MDAzZXBhZ2UsIHBhLVx1MDAzZXJlcV9hbGxvYy1cdTAwM2VvcmRlcik7XG4rXHRkZWJ1Z2ZzX3JlbW92ZShwYS1cdTAwM2VhbGxvY19kZW50cnkpO1xuK1x0a21lbV9jYWNoZV9mcmVlKHBhZ2VfYWxsb2NfY2FjaGUsIHBhKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbisvKipcbisgKiByZXFfcGFnZV9hbGxvY193cml0ZSgpIC0gQWxsb2NhdGVzIHRoZSBwYWdlcyBvbiB0aGUgcmVxdWVzdGVkIG5vZGUsIHpvbmUsXG4rICogb3JkZXIgYW5kIG1pZ3JhdGUgdHlwZS4gT25jZSB0aGUgYWxsb2NhdGlvbiBpcyBwZXJmb3JtZWQsIGEgZmlsZSBpcyBjcmVhdGVkXG4rICogdG8gZnJlZSB0aGUgYWxsb2NhdGlvbiBsYXRlci5cbisgKi9cbitzdGF0aWMgc3NpemVfdCByZXFfcGFnZV9hbGxvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsXG4rXHRcdFx0XHQgICAgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcylcbit7XG4rXHRzdHJ1Y3QgcmVxX2FsbG9jICpyZXEgPSBmaWxlLVx1MDAzZXByaXZhdGVfZGF0YTtcbitcdHVuc2lnbmVkIGxvbmcgYWxsb2NfaWQ7XG4rXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzX2FsbG9jcztcbitcdHVuc2lnbmVkIGxvbmcgKmFsbG9jc19pZHM7XG4rXHRnZnBfdCBmbGFncyA9IDA7XG4rXHRpbnQgcmV0O1xuK1x0aW50IGk7XG4rXG4rXHRyZXQgPSBrc3RydG91bF9mcm9tX3VzZXIodWJ1ZiwgY250LCAxMCwgXHUwMDI2bnJfcGFnZXNfYWxsb2NzKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRhbGxvY3NfaWRzID0ga21hbGxvY19hcnJheShucl9wYWdlc19hbGxvY3MsIHNpemVvZih1bnNpZ25lZCBsb25nKSxcbitcdFx0XHRcdFx0R0ZQX0tFUk5FTCk7XG4rXHRpZiAoIWFsbG9jc19pZHMpXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0c2V0X3pvbmVfdG9fYWxsb2NfZnJvbShyZXEtXHUwMDNlem9uZV9pZHgsIFx1MDAyNmZsYWdzKTtcbitcdHNldF9taWdyYXRlX3R5cGVfdG9fYWxsb2NfZnJvbShyZXEtXHUwMDNlbWlncmF0ZV90eXBlLCBcdTAwMjZmbGFncyk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlc19hbGxvY3M7IGkrKykge1xuK1x0XHRyZXQgPSBtYWtlX2FsbG9jKHJlcSwgZmxhZ3MsIFx1MDAyNmFsbG9jX2lkKTtcbitcdFx0aWYgKHJldClcbitcdFx0XHRnb3RvIGZyZWVfYWxsb2NzO1xuK1xuK1x0XHRhbGxvY3NfaWRzW2ldID0gYWxsb2NfaWQ7XG4rXHR9XG4rXG4rXHRrZnJlZShhbGxvY3NfaWRzKTtcbitcbitcdHJldHVybiBjbnQ7XG4rXG4rZnJlZV9hbGxvY3M6XG4rXHQvKiBGcmVlIGFsbCB0aGUgcGFnZXMgcHJldmlvdXNseSBhbGxvY2F0ZWQuICovXG4rXHRmb3IgKGludCBqID0gMDsgaiBcdTAwM2MgaTsgaisrKSB7XG4rXHRcdGludCByZXQyID0gZnJlZV9hbGxvY19oZWxwZXIoYWxsb2NzX2lkc1tqXSk7XG4rXG4rXHRcdGlmIChyZXQyKVxuK1x0XHRcdHByX2VycihcIlVuYWJsZSB0byBmcmVlIHBhZ2VzIGFzc29jaWF0ZWQgd2l0aCBmaWxlICVsdVwiLFxuK1x0XHRcdCAgICAgICBhbGxvY3NfaWRzW2pdKTtcbitcdH1cbitcbitcdGtmcmVlKGFsbG9jc19pZHMpO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVxX3BhZ2VfYWxsb2NfZm9wcyA9IHtcbitcdC5vd25lciA9IFRISVNfTU9EVUxFLFxuK1x0Lm9wZW4gPSBzaW1wbGVfb3BlbixcbitcdC53cml0ZSA9IHJlcV9wYWdlX2FsbG9jX3dyaXRlLFxuK307XG4rXG4rLyoqXG4rICogZnJlZV9wYWdlX2FsbG9jX3dyaXRlKCkgLSBmcmVlIHRoZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBwYWdlcy5cbisgKiBAZmlsZTogRmlsZSB3aGVyZSB0aGUgdXNlciBpcyB3cml0aW5nLlxuKyAqIEB1YnVmOiBDb250YWlucyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0aGUgdXNlciB3YW50cyB0byBkZWxldGUgYW5kIGhhdmUgdGhlXG4rICogICAgICAgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZpbGUgZnJlZWQuXG4rICogQGNudDogU2l6ZSBvZiBAdWJ1Zi5cbisgKiBAcHBvczogQ3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZmlsZS5cbisgKi9cbitzdGF0aWMgc3NpemVfdCBmcmVlX3BhZ2VfYWxsb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsXG4rXHRcdFx0XHQgICAgICBjb25zdCBjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IGNudCxcbitcdFx0XHRcdCAgICAgIGxvZmZfdCAqcHBvcylcbit7XG4rXHRpbnQgcmV0O1xuK1x0dW5zaWduZWQgbG9uZyBhbGxvY19pZDtcbitcbitcdHJldCA9IGtzdHJ0b3VsX2Zyb21fdXNlcih1YnVmLCBjbnQsIDEwLCBcdTAwMjZhbGxvY19pZCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gZnJlZV9hbGxvY19oZWxwZXIoYWxsb2NfaWQpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldHVybiBjbnQ7XG4rfVxuK1xuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZyZWVfcGFnZV9hbGxvY19mb3BzID0ge1xuK1x0Lm93bmVyID0gVEhJU19NT0RVTEUsXG4rXHQud3JpdGUgPSBmcmVlX3BhZ2VfYWxsb2Nfd3JpdGUsXG4rfTtcbitcbisvKipcbisgKiBjcmVhdGVfbnJfcGFnZXNfYWxsb2NzX2ZpbGUoKSAtIENyZWF0ZXMgdGhlIGZpbGUgXCJucl9wYWdlc19hbGxvY3NcIi5cbisgKlxuKyAqIFRoZSBcIm5yX3BhZ2VzX2FsbG9jc1wiIGZpbGUgd2lsbCBiZSB1c2VkIHRvIHdyaXRlIHRoZSBudW1iZXIgb2YgYWxsb2NhdGlvbnNcbisgKiB0aGF0IHdpbGwgYmUgcGVyZm9ybWVkLiBXaGVuIHRoZSBhbGxvY2F0aW9ucyBhcmUgcGVyZm9ybWVkLCBhIG5ldyBmaWxlIGZvclxuKyAqIGVhY2ggYWxsb2NhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgaW4gQG1pZ3JhdGVkaXIuXG4rICovXG4rc3RhdGljIGlubGluZSBpbnQgY3JlYXRlX25yX3BhZ2VzX2FsbG9jc19maWxlKHN0cnVjdCBkZW50cnkgKm1pZ3JhdGVkaXIsXG4rXHRcdFx0XHRcdCAgICAgIGludCBub2RlX2lkeCwgaW50IHpvbmVfaWR4LFxuK1x0XHRcdFx0XHQgICAgICBpbnQgb3JkZXIsIGludCBtdHlwZSlcbit7XG4rXHRzdHJ1Y3QgcmVxX2FsbG9jICpyZXE7XG4rXHRzdHJ1Y3QgZGVudHJ5ICpucl9wYWdlcztcbitcbitcdHJlcSA9IGttZW1fY2FjaGVfYWxsb2MocmVxX2FsbG9jX2NhY2hlLCBHRlBfS0VSTkVMKTtcbitcdGlmICghcmVxKSB7XG4rXHRcdHByX2VycihcIkZhaWxlZCB0byBjcmVhdGUgbnJfcGFnZXNfYWxsb2NzX2luZm9cIik7XG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1x0fVxuK1xuK1x0cmVxLVx1MDAzZW5vZGVfaWR4ID0gbm9kZV9pZHg7XG4rXHRyZXEtXHUwMDNlem9uZV9pZHggPSB6b25lX2lkeDtcbitcdHJlcS1cdTAwM2VvcmRlciA9IG9yZGVyO1xuK1x0cmVxLVx1MDAzZW1pZ3JhdGVfdHlwZSA9IG10eXBlO1xuK1x0cmVxLVx1MDAzZXBhcmVudGRpciA9IG1pZ3JhdGVkaXI7XG4rXG4rXHRucl9wYWdlcyA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoXCJucl9wYWdlc19hbGxvY3NcIiwgMDY0NCwgbWlncmF0ZWRpciwgcmVxLFxuK1x0XHRcdFx0ICAgICAgIFx1MDAyNnJlcV9wYWdlX2FsbG9jX2ZvcHMpO1xuK1x0aWYgKElTX0VSUihucl9wYWdlcykpXG4rXHRcdHJldHVybiBQVFJfRVJSKG5yX3BhZ2VzKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbisvKipcbisgKiBjcmVhdGVfbWlncmF0ZV90eXBlX3N1YmRpcnMoKSAtIENyZWF0ZXMgYSBkaXJlY3RvcnkgZm9yIGVhY2ggbWlncmF0ZSB0eXBlXG4rICogaW5zaWRlIHRoZSBvcmRlciBkaXJlY3RvcnkuIE9uY2UgdGhlIG1pZ3JhdGUgdHlwZSBkaXJlY3RvcnkgaXMgY3JlYXRlZCwgaXRcbisgKiBjcmVhdGVzIHRoZSBcIm5yX2FsbG9jc1wiIGZpbGUgYW5kIHRoZSBcImZyZWVcIiBmaWxlLlxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgaW50IGNyZWF0ZV9taWdyYXRlX3R5cGVfc3ViZGlycyhzdHJ1Y3QgZGVudHJ5ICpvcmRlcmRpcixcbitcdFx0XHRcdFx0ICAgICAgaW50IG5vZGVfaWR4LCBpbnQgem9uZV9pZHgsXG4rXHRcdFx0XHRcdCAgICAgIGludCBvcmRlcilcbit7XG4rXHRzdHJ1Y3QgZGVudHJ5ICptaWdyYXRlZGlyO1xuK1x0Y2hhciBkaXJuYW1lWzI0XTtcbitcdGludCByZXQ7XG4rXG4rXHRmb3IgKGludCBtdHlwZSA9IDA7IG10eXBlIFx1MDAzYyBNSUdSQVRFX1RZUEVTOyBtdHlwZSsrKSB7XG4rI2lmZGVmIENPTkZJR19DTUFcbitcdFx0aWYgKG10eXBlID09IE1JR1JBVEVfQ01BKSAvKiBDTUEgYWxsb2NzIGFyZSBub3Qgc3VwcG9ydGVkIHlldCovXG4rXHRcdFx0Y29udGludWU7XG4rI2VuZGlmXG4rI2lmZGVmIENPTkZJR19NRU1PUllfSVNPTEFUSU9OXG4rXHRcdGlmIChtdHlwZSA9PSBNSUdSQVRFX0lTT0xBVEUpIC8qIGNhbid0IGFsbG9jYXRlIGZyb20gaGVyZSAqL1xuK1x0XHRcdGNvbnRpbnVlO1xuKyNlbmRpZlxuK1x0XHRzbnByaW50ZihkaXJuYW1lLCBzaXplb2YoZGlybmFtZSksIFwibWlncmF0ZS0lc1wiLFxuK1x0XHRcdCBtaWdyYXRldHlwZV9uYW1lc1ttdHlwZV0pO1xuK1x0XHRtaWdyYXRlZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKGRpcm5hbWUsIG9yZGVyZGlyKTtcbitcdFx0aWYgKElTX0VSUihtaWdyYXRlZGlyKSlcbitcdFx0XHRyZXR1cm4gUFRSX0VSUihtaWdyYXRlZGlyKTtcbitcbitcdFx0cmV0ID0gY3JlYXRlX25yX3BhZ2VzX2FsbG9jc19maWxlKG1pZ3JhdGVkaXIsIG5vZGVfaWR4LFxuK1x0XHRcdFx0XHRcdCAgem9uZV9pZHgsIG9yZGVyLCBtdHlwZSk7XG4rXHRcdGlmIChyZXQpXG4rXHRcdFx0cmV0dXJuIHJldDtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbisvKipcbisgKiBjcmVhdGVfcGFnZV9vcmRlcnNfc3ViZGlycygpIC0gQ3JlYXRlcyBhIGRpcmVjdG9yeSBmb3IgZWFjaCBwYWdlIG9yZGVyIGluc2lkZVxuKyAqIHRoZSB6b25lIGRpcmVjdG9yeS4gT25jZSB0aGF0IHRoZSBwYWdlIG9yZGVyIGRpcmVjdG9yeSBpcyBjcmVhdGVkLCBpdCBjcmVhdGVzXG4rICogYSBkaXJlY3RvcnkgZm9yIGVhY2ggbWlncmF0ZSB0eXBlLlxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgaW50IGNyZWF0ZV9wYWdlX29yZGVyc19zdWJkaXJzKHN0cnVjdCBkZW50cnkgKnpvbmVkaXIsXG4rXHRcdFx0XHRcdCAgICAgaW50IG5vZGVfaWR4LCBpbnQgem9uZV9pZHgsXG4rXHRcdFx0XHRcdCAgICAgc3RydWN0IHpvbmUgKnpvbmUpXG4re1xuK1x0c3RydWN0IGRlbnRyeSAqb3JkZXJkaXI7XG4rXHRjaGFyIGRpcm5hbWVbMTJdO1xuK1x0aW50IHJldDtcbitcbitcdGZvciAoaW50IG9yZGVyID0gMDsgb3JkZXIgXHUwMDNjIE5SX1BBR0VfT1JERVJTOyBvcmRlcisrKSB7XG4rXHRcdHNucHJpbnRmKGRpcm5hbWUsIHNpemVvZihkaXJuYW1lKSwgXCJvcmRlci0lZFwiLCBvcmRlcik7XG4rXHRcdG9yZGVyZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKGRpcm5hbWUsIHpvbmVkaXIpO1xuK1x0XHRpZiAoSVNfRVJSKG9yZGVyZGlyKSlcbitcdFx0XHRyZXR1cm4gUFRSX0VSUihvcmRlcmRpcik7XG4rXG4rXHRcdHJldCA9IGNyZWF0ZV9taWdyYXRlX3R5cGVfc3ViZGlycyhvcmRlcmRpciwgbm9kZV9pZHgsIHpvbmVfaWR4LFxuK1x0XHRcdFx0XHRcdCAgb3JkZXIpO1xuK1x0XHRpZiAocmV0KVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLyoqXG4rICogY3JlYXRlX3pvbmVzX3N1YmRpcnMoKSAtIENyZWF0ZXMgYSBkaXJlY3RvcnkgZm9yIGVhY2ggcG9wdWxhdGVkIHpvbmUgaW4gdGhlXG4rICogbm9kZS4gT25jZSB0aGF0IHRoZSB6b25lIGRpcmVjdG9yeSBpcyBjcmVhdGVkLCBpdCBjcmVhdGVzIGEgZGlyZWN0b3J5IGZvclxuKyAqIGVhY2ggb3JkZXIgc3VwcG9ydGVkLlxuKyAqXG4rICogTm90ZTogWk9ORV9ERVZJQ0UgcGFnZXMgd29uJ3QgYmUgYWxsb2NhdGVkIHVzaW5nIHRoaXMgZHJpdmVyLiBUaGUgbWFpbiByZWFzb25cbisgKiBpcyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBtYW5hZ2VkIGJ5IHRoZSBCdWRkeSBBbGxvY2F0b3Igb3IgQ01BIGFsbG9jYXRvci5cbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBjcmVhdGVfem9uZXNfc3ViZGlycyhzdHJ1Y3QgZGVudHJ5ICpub2RlZGlyLCBpbnQgbm9kZV9pZHgsXG4rXHRcdFx0XHQgICAgICAgc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdGEpXG4re1xuK1x0c3RydWN0IGRlbnRyeSAqem9uZWRpcjtcbitcdHN0cnVjdCB6b25lICp6b25lO1xuK1x0c3RydWN0IHpvbmUgKm5vZGVfem9uZXMgPSBwZ2RhdGEtXHUwMDNlbm9kZV96b25lcztcbitcdGludCB6b25lX2lkeDtcbitcdGNoYXIgZGlybmFtZVsyNF07XG4rXHRpbnQgcmV0O1xuK1xuK1x0Zm9yICh6b25lID0gbm9kZV96b25lcywgem9uZV9pZHggPSAwOyB6b25lIC0gbm9kZV96b25lcyBcdTAwM2MgTUFYX05SX1pPTkVTO1xuK1x0ICAgICArK3pvbmUsICsrem9uZV9pZHgpIHtcbitcdFx0aWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSlcbitcdFx0XHRjb250aW51ZTtcbitcbitcdFx0LyogWk9ORV9ERVZJQ0UgcGFnZXMgd29uJ3QgYmUgYWxsb2NhdGVkIHVzaW5nIHRoaXMgZHJpdmVyLiAqL1xuK1x0XHRpZiAoem9uZV9pc196b25lX2RldmljZSh6b25lKSlcbitcdFx0XHRjb250aW51ZTtcbitcbitcdFx0c25wcmludGYoZGlybmFtZSwgc2l6ZW9mKGRpcm5hbWUpLCBcInpvbmUtJXNcIiwgem9uZS1cdTAwM2VuYW1lKTtcbitcdFx0em9uZWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihkaXJuYW1lLCBub2RlZGlyKTtcbitcdFx0aWYgKElTX0VSUih6b25lZGlyKSlcbitcdFx0XHRyZXR1cm4gUFRSX0VSUih6b25lZGlyKTtcbitcbitcdFx0cmV0ID0gY3JlYXRlX3BhZ2Vfb3JkZXJzX3N1YmRpcnMoem9uZWRpciwgbm9kZV9pZHgsIHpvbmVfaWR4LFxuK1x0XHRcdFx0XHRcdCB6b25lKTtcbitcdFx0aWYgKHJldClcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qKlxuKyAqIGNyZWF0ZV9ub2Rlc19zdWJkaXJzKCkgLSBDcmVhdGVzIGEgZGlyZWN0b3J5IGZvciBlYWNoIG9ubGluZSBub2RlIGluIHRoZVxuKyAqIHN5c3RlbS4gT25jZSB0aGF0IHRoZSBub2RlIGRpcmVjdG9yeSBpcyBjcmVhdGVkLCBpdCBjcmVhdGVzIGEgZGlyZWN0b3J5IGZvclxuKyAqIGVhY2ggem9uZSBpbiB0aGUgbm9kZS5cbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBjcmVhdGVfbm9kZXNfc3ViZGlycyhzdHJ1Y3QgZGVudHJ5ICptbWRpcilcbit7XG4rXHRzdHJ1Y3QgZGVudHJ5ICpub2RlZGlyO1xuK1x0aW50IG5vZGVfaWR4O1xuK1x0Y2hhciBkaXJuYW1lWzEyXTtcbitcdGludCByZXQ7XG4rXG4rXHRmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlX2lkeCkge1xuK1x0XHRzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0YSA9IE5PREVfREFUQShub2RlX2lkeCk7XG4rXG4rXHRcdHNucHJpbnRmKGRpcm5hbWUsIHNpemVvZihkaXJuYW1lKSwgXCJub2RlLSVkXCIsIG5vZGVfaWR4KTtcbitcdFx0bm9kZWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihkaXJuYW1lLCBtbWRpcik7XG4rXHRcdGlmIChJU19FUlIobm9kZWRpcikpXG4rXHRcdFx0cmV0dXJuIFBUUl9FUlIobm9kZWRpcik7XG4rXG4rXHRcdHJldCA9IGNyZWF0ZV96b25lc19zdWJkaXJzKG5vZGVkaXIsIG5vZGVfaWR4LCBwZ2RhdGEpO1xuK1x0XHRpZiAocmV0KVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBfX2luaXQgcGFnZV9hbGxvY19ob2dnZXJfZGVidWdmc19pbml0KHZvaWQpXG4re1xuK1x0c3RydWN0IGRlbnRyeSAqZnJlZV9maWxlO1xuK1x0aW50IHJldDtcbitcbitcdHJlcV9hbGxvY19jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKFxuK1x0XHRcInJlcV9hbGxvY19jYWNoZVwiLCBzaXplb2Yoc3RydWN0IHJlcV9hbGxvYyksIDAsXG4rXHRcdFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7XG4rXHRpZiAoIXJlcV9hbGxvY19jYWNoZSkge1xuK1x0XHRwcl9lcnIoXCJUaGUgcmVxX2FsbG9jX2NhY2hlIGNvdWxkbid0IGJlIGNyZWF0ZWRcIik7XG4rXHRcdHJldCA9IC1FTk9NRU07XG4rXHRcdGdvdG8gZXJyb3JfZXhpdDtcbitcdH1cbitcbitcdHBhZ2VfYWxsb2NfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZShcbitcdFx0XCJwYWdlX2FsbG9jX2NhY2hlXCIsIHNpemVvZihzdHJ1Y3QgcGFnZV9hbGxvYyksIDAsXG4rXHRcdFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7XG4rXHRpZiAoIXBhZ2VfYWxsb2NfY2FjaGUpIHtcbitcdFx0cHJfZXJyKFwiVGhlIHBhZ2VfYWxsb2NfY2FjaGUgY291bGRuJ3QgYmUgY3JlYXRlZFwiKTtcbitcdFx0cmV0ID0gLUVOT01FTTtcbitcdFx0Z290byBjbGVhbl9yZXFfYWxsb2NfY2FjaGU7XG4rXHR9XG4rXG4rXHRtbWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihcIm1tXCIsIE5VTEwpO1xuK1x0aWYgKElTX0VSUihtbWRpcikpIHtcbitcdFx0cHJfZXJyKFwiVW5hYmxlIHRvIGNyZWF0ZSBtbSBkaXJlY3RvcnlcIik7XG4rXHRcdHJldCA9IFBUUl9FUlIobW1kaXIpO1xuK1x0XHRnb3RvIGNsZWFuX3BhZ2VfYWxsb2NfY2FjaGU7XG4rXHR9XG4rXG4rXHRyZXQgPSBjcmVhdGVfbm9kZXNfc3ViZGlycyhtbWRpcik7XG4rXHRpZiAocmV0KVxuK1x0XHRnb3RvIGNsZWFuX2RpcjtcbitcbitcdGZyZWVfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoXCJmcmVlXCIsIDA2NDQsIG1tZGlyLCBOVUxMLFxuK1x0XHRcdFx0XHRcdTAwMjZmcmVlX3BhZ2VfYWxsb2NfZm9wcyk7XG4rXHRpZiAoSVNfRVJSKGZyZWVfZmlsZSkpIHtcbitcdFx0cmV0ID0gUFRSX0VSUihmcmVlX2ZpbGUpO1xuK1x0XHRnb3RvIGNsZWFuX2RpcjtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK1xuK2NsZWFuX2RpcjpcbitcdGRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShtbWRpcik7XG4rXG4rY2xlYW5fcGFnZV9hbGxvY19jYWNoZTpcbitcdGttZW1fY2FjaGVfZGVzdHJveShwYWdlX2FsbG9jX2NhY2hlKTtcbitcbitjbGVhbl9yZXFfYWxsb2NfY2FjaGU6XG4rXHRrbWVtX2NhY2hlX2Rlc3Ryb3kocmVxX2FsbG9jX2NhY2hlKTtcbitcbitlcnJvcl9leGl0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIHZvaWQgX19leGl0IHBhZ2VfYWxsb2NfaG9nZ2VyX2RlYnVnZnNfZXhpdCh2b2lkKVxuK3tcbitcdHN0cnVjdCBwYWdlX2FsbG9jICpwYTtcbitcdHVuc2lnbmVkIGxvbmcgaWR4O1xuK1xuK1x0eGFfZm9yX2VhY2goXHUwMDI2YWxsb2NzX3hhLCBpZHgsIHBhKSB7XG4rXHRcdF9fZnJlZV9wYWdlcyhwYS1cdTAwM2VwYWdlLCBwYS1cdTAwM2VyZXFfYWxsb2MtXHUwMDNlb3JkZXIpO1xuK1x0XHR4YV9lcmFzZShcdTAwMjZhbGxvY3NfeGEsIGlkeCk7XG4rXHR9XG4rXG4rXHRkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUobW1kaXIpO1xuK1x0a21lbV9jYWNoZV9kZXN0cm95KHJlcV9hbGxvY19jYWNoZSk7XG4rXHRrbWVtX2NhY2hlX2Rlc3Ryb3kocGFnZV9hbGxvY19jYWNoZSk7XG4rfVxuK1xuK21vZHVsZV9pbml0KHBhZ2VfYWxsb2NfaG9nZ2VyX2RlYnVnZnNfaW5pdCk7XG4rbW9kdWxlX2V4aXQocGFnZV9hbGxvY19ob2dnZXJfZGVidWdmc19leGl0KTtcbitcbitNT0RVTEVfQVVUSE9SKFwiSnVhbiBZZXNjYXNcIik7XG4rTU9EVUxFX0RFU0NSSVBUSU9OKFwiTW9kdWxlIHRvIGFsbG9jIHBhZ2VzIHRvIGdlbmVyYXRlIG1lbW9yeSBwcmVzc3VyZVwiKTtcbitNT0RVTEVfTElDRU5TRShcIkdQTFwiKTtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI0VDEyOjE2OjIxLjk0NDk2Mzg5OFoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgxOTU5NjU1MjYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBcIlBhZ2UgQWxsb2MgSG9nZ2VyXCIgRGVidWdmcyBJbnRlcmZhY2UgZm9yIEZ1enppbmcqKlxuXG5Pa2F5LCBzbyB0aGVyZSdzIHRoaXMgbmV3IHBhdGNoLCBgcGFnZV9hbGxvY19ob2dnZXIuY2AsIHRoYXQgaW50cm9kdWNlcyBhIGRlYnVnZnMgaW50ZXJmYWNlLCBzcGVjaWZpY2FsbHkgdW5kZXIgYC9zeXMva2VybmVsL2RlYnVnL21tL2AuICBUaGUgZ29hbCBoZXJlIGlzIHRvIGNyZWF0ZSBhcnRpZmljaWFsIG1lbW9yeSBwcmVzc3VyZSBhbmQgdGVzdCB0aGluZ3MgbGlrZSBtZW1vcnkgcmVjbGFpbSwgdGhlIE91dC1vZi1NZW1vcnkgKE9PTSkga2lsbGVyLCBhbmQgcGFnZSBtaWdyYXRpb24uICBUaGUgaW1wb3J0YW50IHRoaW5nIGlzLCBpdCdzIGNvbmZpZ3VyYWJsZSB2aWEgYENPTkZJR19QQUdFQUxMT0NfSE9HR0VSYCBhbmQgcmVsaWVzIG9uIGBERUJVR19GU2AuXG5cbk15IGluaXRpYWwgdGhvdWdodCBpcywgaXMgdGhpcyBmdXp6YWJsZT8gIEFic29sdXRlbHkuIEl0IGdpdmVzIHVzIGEgd2F5IHRvIGFsbG9jYXRlIG1lbW9yeSB3aXRoIGEgdmFyaWV0eSBvZiBgR0ZQYCBmbGFncyBhbmQgYWxsb2NhdGlvbiBvcmRlcnMsIHdoaWNoIGNvdWxkIGJlIGEgZ29sZG1pbmUgZm9yIHRyaWdnZXJpbmcgaW50ZXJlc3RpbmcgbWVtb3J5IG1hbmFnZW1lbnQgYnVncyBvciBoaXR0aW5nIHRob3NlIGVkZ2UgY2FzZXMgdGhhdCBsZWFkIHRvIE9PTSBjb25kaXRpb25zLiAgSXQgc2VlbXMgdG8gYmUgYSBzdHJhaWdodGZvcndhcmQgaW50ZXJmYWNlIHRoYXQgZXNzZW50aWFsbHkganVzdCBjYWxscyBgYWxsb2NfcGFnZXNfbm9kZV9ub3Byb2ZgIGFuZCBgX19mcmVlX3BhZ2VzYCwgc28gaXQncyBhIHRlc3RpbmcgYW5kIGRlYnVnZ2luZyB0b29sLiBCdXQgdGhhdCdzIGV4YWN0bHkgd2h5IGZ1enppbmcgaXQgY291bGQgYmUgc28gdmFsdWFibGUsIHRlc3RpbmcgdGhlIHBhZ2UgYWxsb2NhdG9yIGFuZCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLlxuXG5Ob3csIHN5emthbGxlciwgYmVpbmcgdGhlIGZ1enppbmcgYmVoZW1vdGggdGhhdCBpdCBpcywgd2lsbCBsaWtlbHkgZ28gYWZ0ZXIgYW55IHJlYWNoYWJsZSBkZWJ1Z2ZzIGludGVyZmFjZXMuIFNvIGxldCdzIHRoaW5rOiBpcyBpdCByZWFjaGFibGU/IERlYnVnZnMgaXMgdHlwaWNhbGx5IG1vdW50ZWQsIGFuZCwgY3JpdGljYWxseSwgc3l6a2FsbGVyIHJ1bnMgYXMgcm9vdC4gQmluZ28uICBTbyBpdCdzIGRlZmluaXRlbHkgYWNjZXNzaWJsZS5cblxuTGV0J3MgcXVpY2tseSByZXZpZXcgdGhlIGNvcmUgZnVuY3Rpb25zIGluIGBwYWdlX2FsbG9jX2hvZ2dlci5jYDogYHJlcV9wYWdlX2FsbG9jX3dyaXRlYCwgYGZyZWVfcGFnZV9hbGxvY193cml0ZWAsIGBtYWtlX2FsbG9jYCwgYW5kIGBmcmVlX2FsbG9jX2hlbHBlcmAuICBTcGVjaWZpY2FsbHksIGByZXFfcGFnZV9hbGxvY193cml0ZWAgYW5kIGBmcmVlX3BhZ2VfYWxsb2Nfd3JpdGVgIHNlZW0gdG8gYmUgdGhlIHByaW1hcnkgdGFyZ2V0cywgdGhvc2UgYXJlIHRoZSBlbnRyeSBwb2ludHMuXG5cbkkgd2lsbCB1c2UgbXkgZXhpc3RpbmcgdG9vbHMgdG8gdmVyaWZ5IHRoYXQgdGhpcyBpcyBpbmRlZWQgdGhlIGNhc2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg0MjcsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozODQsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yNFQxMjoxNjozMC4xNDA5MzE1NjVaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjU0MjgwNTE2MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJQQUdFQUxMT0NfSE9HR0VSXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWcuZGVidWc9MzAwPWNvbmZpZyBQRVJfVk1BX0xPQ0tfU1RBVFNcXG4tLVxcbm1tL0tjb25maWcuZGVidWctMzEyLVxcbm1tL0tjb25maWcuZGVidWc6MzEzOmNvbmZpZyBQQUdFQUxMT0NfSE9HR0VSXFxubW0vS2NvbmZpZy5kZWJ1Zy0zMTQtXFx0Ym9vbCBcXFwiQWxsb2MgcGFnZXMgZnJvbSBkaWZmZXJlbnQgbm9kZXMsIHpvbmVzLCBtaWdyYXRlIHR5cGVzIGFuZCBvcmRlcnNcXFwiXFxuLS1cXG5tbS9NYWtlZmlsZT0xMzU9b2JqLSQoQ09ORklHX0RBTU9OKSArPSBkYW1vbi9cXG5tbS9NYWtlZmlsZToxMzY6b2JqLSQoQ09ORklHX1BBR0VBTExPQ19IT0dHRVIpICs9IHBhZ2VfYWxsb2NfaG9nZ2VyLm9cXG5tbS9NYWtlZmlsZS0xMzctb2JqLSQoQ09ORklHX0hBUkRFTkVEX1VTRVJDT1BZKSArPSB1c2VyY29weS5vXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI0VDEyOjE2OjMyLjY4Mzc0MTk3NloiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQxNDY5NjMxMzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhbmFseXNpcyBvZiB0aGUgc2l0dWF0aW9uOlxuXG4qKkludmVzdGlnYXRpbmcgdGhlIFBBR0VBTExPQ19IT0dHRVIgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIHNvIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIHN5c3RlbSBjb25maWd1cmVkIHdpdGggYFBBR0VBTExPQ19IT0dHRVJgLiBNeSBwcmltYXJ5IHRhcmdldHMgYXJlIHRoZSBmdW5jdGlvbnMgYHJlcV9wYWdlX2FsbG9jX3dyaXRlYCwgYGZyZWVfcGFnZV9hbGxvY193cml0ZWAsIGBtYWtlX2FsbG9jYCwgYW5kIGBmcmVlX2FsbG9jX2hlbHBlcmAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGlzIGNvbmZpZyBpbnRlcmFjdHMgd2l0aCB0aG9zZSBjb3JlIGFsbG9jYXRpb24gcm91dGluZXMuXG5cbkJlZm9yZSBkaXZpbmcgZGVlcCwgbGV0J3MganVzdCBtYWtlIHN1cmUgdGhlcmUgaXNuJ3Qgc29tZSBvYnZpb3VzIG90aGVyIHBsYWNlIEkgbmVlZCB0byBjb25zaWRlciAtIGxpa2UgYW4gaW5pdCBmdW5jdGlvbiBvciBhIHByZS1kZWZpbmVkIHNldCBvZiBjb25zdGFudHMuXG5cblJpZ2h0LCBsZXQgbWUganVzdCBxdWlja2x5IGdsYW5jZSBhdCBgcGFnZV9hbGxvY19yZWFkYC4gQWgsIGl0IGp1c3QgcmV0dXJucyB6ZXJvLiBUaGF0J3MgZ29vZCB0byBrbm93LCBidXQgbGlrZWx5IHdvbid0IGdpdmUgbWUgYW55IGNsdWVzLiBTbywgaXQgbG9va3MgbGlrZSBteSBhdHRlbnRpb24gc2hvdWxkIGJlIHByaW1hcmlseSBvbiBgcmVxX3BhZ2VfYWxsb2Nfd3JpdGVgIGFuZCBgbWFrZV9hbGxvY2AgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGJlaGF2aW9yIHVuZGVyIHRoaXMgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4gSSBuZWVkIHRvIGRpZyBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIHRob3NlIHR3byBmdW5jdGlvbnMuIExldCdzIHNlZSB3aGF0J3MgYWN0dWFsbHkgZ29pbmcgb24gaW4gdGhvc2UgaW1wbGVtZW50YXRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NDEyLCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMjRUMTI6MTY6MzYuODMwNzA4MjhaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NzYxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9wYWdlX2FsbG9jX2hvZ2dlci5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIxMCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAyMTA6XFx0XFx0c3RydWN0IGRlbnRyeSAqbmV3X2FsbG9jX2RlbnRyeTtcXG4gMjExOlxcdFxcdGludCByZXQ7XFxuIDIxMjpcXHRcXG4gMjEzOlxcdFxcdHBhZ2UgPSBhbGxvY19wYWdlc19ub2RlX25vcHJvZihyZXEtXFx1MDAzZW5vZGVfaWR4LCBmbGFncywgcmVxLVxcdTAwM2VvcmRlcik7XFxuIDIxNDpcXHRcXHRpZiAocGFnZSkge1xcbiAyMTU6XFx0XFx0XFx0cGEgPSBrbWVtX2NhY2hlX2FsbG9jKHBhZ2VfYWxsb2NfY2FjaGUsIEdGUF9LRVJORUwpO1xcbiAyMTY6XFx0XFx0XFx0aWYgKCFwYSkge1xcbiAyMTc6XFx0XFx0XFx0XFx0cmV0ID0gLUVOT01FTTtcXG4gMjE4OlxcdFxcdFxcdFxcdGdvdG8gZnJlZV9wYWdlcztcXG4gMjE5OlxcdFxcdFxcdH1cXG4gMjIwOlxcdFxcbiAyMjE6XFx0XFx0XFx0KmFsbG9jX2lkID0gYXRvbWljX2xvbmdfaW5jX3JldHVybihcXHUwMDI2YWxsb2NzX2ZpbGVfc2VxKTtcXG4gMjIyOlxcdFxcdFxcdHJldCA9IHhhX2luc2VydChcXHUwMDI2YWxsb2NzX3hhLCAqYWxsb2NfaWQsIHBhLCBHRlBfS0VSTkVMKTtcXG4gMjIzOlxcdFxcdFxcdGlmIChyZXQpXFxuIDIyNDpcXHRcXHRcXHRcXHRnb3RvIGZyZWVfcGFnZV9hbGxvYztcXG4gMjI1OlxcdFxcbiAyMjY6XFx0XFx0XFx0c25wcmludGYobmV3X2FsbG9jX25hbWUsIHNpemVvZihuZXdfYWxsb2NfbmFtZSksIFxcXCIlbHVcXFwiLFxcbiAyMjc6XFx0XFx0XFx0XFx0ICphbGxvY19pZCk7XFxuIDIyODpcXHRcXG4gMjI5OlxcdFxcdFxcdG5ld19hbGxvY19kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKFxcbiAyMzA6XFx0XFx0XFx0XFx0bmV3X2FsbG9jX25hbWUsIDA2NDQsIHJlcS1cXHUwMDNlcGFyZW50ZGlyLFxcbiAyMzE6XFx0XFx0XFx0XFx0cGEsIFxcdTAwMjZwYWdlX2FsbG9jX2ZvcHMpO1xcbiAyMzI6XFx0XFx0XFx0aWYgKElTX0VSUihuZXdfYWxsb2NfZGVudHJ5KSkge1xcbiAyMzM6XFx0XFx0XFx0XFx0cmV0ID0gUFRSX0VSUihuZXdfYWxsb2NfZGVudHJ5KTtcXG4gMjM0OlxcdFxcdFxcdFxcdGdvdG8gZXJhc2VfeGFfZW50cnk7XFxuIDIzNTpcXHRcXHRcXHR9XFxuIDIzNjpcXHRcXG4gMjM3OlxcdFxcdFxcdHBhLVxcdTAwM2VyZXFfYWxsb2MgPSByZXE7XFxuIDIzODpcXHRcXHRcXHRwYS1cXHUwMDNlcGFnZSA9IHBhZ2U7XFxuIDIzOTpcXHRcXHRcXHRwYS1cXHUwMDNlYWxsb2NfZGVudHJ5ID0gbmV3X2FsbG9jX2RlbnRyeTtcXG4gMjQwOlxcdFxcdH0gZWxzZSB7XFxuIDI0MTpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gMjQyOlxcdFxcdH1cXG4gMjQzOlxcdFxcbiAyNDQ6XFx0XFx0cmV0dXJuIDA7XFxuIDI0NTpcXHRcXG4gMjQ2OlxcdGVyYXNlX3hhX2VudHJ5OlxcbiAyNDc6XFx0XFx0eGFfZXJhc2UoXFx1MDAyNmFsbG9jc194YSwgKmFsbG9jX2lkKTtcXG4gMjQ4OlxcdFxcbiAyNDk6XFx0ZnJlZV9wYWdlX2FsbG9jOlxcbiAyNTA6XFx0XFx0a21lbV9jYWNoZV9mcmVlKHBhZ2VfYWxsb2NfY2FjaGUsIHBhKTtcXG4gMjUxOlxcdFxcbiAyNTI6XFx0ZnJlZV9wYWdlczpcXG4gMjUzOlxcdFxcdF9fZnJlZV9wYWdlcyhwYWdlLCBwYS1cXHUwMDNlcmVxX2FsbG9jLVxcdTAwM2VvcmRlcik7XFxuIDI1NDpcXHRcXG4gMjU1OlxcdFxcdHJldHVybiByZXQ7XFxuIDI1NjpcXHR9XFxuIDI1NzpcXHRcXG4gMjU4OlxcdHN0YXRpYyBpbnQgZnJlZV9hbGxvY19oZWxwZXIodW5zaWduZWQgbG9uZyBhbGxvY19pZClcXG4gMjU5OlxcdHtcXG4gMjYwOlxcdFxcdHN0cnVjdCBwYWdlX2FsbG9jICpwYTtcXG4gMjYxOlxcdFxcbiAyNjI6XFx0XFx0cGEgPSB4YV9lcmFzZShcXHUwMDI2YWxsb2NzX3hhLCBhbGxvY19pZCk7XFxuIDI2MzpcXHRcXHRpZiAoIXBhKSB7XFxuIDI2NDpcXHRcXHRcXHRwcl9lcnIoXFxcIlRoZSBhbGxvY19pZCAlbHUgd2FzIG5vdCBmb3VuZCFcXFwiLCBhbGxvY19pZCk7XFxuIDI2NTpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMjY2OlxcdFxcdH1cXG4gMjY3OlxcdFxcbiAyNjg6XFx0XFx0X19mcmVlX3BhZ2VzKHBhLVxcdTAwM2VwYWdlLCBwYS1cXHUwMDNlcmVxX2FsbG9jLVxcdTAwM2VvcmRlcik7XFxuIDI2OTpcXHRcXHRkZWJ1Z2ZzX3JlbW92ZShwYS1cXHUwMDNlYWxsb2NfZGVudHJ5KTtcXG4gMjcwOlxcdFxcdGttZW1fY2FjaGVfZnJlZShwYWdlX2FsbG9jX2NhY2hlLCBwYSk7XFxuIDI3MTpcXHRcXG4gMjcyOlxcdFxcdHJldHVybiAwO1xcbiAyNzM6XFx0fVxcbiAyNzQ6XFx0XFxuIDI3NTpcXHQvKipcXG4gMjc2OlxcdCAqIHJlcV9wYWdlX2FsbG9jX3dyaXRlKCkgLSBBbGxvY2F0ZXMgdGhlIHBhZ2VzIG9uIHRoZSByZXF1ZXN0ZWQgbm9kZSwgem9uZSxcXG4gMjc3OlxcdCAqIG9yZGVyIGFuZCBtaWdyYXRlIHR5cGUuIE9uY2UgdGhlIGFsbG9jYXRpb24gaXMgcGVyZm9ybWVkLCBhIGZpbGUgaXMgY3JlYXRlZFxcbiAyNzg6XFx0ICogdG8gZnJlZSB0aGUgYWxsb2NhdGlvbiBsYXRlci5cXG4gMjc5OlxcdCAqL1xcbiAyODA6XFx0c3RhdGljIHNzaXplX3QgcmVxX3BhZ2VfYWxsb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1YnVmLFxcbiAyODE6XFx0XFx0XFx0XFx0XFx0ICAgICBzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpXFxuIDI4MjpcXHR7XFxuIDI4MzpcXHRcXHRzdHJ1Y3QgcmVxX2FsbG9jICpyZXEgPSBmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxuIDI4NDpcXHRcXHR1bnNpZ25lZCBsb25nIGFsbG9jX2lkO1xcbiAyODU6XFx0XFx0dW5zaWduZWQgbG9uZyBucl9wYWdlc19hbGxvY3M7XFxuIDI4NjpcXHRcXHR1bnNpZ25lZCBsb25nICphbGxvY3NfaWRzO1xcbiAyODc6XFx0XFx0Z2ZwX3QgZmxhZ3MgPSAwO1xcbiAyODg6XFx0XFx0aW50IHJldDtcXG4gMjg5OlxcdFxcdGludCBpO1xcbiAyOTA6XFx0XFxuIDI5MTpcXHRcXHRyZXQgPSBrc3RydG91bF9mcm9tX3VzZXIodWJ1ZiwgY250LCAxMCwgXFx1MDAyNm5yX3BhZ2VzX2FsbG9jcyk7XFxuIDI5MjpcXHRcXHRpZiAocmV0KVxcbiAyOTM6XFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gMjk0OlxcdFxcbiAyOTU6XFx0XFx0YWxsb2NzX2lkcyA9IGttYWxsb2NfYXJyYXkobnJfcGFnZXNfYWxsb2NzLCBzaXplb2YodW5zaWduZWQgbG9uZyksXFxuIDI5NjpcXHRcXHRcXHRcXHRcXHRcXHRHRlBfS0VSTkVMKTtcXG4gMjk3OlxcdFxcdGlmICghYWxsb2NzX2lkcylcXG4gMjk4OlxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbiAyOTk6XFx0XFxuIDMwMDpcXHRcXHRzZXRfem9uZV90b19hbGxvY19mcm9tKHJlcS1cXHUwMDNlem9uZV9pZHgsIFxcdTAwMjZmbGFncyk7XFxuIDMwMTpcXHRcXHRzZXRfbWlncmF0ZV90eXBlX3RvX2FsbG9jX2Zyb20ocmVxLVxcdTAwM2VtaWdyYXRlX3R5cGUsIFxcdTAwMjZmbGFncyk7XFxuIDMwMjpcXHRcXG4gMzAzOlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9wYWdlc19hbGxvY3M7IGkrKykge1xcbiAzMDQ6XFx0XFx0XFx0cmV0ID0gbWFrZV9hbGxvYyhyZXEsIGZsYWdzLCBcXHUwMDI2YWxsb2NfaWQpO1xcbiAzMDU6XFx0XFx0XFx0aWYgKHJldClcXG4gMzA2OlxcdFxcdFxcdFxcdGdvdG8gZnJlZV9hbGxvY3M7XFxuIDMwNzpcXHRcXG4gMzA4OlxcdFxcdFxcdGFsbG9jc19pZHNbaV0gPSBhbGxvY19pZDtcXG4gMzA5OlxcdFxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjRUMTI6MTY6MzYuODMwNzk3NzNaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2NTM4NDkxNzQ5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIFBhZ2UgQWxsb2NhdG9yIFRlc3RpbmcgQ29kZSoqXG5cbk9rYXksIHNvIHRoZSBjb2RlIGlzIGZ1bmN0aW9uYWwg4oCTIGdvb2Qgc3RhcnQhIEl0J3MgZGVzaWduZWQgdG8gdGVzdCB0aGUgcGFnZSBhbGxvY2F0b3IsIHNwZWNpZmljYWxseSBieSBwcm92aWRpbmcgYSBkZWJ1Z2ZzIGludGVyZmFjZS4gVGhpcyBhbGxvd3MgZm9yIGNvbnRyb2xsZWQgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBvZiBwYWdlcywgd2l0aCBzcGVjaWZpYyBwYXJhbWV0ZXJzLiBIbW0sIHRoaXMgaXMgaW50ZXJlc3RpbmcuLi4gSSBjYW4gc2VlIHRoZSBpbW1lZGlhdGUgYXBwbGljYXRpb24gaGVyZTogaXQgbG9va3MgbGlrZSBpdCdkIGJlIHByZXR0eSBkYXJuIHVzZWZ1bCBmb3IgZnV6emluZyB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLiBUaGF0J3MgYSB2YWx1YWJsZSBjYXBhYmlsaXR5IHRvIGhhdmUuIEknbSBnb2luZyB0byBmbGFnIHRoaXMgYXMgc29tZXRoaW5nIFdvcnRoRnV6emluZy5cblxuSSBuZWVkIHRvIGZvY3VzIG9uIGEgZmV3IGtleSBzeW1ib2xzIGhlcmU6IGByZXFfcGFnZV9hbGxvY193cml0ZWAsIGBmcmVlX3BhZ2VfYWxsb2Nfd3JpdGVgLCBgbWFrZV9hbGxvY2AsIGFuZCBgZnJlZV9hbGxvY19oZWxwZXJgLiBUaG9zZSBhcmUgdGhlIGVudHJ5IHBvaW50cyBhbmQgY29yZSBmdW5jdGlvbnMgdGhhdCBJJ2xsIG5lZWQgdG8gdW5kZXJzdGFuZCBpbiBkZXRhaWwgdG8gZnVsbHkgbGV2ZXJhZ2UgdGhpcyBmb3IgdGVzdGluZy5cblxuQW5kIG9mIGNvdXJzZSwgSSBzaG91bGQgbWFrZSBzdXJlIHRoYXQgdGhlIGBQQUdFQUxMT0NfSE9HR0VSYCBjb25maWcgaXMgZW5hYmxlZCB0byB1c2UgdGhlIGRlYnVnZ2luZyB0b29sLlxuXG5BbHJpZ2h0LCBsZXQgbWUganVzdCBkb3VibGUtY2hlY2ssIGJlY2F1c2UgSSdtIGEgYml0IG9ic2Vzc2l2ZSBhYm91dCBiZWluZyB0aG9yb3VnaC4gQWgsIHllcywgdGhlIHBhdGNoIGlzIGEgbmV3IGZpbGUsIGBtbS9wYWdlX2FsbG9jX2hvZ2dlci5jYCwgd2hpY2ggbWFrZXMgc2Vuc2UuIEl0J3MgYWRkaW5nIHRoYXQgZGVidWdmcyBpbnRlcmZhY2UsIHdoaWNoIGNvbmZpcm1zIG15IGluaXRpYWwgaW1wcmVzc2lvbi4gVGhlIGZ1bmN0aW9uYWxpdHkgaXMgZGVmaW5pdGVseSB0aGVyZSwgYW5kIGl0J3MgcmVhY2hhYmxlIHZpYSBkZWJ1Z2ZzLlxuXG5HcmVhdC4gTG9va3MgbGlrZSBJJ3ZlIGdvdCBldmVyeXRoaW5nIEkgbmVlZC4gVGltZSB0byBzZXQtcmVzdWx0cy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTEyNTYsIk91dHB1dFRva2VucyI6MTQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTU4LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMjRUMTI6MTY6NDMuMzY5MjkxNjU5WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NjM1OTc1MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiUEFHRUFMTE9DX0hPR0dFUlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInJlcV9wYWdlX2FsbG9jX3dyaXRlXCIsXG4gICAgXCJmcmVlX3BhZ2VfYWxsb2Nfd3JpdGVcIixcbiAgICBcIm1ha2VfYWxsb2NcIixcbiAgICBcImZyZWVfYWxsb2NfaGVscGVyXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBkZWJ1Z2ZzIGludGVyZmFjZSBmb3IgYWxsb2NhdGluZyBwYWdlcyBmcm9tIHNwZWNpZmljIG5vZGVzLCB6b25lcywgbWlncmF0ZSB0eXBlcywgYW5kIG9yZGVycy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgdGVzdGluZy9kZWJ1Z2dpbmcgdG9vbCB0aGF0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIG1lbW9yeSBwcmVzc3VyZSBhbmQgdGVzdCB0aGUgY29yZSBwYWdlIGFsbG9jYXRvciBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLiBGdXp6aW5nIGl0IGlzIHZhbHVhYmxlIHRvIHVuY292ZXIgcG90ZW50aWFsIGJ1Z3MgaW4gbWVtb3J5IG1hbmFnZW1lbnQgb3IgT09NIGhhbmRsaW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlBBR0VBTExPQ19IT0dHRVJcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJyZXFfcGFnZV9hbGxvY193cml0ZVwiLFxuICAgIFwiZnJlZV9wYWdlX2FsbG9jX3dyaXRlXCIsXG4gICAgXCJtYWtlX2FsbG9jXCIsXG4gICAgXCJmcmVlX2FsbG9jX2hlbHBlclwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZGVidWdmcyBpbnRlcmZhY2UgZm9yIGFsbG9jYXRpbmcgcGFnZXMgZnJvbSBzcGVjaWZpYyBub2Rlcywgem9uZXMsIG1pZ3JhdGUgdHlwZXMsIGFuZCBvcmRlcnMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIHRlc3RpbmcvZGVidWdnaW5nIHRvb2wgdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBtZW1vcnkgcHJlc3N1cmUgYW5kIHRlc3QgdGhlIGNvcmUgcGFnZSBhbGxvY2F0b3IgYW5kIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS4gRnV6emluZyBpdCBpcyB2YWx1YWJsZSB0byB1bmNvdmVyIHBvdGVudGlhbCBidWdzIGluIG1lbW9yeSBtYW5hZ2VtZW50IG9yIE9PTSBoYW5kbGluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },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-workflowb7fjp[1] Phase: Succeeded StartedAt: 2026-07-24 12:17:13 +0000 UTC FinishedAt: 2026-07-24 12:17:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-07-24 12:17:13 +0000 UTC FinishedAt: 2026-07-24 12:17:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[2] Phase: Succeeded StartedAt: 2026-07-24 12:17:13 +0000 UTC FinishedAt: 2026-07-24 16:50:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-07-24 12:17:13 +0000 UTC FinishedAt: 2026-07-24 16:50:43 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-07-24 12:17:13 +0000 UTC FinishedAt: 2026-07-24 12:17:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-07-24 12:17:13 +0000 UTC FinishedAt: 2026-07-24 12:17:18 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowb7fjp/series-workflowb7fjp-convert-artifact-360523100/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-07-24 12:17:23 +0000 UTC FinishedAt: 2026-07-24 13:04:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-07-24 12:17:23 +0000 UTC FinishedAt: 2026-07-24 13:04:00 +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:*c3dd5731-5109-4472-a830-e55c4d918428,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-workflowb7fjp/series-workflowb7fjp-convert-artifact-360523100/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": "a5792ccc-99b0-426f-972e-04fb3efb4b4c", "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-workflowb7fjp/series-workflowb7fjp-build-action-1682921610/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-07-24 12:17:23 +0000 UTC FinishedAt: 2026-07-24 13:03:50 +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:*c3dd5731-5109-4472-a830-e55c4d918428,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-workflowb7fjp/series-workflowb7fjp-convert-artifact-360523100/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": "a5792ccc-99b0-426f-972e-04fb3efb4b4c", "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-workflowb7fjp/series-workflowb7fjp-build-action-1682921610/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-07-24 13:04:00 +0000 UTC FinishedAt: 2026-07-24 13:04:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-07-24 13:04:00 +0000 UTC FinishedAt: 2026-07-24 13:04:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-07-24 13:04:00 +0000 UTC FinishedAt: 2026-07-24 13:04:20 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-07-24 13:04:00 +0000 UTC FinishedAt: 2026-07-24 13:04:09 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowb7fjp/series-workflowb7fjp-convert-artifact-3049433755/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-07-24 13:04:20 +0000 UTC FinishedAt: 2026-07-24 13:06:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-07-24 13:04:20 +0000 UTC FinishedAt: 2026-07-24 13:06:13 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*a5792ccc-99b0-426f-972e-04fb3efb4b4c,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-workflowb7fjp/series-workflowb7fjp-build-action-1682921610/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-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-07-24 13:06:23 +0000 UTC FinishedAt: 2026-07-24 13:06:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-07-24 13:06:23 +0000 UTC FinishedAt: 2026-07-24 13:06:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-07-24 13:06:23 +0000 UTC FinishedAt: 2026-07-24 13:41:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-07-24 13:06:23 +0000 UTC FinishedAt: 2026-07-24 13:41:17 +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:*c3dd5731-5109-4472-a830-e55c4d918428,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-workflowb7fjp/series-workflowb7fjp-convert-artifact-3049433755/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": "31eeb065-a03a-4e7c-b728-bc916c4dbb55", "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-workflowb7fjp/series-workflowb7fjp-build-action-403838527/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-07-24 13:06:23 +0000 UTC FinishedAt: 2026-07-24 13:41:07 +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:*c3dd5731-5109-4472-a830-e55c4d918428,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-workflowb7fjp/series-workflowb7fjp-convert-artifact-3049433755/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": "31eeb065-a03a-4e7c-b728-bc916c4dbb55", "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-workflowb7fjp/series-workflowb7fjp-build-action-403838527/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-07-24 13:41:17 +0000 UTC FinishedAt: 2026-07-24 13:41:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-07-24 13:41:17 +0000 UTC FinishedAt: 2026-07-24 13:41:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-07-24 13:41:17 +0000 UTC FinishedAt: 2026-07-24 13:43:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-07-24 13:41:17 +0000 UTC FinishedAt: 2026-07-24 13:43:13 +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:*31eeb065-a03a-4e7c-b728-bc916c4dbb55,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-workflowb7fjp/series-workflowb7fjp-build-action-403838527/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-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-07-24 13:43:23 +0000 UTC FinishedAt: 2026-07-24 16:50:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-07-24 13:43:23 +0000 UTC FinishedAt: 2026-07-24 16:50:43 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*a5792ccc-99b0-426f-972e-04fb3efb4b4c,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*31eeb065-a03a-4e7c-b728-bc916c4dbb55,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-workflowb7fjp/series-workflowb7fjp-build-action-1682921610/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-workflowb7fjp/series-workflowb7fjp-build-action-403838527/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-07-24 13:43:23 +0000 UTC FinishedAt: 2026-07-24 13:43:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-07-24 13:43:23 +0000 UTC FinishedAt: 2026-07-24 13:43:29 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowb7fjp/series-workflowb7fjp-convert-artifact-3945057684/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-07-24 13:43:23 +0000 UTC FinishedAt: 2026-07-24 13:43:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-07-24 13:43:23 +0000 UTC FinishedAt: 2026-07-24 13:43:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-07-24 13:43:23 +0000 UTC FinishedAt: 2026-07-24 13:43:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-07-24 13:43:33 +0000 UTC FinishedAt: 2026-07-24 16:50:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb7fjp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["req_page_alloc_write","free_page_alloc_write","make_alloc","free_alloc_helper"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"86f436567f2516a0083b210bedc933544826a2c3","config_name":"upstream-apparmor-kasan.config","enable_configs":["PAGEALLOC_HOGGER"],"series_id":"40d3dcc5-980e-4f8f-b6af-10f9e0689de3","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-07-24 13:43:33 +0000 UTC FinishedAt: 2026-07-24 16:50:33 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*a5792ccc-99b0-426f-972e-04fb3efb4b4c,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*31eeb065-a03a-4e7c-b728-bc916c4dbb55,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-workflowb7fjp/series-workflowb7fjp-build-action-1682921610/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-workflowb7fjp/series-workflowb7fjp-build-action-403838527/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-workflowb7fjp/series-workflowb7fjp-convert-artifact-3945057684/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,}